객체지향 모델링
소프트웨어 모델의 역할
- 서로의 해석을 공유해 합의를 이루거나 해석의 타당성을 검토한다.
- 현재 시스템 또는 앞으로 개발할 시스템의 원하는 모습을 가시화한다.
- 시스템의 구조와 행위를 명세할 수 있으며 시스템을 구축하는 틀을 제공한다.
UML(Unified Modeling Language)
- 대표적인 소프트웨어 모델링 언어 (시스템을 모델로 표현해주는 언어)
- UML다이어그램의 종류
- 구조 다이어그램: 클래스 다이어그램, 객체 다이어그램, 복합체 구조 다이어그램, 배치 다이어그램, 컴포넌트 다이어그램, 패키지 다이어그램
- 행위 다이어그램: 활동 다이어그램, 상태 머신 다이어그램, 유즈 케이스 다이어그램, 상호작용 다이어그램(순차 다이어그램, 상호작용 개요 다이어그램, 통신 다이어그램, 타이밍 다이어그램)
클래스 다이어그램
- 시간에 따라 변하지 않는 시스템의 정적인 면을 보여주는 대표적인 UML구조 다이어그램이다.
- 시스템을 구성하는 클래스와 그들 사이의 관계를 나타낸다.
- 주요 구성 요소는 클래스와 관계이다.
클래스
- 동일한 속성과 행위를 수행하는 객체의 집합이다.
- 객체를 생성하는 설계도이다.
- 속성과 연산으로 이루어진다.
관계
- 객체지향 시스템은 여러 개의 클래스가 서로 긴밀한 관계를 맺어 기능을 수행한다.
- UML에서 제공하는 클래스들 사이의 관계는 4가지가 존재한다. (연관 관계, 일반화 관계, 집합 관계, 의존 관계, 실체화 관계)
1) 연관 관계(association)
- 클래스들이 개념상 서로 연결되었음을 나타낸다. 실선이나 화살표로 표시하며 보통은 한 클래스가 다른 클래스에서 제공하는 기능을 사용하는 상황일때 표시한다. </br>
- “교수(Porfessor 클래스)가 학생(Student)을 상담한다” 라는 사실을 위의 그림과 같이 나타낸다.
- 연관 관계에서 각 클래스 객체의 역할은 클래스 바로 옆 연관 관계를 나타내는 선 가까이 기술한다.
- 역할 이름은 연관된 클래스의 객체들이 서로를 참조할 수 있는 속성의 이름으로 활용한다.
- 위의 그림에서 Professor 객체들은 조언자(advisor 속성)의 역할을, Student 객체들을 피조언자(Student 속성)의 역할을 ‘상담한다’라는 연관 관계에서 담당한다.
다중성
양방향, 단방향 연관 관계
- 양방향 연관 관계
- 두 클래스를 연경한 선에 화살표를 사용하지 않음
- 서로의 존재를 인지
- 단방향 연관 관계
- 한쪽으로만 방향성이 있는 관계
- 한 쪽은 알지만 다른 쪽은 상대방의 존재를 모른다는 의미
- 단방향 연관 관계에 의해 자동차는 자신의 소유주를 알 수가 없다.
연관 클래스
- 연관 관계에 추가할 속성이나 행위가 있을 때 사용
2) 일반화 관계(generalization)
- 객체지향 개념에서는 상속 관계라고 한다. 한 클래스가 다른 클래스를 포함하는 상위 개념일때의 관계이며 속이 빈 화살표를 사용해 표시한다.
- “is a kind of” 관계이다.
- 세탁기 is a kind of 가전 제품
- TV is a kind of 가전 제품
- 식기 섹처기 is a kind of 가전 제품
3) 집합 관계(Composition, aggregation)
- 클래스들 사이의 전체 또는 부분 같은 관계를 나타낸다. 집약 관계와 합성 관계가 존재한다.
- 집약(aggregation)
- 전체를 나타내는 객체와 부분을 나타태는 개체의 라이프 타임이 독립적
- 부분을 나타내는 객체를 다른 객체와 공유 가능
- 빈 마름모로 표시
- Computer와 그의 부품인 MaiBoard, CPU, Memory, PowerSupply의 라이프 사이클은 독립적
- 합성(Composition)
- 전체를 나타내는 객체에 부분을 나타내는 개체의 라이프 타임이 종속적
- 전체 객체가 사라지면 부분 객체도 사라짐
- 채워짐 마름모로 표시
- Computer와 그의 부품인 MaiBoard, CPU, Memory, PowerSupply의 라이프 사이클은 의존적
4) 의존 관계(dependency)
- 연관 관계와 비슷하게 한 클래스가 다른 클래스에서 제공하는 기능을 사용할 때를 나타낸다.
- 연관관계와 의존 관계의 차이점은 다음과 같다.
- 연관 관계: 객체끼리 긴 시간 관계를 맺음(멤버 변수로 참조하여 계속 사용하는 경우)
- 의존 관계: 객체끼리 짧은 시간 관계를 맺음(function의 인자로 받거나 지역 객체로 일시적으로 사용하는 경우)
- 예제
1
자동차를 소유한 사람이 자동차를 이용하여 출퇴근 한다고 할 때 한 번 출퇴하고 난 후 다음 날에 출퇴근할 때에도 어제 사용한 자동차를 타고 출근하지 매번 출근할 때마다 다른 자동차를 사용하는 경우는 없을 것이다. 이 같이 오랫동안 관계를 지속하는 것은 연관관계로 표현된다. 그러나 보통 자동차에 주유할 때 특정 주유소에 있는 특정 주유기만 고집하여 주유하지는 않는다. 이 같이 주유 서비스를 받을 때마다 달라지는 주유기 같은 것을 의존 관계로 표현한다.
- 연산의 인자나 메소드의 지역 개체로 참조(찰나적 관계)
5) 실체화 관계(realization)
- 책임들의 집합인 인터페이스와 이 책임들을 실제로 실현한 클래스들 사이의 관계를 나타낸다. 상속과 유사하게 빈 삼각형을 사용하며 머리에 있는 실선 대신 점선을 사용해 표시한다.
- “can do this”의 관계이다.
- 인터페이스란 책임이다 (ex. 리모콘의 책임은 가전 기기를 켜거나 끄거나 볼륨을 높이거나 낮춘다)
- 인터페이스란 어떤 공통되는 능력이 있는 것들을 대표하는 관점이다.
출처
- Java객체지향 디자인패턴(한빛미디어)