UML
UML은 Unified Modeling Language의 약자이고, 시스템을 시각화 하거나 시스템의 사양이나 설계를 문서화하기 위한 표현 방법입니다.
보통 이런식의 형태로 구성 되어 있는 것이 UML 입니다.
디자인 패턴을 다룰 때 주로 UML이 자주 등장하기 때문에 디자인 패턴에 대해 다루기전에 UML을 먼저 짚고 넘어가기 위해 UML과 관련된 글을 먼저 쓰게 되었습니다.
UML이 워낙 방대하다 보니 일부분만 다뤄볼 생각입니다. UML에 대해 더 자세히 알고 싶으신 분은 아래의 링크 에 접속하시면 됩니다.
클래스 다이어그램
클래스 다이어그램은 클래스나 인스턴스, 인터페이스 등의 정적인 관계를 표현한 것입니다. 간혹 이름이 클래스 다이어그램이라 해서 클래스만 다루는 것으로 생각하시는 분이 계시는데 꼭 클래스만 등장 하는 것은 아니에요.
예를 하나 들어보죠.
abstract class Parent {
int filedA;
static char fieldB;
abstact void methodA();
double methodeB() {
// ...
}
}
위와 같은 부모 클래스인 Parent 클래스가 있다고 가정하고
그 자식 클래스로
class Child exctends Parent
void methodA() {
// ...
}
static void methodC() {
// ...
}
}
위와 같이 있다고 가정해봅시다.
그 때 위 코드와 대응 하는 클래스 다이어 그램은 아래와 같게 되는데요.
위 그림에서 보시는 바와 같이 Parent와 Child의 관계를 표시하고 있는데요. Parent와 Child 사이에 있는 화살표는 클래스의 계층관계를 표시하는 화살표인데 하위 클래스인 Child 클래스에서 상위 클래스인 Parnet 클래스로 항햐여 표시하고 있죠.
참고로 이 화살표는 Extends 화살표로 불립니다.
각각의 클래스는 직사각형으로 표현하는데
이 순서대로 적으시면 됩니다. 그 외에도 추상 클래스(Abstract Class)의 이름은 이탤릭체(Italics)를 사용하는데요.
Parent 클래스는 추상 클래스여서 이탤릭체(기울여진 글꼴)로 되어 있죠.
static 필드의 이름에는 밑줄을 사용하고, static 메소드의 이름에는 밑줄을 사용합니다. 그래서 field2와 Child 클래스의 methodC는 밑줄이 쳐져 있죠.
abstract 메소드는 이탤릭체를 사용합니다. 그래서 Parent 클래스의 methodA는 기울어진 글꼴로 되어 있죠.
아래의 그림도 클래스 다이어그램의 예인데요. 이번에는 인터페이스와 구현 클래스를 표현 하는 방법에 대해 알아볼거에요.
Drwingable이라는 인터페이스가 있고, DrawingClass라는 클래스가 Drwingable 인터페이스를 구현 하는 것으로 나타내고 있습니다.
그리고 그 사이 화살표는 구현 클래스인 Drwingable에서 인터페이스인 DrawingClass로 관계를 나타내고 있는 것을 볼 수 있습니다.
참고로 이 화살표는 Implements화살표 라고 부릅니다.
코드로 표현하자면 아래와 같이 돼죠.
interface Drawingable {
abstract void print();
abstract void newPage();
}
class DrawingClass implements Drawingable {
void print() {
// ...
}
void newPage() {
// ...
}
}
UML에서 Java의 인터페이스를 표현하는 경우에는 <<interface>>라고 써요.
이번에는 또 다른 예를 들어 볼게요. 이번에는 집약 관계를 나타내는 방법에 대해 알아보도록 할거에요.
class Color {
// ...
]
class Car {
Color color;
// ...
}
class Owner {
Car[] cars;
// ...
}
이 다이어그램에서는 Color, Car, Owner라는 세 클래스의 관계를 보여주고 있는데요.
Owner 클래스의 cars 필드는 Car 클래스의 배열로 되어 있고, Owner의 인터페이스는 Car 클래스의 인스턴스 여러개를 가지게 됩니다.
그리고 Car 클래스의 color 필드는 Color 클래스형으로 되어 있고, Car 클래스의 인스턴스는 Color 클래스의 인스턴스 한 개를 가지게 됩니다.
정리하자면 오너가 차가 몇 대인가 들어있고, 차는 각각의 색을 가지고 있는 관계가 됩니다.
위와 같이 갖고 있는 관계를 집약(Aggregation)이라고 합니다. 인스턴스를 갖고 있다면 개수와 상관없이 그 관계는 집약으로 됩니다.
그래서 배열을 사용해도, Vetor 클래스를 사용해도, 어떤 구현이든지 인스턴스를 갖고 있으면 그 관계는 집약입니다.
그래서 위 선 중 ◇이 붙은 선은 집약을 나타냅니다. 마름모 모양의 접시가 담겨 있다 생각하면 쉽게 이해 되실 겁니다.
이번에는 메소드나 필드의 액세스 제어와 관련된 예시인데요.
class SomeClass {
private char privateFiled;
public double publicField;
protected char protectedFiled;
int packageField;
private void privateMethod(){
}
public void publicMethod(){
}
protected void protectedMethod(){
}
void packageMethod(){
}
}
위와 같이 UML에서 액세스 제어를 표현 할 때 메소드나 필드이름 앞에 기호를 붙이면 됩니다.
- + 기호 : public인 메소드나 필드를 나타냅니다.
- - 기호 : private인 메소드나 필드를 나타냅니다.
- # 기호 : protect인 메소드나 필드를 나타냅니다.
- ~ 기호 : 동일한 패키지 내에서만 엑세스 할 수 있는 메소드나 필드를 나타냅니다.
클래스의 관계를 나타내기 위해 관련된 이름에 ▶ 표시를 붙여주시면 됩니다.
UML 다이어그램 중에 시퀸스 다이어그램이 있습니다.
시퀸스 다이어그램(Sequence Diagram)은 프로그램이 작동할 때 어떤 메소드가 어떤 순서로 실행되는가, 어떤 추상 클래스가 어떤 순서로 실행되는가를 표현 한 것인데요.
클래스 다이어그램과 시퀸스 다이어그램의 차이는
클래스 다이어그램 - 시간에 의해 변하지 않는 것을 나타낸다.
시퀸스 다이어그램 - 시간에 따라 변하는 것을 나타낸다.
의 차이가 있습니다.
다시 말하면 클래스 다이어그램은 정적인 관계를 나타내고, 시퀸스 다이어그램은 동적인 관계를 나타냅니다.
위 그림은 시퀸스 다이어그램의 예시를 가져온 것입니다.
세 개의 인스턴스가 등장하고 있고, 인스턴스는 각 다이어그램의 위쪽에 있는 직사각형에 대응하는 모습을 보여줍니다.
직사각형 안에는 :WA, :API Server, :DB와 같이 :뒤에 클래스 명을 표기하고 있습니다. 표기에 따라 :뒤에 클래스명만 표기할 때도 있고, :뒤에 클래스명을 표기하고 밑줄을 긋거나, 밑줄만 긋는 경우가 있습니다.
이것들은 각 클래스의 인스턴스를 표시하고 있는 것이고, 각각 인스턴스에 이름이 필요할 경우엔 wa:WA와 같이 콜론 앞에 이름을 적어주면 됩니다.
각각의 인스턴스에서 아래 방향으로 뻗어있는 점선을 라이프 라인이라고 합니다.
흐름의 순서는 아래 방향으로 흐르며, 위쪽은 과거, 아래쪽은 미래입니다. 라이프 라인은 인스턴스가 존재하는 동안에만 존재합니다.
그리고 위와같이 라이프 라인 중간에 긴 직사각형은 활성박스라고 부르는데 오브젝트가 활동 중인 것을 나타냅니다.
이 부분을 보게 되면 가로 방향으로 화살표가 그려져 있는데 이 화살표는 메소드의 호출을 표시합니다.
그리고 이 화살표는 메서드에서의 리턴을 표시하고 있습니다.
이렇게 여러 개의 인스턴스 간의 행동을 도식화 할 수 있는데요. 시퀸스 다이어 그램은 라이프 라인을 따라가면서 위에서부터 순서대로 읽어주시면 됩니다. 그리고 화살표가 있으면 그것을 따라가면서 인스턴스간의 협조 동작을 확인해 가면 됩니다.
참고 : Java 언어로 배우는 디자인 패턴 입문
'프로그래밍(Basic) > 디자인 패턴(Java)' 카테고리의 다른 글
[바미] Singleton 패턴에 대해 알아봅시다. (0) | 2021.09.23 |
---|---|
[바미] Factory Method에 대해 알아봅시다. (0) | 2021.09.21 |
[바미] 템플릿 메소드(Template Method) 패턴에 대해 알아봅시다. (0) | 2021.09.15 |
[바미] Adapter 패턴에 대해 알아봅시다. (0) | 2021.08.24 |
[바미] Iterator패턴에 대해 알아봅시다. (0) | 2021.08.17 |