# Class Diagram

> 다이어그램
>
> * **Class Diagram**
> * Use Case Diagram
> * Sequence Diagram

## 클래스 다이어그램

### 정의

시스템의 정적인 면을 표현하기 위해 주로 사용되는 UML 구조 다이어그램

클래스, 클래스 간 관계를 보여준다.

### 표현 예시

*   객체명

    ![객체명](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-8996790c91c252c04b494ef0da39cfda698ba018%2Fclass-diagram-\(0\).png?alt=media)
*   객체명 + 필드

    ![객체명+필드](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-04deabca23e4be792a85c5cbf0972d5870711022%2Fclass-diagram-\(1\).png?alt=media)
*   객체명 + 메서드

    ![객체명+메서드](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-26deda5db12878c0b26dfa72a0de60f0814e755e%2Fclass-diagram-\(2\).png?alt=media)
*   객체명 + 필드 + 메서드

    ![객체명+필드+메서드](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-b125aa9411d0e0612b48d8c9bbc16ef7b86a3ff4%2Fclass-diagram-\(3\).png?alt=media)

### 용도에 따른 표현 예시

*   분석 단계: 타입(자료형), 가시화 정보(접근 제어자) 생략

    ![분석단계](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-24bd5c662fa9dca72065dc4a80df4d240bb173fb%2Fclass-diagram-\(4\).png?alt=media)
*   설계 단계: 타입(자료형), 가시화 정보(접근 제어자) 포함

    ![설계단계](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-41620ca53b08798c4b9174b147891143f477ac1e%2Fclass-diagram-\(5\).png?alt=media)

### 클래스 간 관계 표현법

1. **연관 (Association)** - 한 클래스가 다른 클래스를 `사용`
2. **일반화 (Generalization)** - 상속 관계
3.  **집합**

    3-1. **집약 (Aggregation)** - 포함 관계를 가지지만 독립적 라이프타임을 가짐

    3-2. **합성 (Composition)** - 포함 관계를 가지며 의존적 라이프타임을 가짐
4. **의존 (Dependency)** - 한 클래스가 다른 클래스를 `인자로 받아 사용`
5. **실체화 (Realization)** - 인터페이스의 구현

## 연관 (Association)

### 방향성

클래스 간 연관 관계는 양방향이거나 단방향이다.

양방향은 `선(—)`, 단방향은 `화살표(→)`로 표기한다.

*   양방향

    ![양방향](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-52aa6efd0733f6d3efa7fe97cf1de26ee9f3b93d%2Fclass-diagram-\(6\).png?alt=media)
*   단방향

    ![단방향](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-4feb1fd84feed7bf431325be85fe83b12cf85742%2Fclass-diagram-\(7\).png?alt=media)

    단방향인 경우 A→B이면 A만 B를 참조하고 B는 A에 대해 알지 못함을 뜻한다.

### 다중성

클래스 간 연간 관계는 일대일, 일대다, 다대다 관계를 갖는다.

*   일대일 (1:1)

    ![1:1](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-5c64bb8e62259ff45647e75e0b778d10ef06d353%2Fclass-diagram-\(8\).png?alt=media)
*   일대다 (1:N)

    ![1:N](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-59c4aa1f36bd9f37caaf6d3fe7d05c9fdd21c27d%2Fclass-diagram-\(9\).png?alt=media)
*   다대다 (N:M)

    ![N:M](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-b731fca8ad5bc07bd41dfb428ba7bdc6a8e4c1cd%2Fclass-diagram-\(10\).png?alt=media)

    다대다는 연관 클래스를 만들어 두 개의 일대다 관계로 만들 수 있다.

    ![N:M(2)](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-9f20477167edb0b41b0b8aaf98c359c920762d48%2Fclass-diagram-\(11\).png?alt=media)

### 재귀

*   클래스가 재귀적으로 연관되나 사이클이 발생하지는 않는다.

    ![재귀](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-0885c0652aacdbd3024e2b51d1e6442f99c705f5%2Fclass-diagram-\(12\).png?alt=media)
* 리눅스의 파일 계층 구조가 이에 해당한다.

## 일반화 (Generalization)

### 정의

공통된 특징을 묶어 추상클래스 또는 인터페이스로 정의한 뒤 상속 또는 구현을 이용하는 것

`속이 빈 실선 화살표`로 표기한다.

### 예시

*   가전제품에는 다양한 제품이 포함되고, 해당 제품 또한 세부적인 카테고리를 가질 수 있다.

    ![Generalization](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-026fd29b9226e4c820c8a46834468c17600cd8c3%2Fclass-diagram-\(13\).png?alt=media)

## 집합 (Aggregation, Composition)

### 정의

* 한 객체가 다른 하나를 포함
* 각 객체의 라이프타임의 독립 의존 여부에 따라 집약, 합성으로 나뉜다.
* 집합은 연관(Association)의 특수한 경우에 해당한다. 즉, 연관에 포함된다.

### 집약 (Aggregation)

* 전체 객체와 부분 객체의 라이프타임이 독립적인 포함 구조
* 전체 객체가 사라져도 부분 객체는 유효하여 사라지지 않는다.
* 부분 객체를 여러 전체 객체가 공유할 수 있다.
* 구현 단계에서는 부분 객체를 별도로 생성하고 파라미터로 받는다.
*   `빈 마름모`로 표기한다.

    ![Aggregation](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-d592adf81f8806b4d3a55075e7a666ca342213fb%2Fclass-diagram-\(14\).png?alt=media)

### 합성 (Composition)

* 전체 객체와 부분 객체의 라이프타임이 의존적인 포함 구조
* 전체 객체가 사라지면 부분 객체는 불유효해져 사라진다.
* 부분 객체를 여러 전체 객체가 공유할 수 없다.
* 구현 단계에서는 부분 객체를 전체 객체 내부의 필드로 생성한다.
*   `꽉 찬 마름모`로 표기한다.

    ![Composition](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-e4607ca062053a030c89a999d62a5d0b108a5073%2Fclass-diagram-\(15\).png?alt=media)

## 의존 (Dependency)

### 정의

클래스가 다른 클래스를 사용하는 세 가지 방법이 있다.

1. 클래스의 필드로 참조 할당
2. 연산의 인자(parameter)로 사용
3. 메서드 내부의 지역 객체

여기서 1번이 연관, 2번이 의존, 3번이 합성에 해당한다.

`점선 화살표`로 표기한다.

### 예시

*   누군가 출근하면서 자동차를 타고 주유소를 이용한다고 하면, 다음과 같은 클래스 다이어그램을 그릴 수 있다.

    ![Dependency](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-efaa09440c89001704cc9adeaad6348a90cc5396%2Fclass-diagram-\(16\).png?alt=media)

    * 사람은 자동차를 이용하되, 항상 같은 차를 이용한다. 자동차를 바꾸는 일은 거의 없다.
    * 자동차는 주유할 때 특정 주유기만을 고집하지 않는다. 매번 다른 주유기를 이용할 수 있다.
    * 따라서 사람은 자동차를 필드로 소유하고(사용), 자동차는 주유소에 의존한다.

## 실체화 (Realization)

### 정의

어떤 객체들의 공통되는 능력, 특징 들을 모아 인터페이스-구현 구조를 형성

### 예시

*   비행기와 새는 날 수 있다는 공통점이 있다. 이를 추상화하고 구현하면 다음과 같다.

    ![Realization](https://235099754-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjSdpT0wKyoj1ArTYdVC6%2Fuploads%2Fgit-blob-238a59253e4a2c612efa8c9df671645da1ac3d4b%2Fclass-diagram-\(17\).png?alt=media)
