디자인패턴 공부하다가 프로그램 설계를 표현하는 것을 보고 공부해보고자한다.
UML(Unified Modeling Language)
시스템을 모델로 표현해주는 대표적인 모델링 언어
UML은 소프트웨어를 설계하며 필요에 의해서 사용되는데 일반적으로 아래 3가지의 목적을 가지고 만듭니다.
- 의사소통 또는 설계 논의를 위해
- 전체 시스템의 구조 및 클래스의 의존성 파악을 위해
- 유지보수를 위한 설계의 back-end 문서 제작을 위해
클래스 다이어그램
정적 다이어그램으로 클래스의 구성요소 및 클래스 간의 관계를 표하는 대표적인 UML이다.
이를 통해 시슽템의 일부 또는 전체의 구조를 나타낼 수 있다.
클래스 다이어그램을 이용하면 의존관계를 명확하게 보여주며, 순환 의존이 발생하는 지점을 찾아내서 어떻게 이 순환고리를 깰 수 있을지 결정할 수 있게 해준다.
클래스 다이어그램의 용도 2가지
1. 문제 해결을 위한 도메인 구조를 나타내어 보이지 않는
도메인 안의 개념과 같은 추상적인 개념을 기술하기 위해 나타낸 것
2. 소프트웨어의 설계 혹은 완성된 소프트웨어의 구현 설명을 목적으로 사용
UML에서의 클래스표현
- 가장 윗부분 : 클래스이름
- 중간부분 : 속성(클래스의 특징)
- 마지막 부분 : 메소드(클래스가 수행하는 책임)
속성과 메소드에는 접근제어자가 붙는데 UML에서는 아래와 같이 표시된다.
분석단계 / 설계단계의 클래스 예시
클래스 다이어그램을 이용한 관계표현
클래스간의 연관관계는 위 7가지로 나타낼 수 있다.
Generalization (일반화)
객체지향에서의 상속관계("is a kind of" 관계)을 의미하며 한 클래스가 다른 클래스를 포함하는
상위 개념일 때 두 클래스 사이에는 일반화 관계가 존재한다.
Realization (실체화)
UML에서의 인터페이스 표현
클래스에 사용하는 사각형을 그대로 사용하고 인터페이스 이름 위에 스테레오 타입으로 interface 표시(«interface»)
인터페이스 관계 : 빈삼각형과 점선사용
Dependency (의존)
Dependency는 클래스간의 참조가 일어나는 것 중 하나이며 Dependency 참조는 메서드 내에서 대상 클래스의 객체를 생성하거나 사용, 리턴받아 사용하는 것을 말한다. 그리고 이 참조는 해당 클래스와의 관계를 계속 유지하지 않는다. (Dependency는 메소드의 호출이 끝나면 연관되 클래스와의 관계가 마무리된다.)
이해가 안된다면 아래 코드를 보자.
public class Board {
private String title;
public String getTitleWithRanking(Ranking ranking) {
return title + ranking.getRank();
}
}
public class Ranking {
private int rank;
public int getRank() {
return rank;
}
}
Association & Direct Association (연관)
클래스 다이어그램에서의 Association은 다른 객체의 참조를 가지는 필드를 의미한다.
한 클래스가 다른 클래스와 연관 관계 를 가지면 각 클래스의 객체는 해당 연관 관계에서 어떤 역할을 수행하게 된다.
- 두 클래스 사이의 연관 관계가 명확한 경우에는 연관 관계 이름을 사용하지 않아도 된다.
- 역할 이름 은 실제 프로그램을 구현할 때 연관된 클래스의 객체들이
서로를 참조할 수 있는 속성의 이름으로 활용할 수 있다.
- 연관 관계는 방향성을 가질 수 있다. 양방향은 실선으로, 단방향은 화살표로 표시한다.
- 화살표(단방향 연관 관계)
- 한쪽은 알지만 다른 쪽은 상대방의 존재를 모르는 상태
- 실선(양방향 연관 관계)
- 두 클래스의 객체들이 서로의 존재를 인식하는 상태
연관클래스
연관클래스는 연관관계에 추가할 속성이나 행위가 있을 때 사용되며
연관 클래스를 일반 클래스로 변환되며, 연관관계가 있는 두 클래스 사이에 위치하며 점선을 사용해 연결한다.
이 연관 클래스를 일반클래스로 변환하여 다대다에서 일대다 연관 관계로 변환한다.
다중성 표시방법
선에 아무런 표시가 없다면 일대일 관계이다.
Aggregation (집합) & Composition (합성)
UML 연관 관계의 특별 경우로 전체와 부분의 관계 를 명확하게 명시하고자할 때 사용한다.
집약관계(Aggregation)
한 객체가 다른 객체를 포함하는 것으로 '부분'을 나타내는 객체를 다른 객체와 공유할 수 있다.
'전체'를 가르키는 클래스 방향에 빈 마름모로 표시한다.
전체 객체의 라이프타임과 부분 개체의 라이프타임은 독립적으로 전체 객체가 메모리에서 사라진다해도
부분객체는 사라지지 않는다.
ex)
public class Computer {
private MainBoard mb;
private CPU c;
// 생성자
public Computer(MainBoard mb, CPU c) {
this.mb = mb;
this.c = c;
}
}
합성관계(composition)
부분객체가 전체 객체에 속하는관계로 '부분'을 나타내는 객체를 다른객체와 공유할 수 없다.
‘전체’를 가리키는 클래스 방향에 채워진 마름모로 표시한다.
전체 객체의 라이프타임과 부분 객체의 라이프 타임은 의존적이며 전체 객체가 없어지면 부분 객체도 없어진다.
ex)
public class Computer {
private MainBoard mb;
private CPU c;
// 생성자
public Computer() {
this.mb = new MainBoard();
this.c = new CPU();
}
}
참고
'언어 > JAVA' 카테고리의 다른 글
strategy pattern (0) | 2022.01.22 |
---|---|
Adapter Pattern (0) | 2022.01.21 |
다이아몬드 상속 문제(다중상속의 문제점) (0) | 2022.01.19 |
디자인패턴 (0) | 2022.01.15 |
OOP의 4대 특성 및 5대 원칙 (0) | 2022.01.14 |