JAVA 객체지향 디자인 패턴<UML과 GoF 디자인 패턴 핵심 10가지로 배우는> 정리
UML에서 제공하는 클래스들 사이의 관계
1. 연관 관계
가령 "교수 (Professor 클래스)가 학생 (Student 클래스)을 상담한다."라는 사실은 밑의 그림처럼 나타낸다.
-
한 클래스가 다른 클래스와 연관 관계를 가지면 각 클래스의 객체는 해당 연관 관계에서 어떤 역할을 수행하게 된다.
-
두 클래스 사이의 연관 관계가 명확한 경우에는 연관 관계 이름을 사용하지 않아도 된다.
-
역할 이름은 실제 프로그램을 구현할 때 연관된 클래스의 객체들이 서로를 참조할 수 있는 속성의 이름으로 활용할 수 있다.
-
연관 관계는 방향성을 가질 수 있다. 양방향은 실선, 단방향은 화살표로 표시한다.
화살표
-
단방향 연관 관계
-
한 쪽은 알지만 다른 쪽은 상대방의 존재를 모른다.
-
사람(Person 객체)은 자신이 갖고 있는 핸드폰(Phone 객체)에 대해 알지만 핸드폰은 자신의 소유자의 존재를 모른다.
실선
-
양방향 연관 관계
-
두 클래스의 객제들이 서로의 존재를 인식한다.
- 일반적으로 다대다 연관 관계는 양방향 연관 관계로 표현되는 것이 적절하다.
- 하지만 다대다 연관 관계는 자연스럽게 양방향 연관 관계가 되므로 구현하기가 복잡하다. 따라서 보통 다대다 연관 관계를 일대다 단방향 연관 관계로 변환해 구현한다. -> 연관 클래스
연관 클래스
- 연관 관계에 추가할 속성이나 행위가 있을 때 사용
- Student클래스와 Course클래스의 연관 관계에서 성적 정보는 어디에 두어야 할까?
보통 Student클래스나 Course클래스에 두어야 하지 않을까 고민을 할 것이다. 그러나 두 클래스 어디에도 둘수가 없다. 성적은 Student와 Course 두 클래스 객체가 존재해야만 의미 있는 정보가 되기 때문이다.
예를 들어 '홍길동 학생이 A+'라는 말은 어색하다. 어떠 과목에서 A+를 받았다는 정보가 누락되었기 때문이다.
마찬가지로 소프트웨어 공학이 A+라는 말도 어색하다. "홍길동 학생이 소프트웨어 공학 A+를 받았다"라고 할 때만 의미가 통한다. 이처럼 성적 정보는 Student와 Course라는 두 클래스의 객체가 존재해야만 가치가 있다.
-
연관 클래스를 일반 클래스로 변환
-
연관 클래스는 연관 관계가 있는 두 클래스 사이에 위치하며, 점선을 사용해 연결한다.
-
이 연관 클래스를 일반 클래스로 변환하여 다대다에서 일대다 연관 관계로 변환한다.
- 다중성 표시 방법
- 선에 아무런 숫자가 없으면 일대다 관계
재귀적 연관 관계
-
동일한 클래스에 속한 객체들 사이의 관계.
-
예를 들어 직원이라는 클래스가 있다면 직원 들중에는 각각의 사원과 관리자가 있을 것이다.
관리자 한 명이 여러 명의 사원들을 관리하거나 역으로 어떤 사원은 관리자가 없을 수도 있다(사장일 것이다.)
그리고 만약 '홍길동'이 '홍길서'를 관리하고 '홍길서'가 '홍길남'을 관리한다면 '홍길서'는 사원과 관리자 두 클래스에 동시에 속하는 모순이 발생한다. 이러한 것을 해결하기 위해 나타낸 것이 재귀적 연관 관계이다. -
그리고 또 하나의 문제점은 만약 위의 상황에서 '홍길남'이 '홍길동'을 관리한다면 어떻게 될까?
이를 '관계의 루프'라고 하는데 이러한 상황을 배제하려면 다음의 그림처럼 연관 관계에 제약을 설정해야 한다.
- 제약은 '{ }' 안에 미리 정해진 제약뿐만 아니라 어떤 문장도 자유럽게 쓸 수 있으며 클래스나 연관 관계를 포함한
UML 모델 요소가 따라야 하는 규칙을 붙여줄 때 사용한다. 이 예에서는 '{계층}'이라는 제약을 설정하여 객체 사이에 상하 관계가 존재하고 사이클이 존재하지 않는다는 의미다.