UML : Class Diagram
[UML]
Unified Modeling Language : 통합 모델링 언어
여기서 모델링이란 소프트웨어를 실제로 만들기 전에 미리 검증하는 것입니다.
이는 개발 프로세스중 설계 단계에서 진행하며 의사소통 논의, 전체 구조 및 클래스 의존 파악, 유지보수 문서 생성을 위해 사용합니다.
[클래스 다이어그램(Class Diagram)]
UML은 크게 개념, 명세, 구현의 목적에 따라 다르게 사용됩니다.
- 개념 : 문제 도메인의 구조를 나타내며 도메인 안에 있는 개념을 기술하기 위한 것.
- 명세, 구현 : 소프트웨어의 설계 혹은 완성된 소프트웨어의 구현 설명을 목적으로 작성되며, 소스코드와 관계가 깊습니다.
이제부터 다룰 클래스 다이어그램은 명세, 구현 차원에서 사용되며 실제 소스코드를 토대로 작성됩니다.
클래스 다이어그램은 각 클래스의 구조와 관계를 표현하는 설계도라고 보면 되겠습니다.
[클래스 다이어그램의 요소]
클래스는 보통 이름, 속성, 기능 3개의 구역으로 나뉩니다.
- 이름 : 클래스의 이름이 들어갑니다.
- 속성 : 클래스에 소속된 변수의 이름, 접근 지정자, 자료형이 포함됩니다.
(접근지정자는 private = '-', public = '+', protedted = '#', pakage = '~' 로 표기합니다.)
- 기능 : 클래스에 소속된 메서드의 이름, 매개변수, 접근지정자, 리턴 타입이 포함됩니다.
모든 속성과 기능이 기술될 필요는 없으며 다이어그램을 그리는 목적에 필요한 것만 기술하는 것이 좋습니다.
[스테레오 타입(Stereo Type)]
UML에서 제공하는 추가적인 확장 요소를 나타냅니다.
길러멧(guillemet, 《 》)사이에 스테레오 타입의 특성을 정의하며, 공식적인 문서라면 이 기호를 구분해서 사용하는 것이 좋습니다.
스테레오 타입으로 주로 사용되는 것은 《interface》, 《utility》, 《abstract》, 《enumeration》 등이 있습니다.
그 외에 Java에서 final 키워드는 {readOnly}를 사용해서 표기합니다.
[클래스간 관계]
클래스 다이어그램의 주 목적은 클래스간 관계와 의존 관계를 쉽게 파악하기 위함입니다.
따라서, 클래스 다이어그램에서 가장 중요한 것은 클래스간의 관계 표시입니다.
일반화(Generalization) 관계
슈퍼크래스와 서브클래스 간의 상속 관계를 나타냅니다.
일반화란 서브 클래스가 주체가 되어 서브클래스를 슈퍼 클래스로 generalize 하는 것을 말합니다.
서브클래스를 구현한 후 삼각형 화살표를 가진 실선으로 슈퍼클래스와 연결합니다.
서브클래스에서 슈퍼클래스의 메소드를 오버라이드해서 재정의 해야 합니다.
실체화(Realization) 관계
인터페이스는 그림과 같이 원형으로 표기하고 이름을 명시합니다. 인터페이스와 클래스 사이는 화살표가 없는 실선으로 연결합니다.
혹은 스테레오 타입으로 인터페이스를 표현한 경우 삼각형 화살표를 가진 점선으로 관계를 표기합니다.
의존(Dependency) 관계
일반적으로 가장 많이 사용하는 관계이며, 어떤 클래스가 다른 클래스를 참조(사용)하는 것을 나타냅니다.
참조의 형태는 대상 클래스의 객체 사용, 메서드 호출, 객체 리턴, 매개변수로 사용 등이 있으며 해당 객체의 참조를 계속 유지하지는 않습니다.
또한, 의존 관계는 참조되는 클래스의 변화가 참조하는 클래스에도 변화를 준다는 것을 의미합니다.
추가적으로 의존 목적이 중요할 경우, 스테레오 타입으로 어떤 목적의 의존인지를 명시할 수도 있습니다.
화살표를 가진 점선으로 관계를 표현합니다.
연관(Association) 관계, 방항성 있는 연관(Directed Association) 관계
다른 객체의 참조를 가지는 필드를 의미합니다.
참조를 갖는다는 의미는 해당 클래스에서 다른 클래스의 객체를 생성하여 사용한다는 것입니다.
화살표의 방향은 참조하는 방향을 나타냅니다. 화살표가 향하는 쪽이 참조 당하는 객체입니다. 반면 방향이 없다면 참조의 방향이 결정되지 않거나 둘 다 서로 참조한다는 것을 의미합니다.
화살표를 가진 실선으로 관계를 표현합니다.
*의존 관계 vs 연관 관계
- 두 관계 모두 다른클래스의 참조를 한다는 점에서 유사하게 보일 수 있습니다. 또한, 의존 관계에서 클래스의 변화가 참조 하는 클래스에도 변화를 준다고 했는데, 이는 연관 객체에서 또한 그럴 수 있다고 생각합니다.
- 하지만, 두 관계의 차이점은 명백히 존재하며 차이점이 있기 때문에 둘을 구분해서 사용합니다.
- 일단 둘의 관계를 살펴보면 연관 관계는 의존 관계에 속한다고 할 수 있습니다. 이는 의존 없이 연관이 있을 수 없다고 생각하면 편하지만, 의존 관계의 정의가 '참조를 한다'라는 더욱 포괄적인 의미이기 때문입니다.
- 또한 관계의 정도 관점에서 보면 의존 관계는 일시적이고 약한데 비해 연관 관계는 지속적이고 강한 관계입니다. 참조하는 클래스에서 다른 클래스의 객체를 생성한다는 것은 강한 관계를 의미하고 이는 연관 관계입니다.
- 반면에, 의존 관계는 클래스의 메서드 호출, 매개변수 등에서 사용하기 때문에 메모리 관점에서 보면 클래스를 일시적으로 사용하는 개념입니다.
[참고 자료]
- UML 클래스 다이어그램과 소스코드 매핑 : http://www.nextree.co.kr/p6753/
- UML에서 association과 dependency에 관해서 : https://kldp.org/node/133709