요소
클래스 다이어그램에서 클래스는 이름, 속성(변수), 메소드 순으로 나열한다.
속성과 메소드는 생략이 가능하다 이름은 반드시 입력해야 한다.
기호
기호 | 의미 | 설명 |
+ | public | 어떤 클래스의 객체에서든 접근 가능 |
- | private | 이 클래스에서 생성된 객체들만 접근 |
~ | default (package) | 동일 패키지에 있는 클래스의 객체들만 접근 가능 |
# | protected | 이 클래스의 동일 패키지에 있거나 상속 관계에 있는 하위 클래스의 객체들만 접근 가능 |
밑줄 | static | |
{readonly} | final | |
[*] or [0...1] | 리스트와 같은 변수에 지정된 사이즈를 의미 List의 경우 사이즈가 정해지지 않아서 [*]로 표기 Optional의 경우 0개거나 1개여서 [0...1]로 표기 Array의 경우 사이즈가 미리 지정된다면 [n]으로 표기 가능 |
이러한 의미는 속성과 메소드 모두에 사용하여 표기가 가능하다.
속성(변수)를 보면 접근 제어자, 필드명, 타입 순으로 작성한다.
- {접근제어자} {필드명}: {타입}
메소드는 접근제어자, 메소드명(파라미터 타입), 반환 타입 순으로 작성한다.
- {접근제어자} {메소드명}({파라미터타입}): {반환타입}
스테레오 타입
인터페이스나 추상 클래스와 같은 요소를 표기하기 위해 << >> 와 같은 문법을 사용하는데 이를 길러멧(guillemet)이라 부른다.
길러멧은 보통 인터페이스, enum, 추상 클래스 등에서 사용되지만 사용자의 확장 클래스를 의미하는데에도 사용할 수 있다.
인터페이스 vs 추상클래스
인터페이스는 모든 메소드가 추상 메소드인 경우이고 추상클래스는 클래스 내 '추상 메소드'가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다.
인터페이스와 추상클래스 모두 상속받은 클래스 혹은 구현하는 인터페이스 안에 있는 추상메소드를 구현하도록 강제한다.
한마디로 인터페이스와 추상클래스는 결국 추상 메소드를 구현하는 것을 의미한다.
그렇다면 왜 ? 인터페이스와 추상클래스는 나누어져 있을까 ?
추상클래스는 그 추상클래스를 상속받아서 기능을 이용하고, 확장시키는 데 있다.
반면에 인터페이스는 함수의 껍데기만 있는데, 그 이유는 그 함수의 구현을 강제하기 위해서이다.
구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있다.
추상 클래스 표현 방법
이탤릭체(기울어진 글씨)로 표시하거나 클래스 명에 {abstract}을 붙이거나 길러멧으로 표시하는 방법이 있다.
클래스 간 관계
Association (연관 관계)
- 다른 객체의 참조를 가지고 있을 때 사용한다.
- 방향이 있는 실선(Directed Association)과 방향이 없는 실선(Association) 두가지로 나타낼 수 있다.
- Association
- 실선 하나로 클래스를 연결
- 방향이 없으므로 User 가 Phone 을 참조할 수도, Phone 이 User 를 참조할 수도, 둘 다일 수도 있다.
- Directed Association
- 클래스를 실선으로 연결 후 끝에 화살표를 추가
- User 에서 Phone 으로 화살표가 향하고 있으므로 User 가 Phone 을 참조하는 것을 의미한다.
- 화살표 옆의 -phones 는 roleName(역할명)을 나타내고 어떤 역할로 참조되는지를 의미한다.
- * 은 개수를 나타내는데 대상 클래스에 가질 수 있는 인스턴스 개수 범위를 뜻한다. (즉, User는 Phone을 0 ~ n개 가질 수 있음)
- 1 : 1개
- * : 0~n개
- n...m : n부터 m까지 연관관계를 맺음
Inheritance (상속 관계)
- 부모 클래스와 자식 클래스 간의 상속 관계(is a kind of)를 나타낼 때 사용한다.
- 한 클래스가 다른 클래스를 포함하는 상위 개념일 때 두 클래스 사이에는 일반화 관계가 존재한다.
- 부모 클래스는 자식 클래스의 공통 속성이나 연산을 제공하는 틀이다.
- 상속은 부모 클래스의 필드 및 메소드를 구체화해 사용하며 필드 및 메소드를 추가하거나 필요에 따라 메소드를 재정의하여(overriding) 사용한다.
- 부모 클래스가 추상 클래스인 경우는 추상 메소드를 반드시 오버라이딩 해야 한다.
Realization (실체화)
인터페이스를 상속하여 클래스에서 실제 기능으로 구현하는 것을 의미한다.
Dependency (의존 관계)
클래스간 참조 관계를 나타낼 때 사용한다.
Dependency는 Destination Element의 변경이 source element의 변경을 요구(유발)할 때 사용하는 관계이다.
A 클래스에서 어떤 변경이 일어나면 B 클래스가 영향을 받음을 나타낼 때 사용한다.
Dependency 관계와 Association 관계는 종종 혼동되는 경우가 많은데 이 둘의 차이를 알아보자
Association : Data Model 관점에서의 연관 관계
Dependency : Class Model 관점에서의 연관 관계
호출되는 시점의 차이
- Association : Class가 Instance화 되는 시점에 필요한 연관 관계
- Dependency : Instance가 생성된 이후 Method Call에 의해서 필요한 연관 관계
Aggregation (집합 관계)
- Shared Aggregation이라고도 하며 Composition(Composite Aggregation)과 함께 Association 관계를 조금 더 특수하게 나타낸 것으로 whole(전체)와 part(부분)의 관계를 나타낸다.
- Association은 집합이라는 의미를 내포하고 있지 않지만 Aggregation은 집합이라는 의미를 가지고 있다.
- A 클래스가 B 를 소유한다거나 부모라는 것을 의미하는 것이 아니라 A 클래스와 B 클래스의 인스턴스가 서로 독립적이지 않다는 것을 강조하기 위한 관계이다.
- 예를 들어 위의 그림에서 Engine과 Wheel은 Car와 집합 관계이지만 Car가 없어진다고 해서 Engine과 Wheel이 삭제된다고 보지 않는다.
Composition (합성 관계)
- 만약 둘 사이에 강력한 의존관계가 성립해 하나가 삭제됐을 때 다른 하나가 존재할 수 없을 때 합성 관계가 성립한다.
- 합성은 포함 관계로 설명되기도 한다. 예를 들어 방은 집에 포함되어있다(belongs-to)고 얘기할 수 있고, 집은 방을 가지고 있다(has-a)고 얘기할 수 있다.
연관 vs 집합 vs 합성 관계 비교
- 집합 관계와 합성 관계는 연관 관계의 하위 집합이므로 연관의 특정 사례이다.
- 집합 관계는 자식이 부모와 독립적으로 존재할 수 있는 관계를 의미한다.
- ex) 학급(부모) 와 학생(자녀) 관계에서 수업을 삭제해도 학생은 여전히 존재한다.
- 구성은 자식이 부모로부터 독립하여 존재할 수 없는 관계를 의미한다.
- ex) 집(부모) 및 방(자식)의 관계에서 방은 집과 별도로 존재하지 않는다.
참고
'Certificate > TOPCIT' 카테고리의 다른 글
[TOPCIT] UML 연습하기 - ER Diagram (0) | 2023.10.18 |
---|
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!