클래스 다이어그램에 표시되는 관계에 대한 정리
객체지향 언어를 사용하여 소프트웨어를 작성할 때는 객체지향적 설계가 필요하다. 이때 사용하는 설계 수단이 UML 인데 UML은 말하는 사람마다 책마다 그 의미를 조금씩 다르게 설명하고 있거나 상세하게 설명하지 못하고 모호하게 설명하고 있기 때문에 실제 사용하는 사람들도 의미를 다르게 해석하고 사용하고 있는 것이 사실이다.
그만큼 UML 명세는 사용자에게 상세한 사용법을 제시하지 못하고 있고 모호한 부분이 많아서 논란이 되고 있는 부분에서는 각자 나름대로 해석하여 사용하고 있는 실정이다. UML2.0 이 발표될 때는 이러한 논란이 표출되어 UML에서 정의한 클래스간의 관계 중에서 Aggregation 이라는 관계가 제외되었다가 항의를 받고 다시 포함되었다고 한다. 이러한 논란은 현재에도 계속되고 있지만 이 분야에서 사용되는 공통적인 의미를 파악하고 그 범위 내에서 벗어나지 않도록 UML을 사용하면 그로 인하여 개발자 간의 의사소통이 원할해지고 객체지향적 설계에 도움이 될 것이다.
클래스 다이어그램에서 사용되는 관계의 종류 및 관련표식
다음 내용은 권위 있는 단체의 사이트나 개인의 블로그를 참조하여 파악한 클래스간의 관계에 대한 정의를 정리한 것이다.
Association, Aggregation, Composition은 형식적 면으로 보면 'HAS-A' 관계에 속하기 때문에 한 클래스의 멤버로 다른 클래스의 참조를 가지고 있다는 점에서는 공통적인 모습을 보이지만 기능적인 면에서 서로 관련되어 있는 정도에 따라 차이가 있다.
Association(연관)
- 'HAS-A' Relationship
- 한개의 클래스가 다른 클래스의 참조변수를 멤버로 선언한 경우
- 서로 독립적인 기능을 가지고 있는 객체끼리 상호연락이 필요하여 다른 클래스의 참조변수를 가진 경우
- 기능적인 면에서 보면 서로 종속적이지 않고 독립적이며 단지 협조를 위해 참조변수가 필요할 뿐이다
- 서로 상대방의 참조를 가질 수도 있고 한쪽에서만 참조를 가질 수도 있다.
- 생성, 소멸 시기가 서로 다르며 Life Cycle 도 다르다
- 양방향 관계가 성립할 수도 있다 (A -> B, B -> A)
- 어떤 회사(A)의 직원들에게 음식을 제공하는 식료품 회사(B), A와 B는 독립적이며 B는 다른 회사(C)에 음식을 제공할 수 있음
Aggregation(집합연관)
- 'Whole-Part' Relationship
- 특별한 형태의 Association
- 한 클래스 기능의 일부를 한개 이상의 다른 클래스에서 분담하여 수행함.
- UML 초안에서는 aggregation-by-value 라고 불리었다
- Whole 클래스에는 Part 클래스 인스턴스의 생성과 소멸에 대해서 정의하지 않음
- 'Whole' 클래스의 인스턴스가 소멸하더라도 포함된 Part 인스턴스는 독자적인 Life Time을 가질 수 있다
- Whole -> Part 단방향 관계만 존재함
- Whole 과 Part 는 소멸시기가 동일하지 않으며 수명을 서로 달리함.
public class Person
{
private Costume currentClothes; // 구성하는 객체의 생성과 소멸이 정의되지 않음
public void setClothes(Costume clothes)
{
currentClothes = clothes;
}
//...
}
Composition(합성연관)
- 'Whole-Part' Relationship
- Aggregation 보다 더 강한 결합
- 특별한 형태의 Aggregation
- 한 클래스의 기능의 일부를 다른 클래스에서 분담하여 수행함.
- aggregation-by-reference 개념으로 생각됨
- Whole 클래스에는 Part 클래스 인스턴스의 생성과 소멸이 정의됨
- Part 클래스는 Whole 클래스에만 포함되어 있고 다른 클래스에는 포함되어 있지 않다.
- Whole 클래스의 오브젝트 없이는 Part 클래스의 오브젝트도 존재할 수 없다.
- Whole -> Part 단방향 관계만 존재함
- Whole 이 소멸하면 Part 도 소멸하며 수명을 같이함
public class Person
{
private final Name name;
public Person (String fName, String lName)
{
name = new Name(fName, lName); // 구성하는 객체의 생성과 소멸이 정의됨
}
//...
}
http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit
Association | Aggregation | Composition | |
Owner | No owner | Single owner | Single owner |
Life time | Have their own lifetime | Have their own lifetime | Owner's life time |
Child object | Child objects all are independent | Child objects belong to a single parent | Child objects belong to a single parent |
Dependency(의존)
- 클래스 간의 관계 중에서 가장 약한 관계에 속하며 한 클래스의 메소드 파라미터나 지역변수로 다른 클래스의 참조가 사용되는 경우이다
Generalization(일반화)
- 상속관계 (extends)
Realization(실제화)
- 구현 (implements)
클래스 다이어그램의 예