나를 기록하다
article thumbnail
반응형

JAVA 언어로 배우는 디자인 패턴 입문(출처: yes24)

UML

Unified Modeling Language의 줄임말, 시스템을 시각화하거나 사양 및 설계를 문서화하기 위한 표현 방법

디자인 패턴에 등장하는 클래스나 인스턴스의 관계를 나타내기 위해 UML을 이용한다.

UML의 속성(attribute)은 Java의 필드(field), UML의 조작(operation)은 Java의 메서드(method)이다.

 

클래스 다이어그램

UML의 클래스 다이어그램
클래스나 인스턴스, 인터페이스 등의 정적인 관계를 나타낸 것

 

클래스와 계층 관계

abstract class ParentClass {
    int field1;
    static char field2;
    abstract void methodA();
    double methodB() {
    	// ...
    }
}

class ChildClass extends ParentClass {
    void methodA() {
    	// ...
    }
    static void methodC() {
    	// ...
    }
}

클래스 간의 관계

Parent 클래스는 Child 클래스의 상위(기저, 부모) 클래스, Child 클래스는 ParentClass의 하위(파생, 자식, 확장) 클래스이다.

추상 클래스와 추상 메서드는는 기울임꼴, static 필드와 static 메서드는 밑줄을 긋는다.

화살표의 방향은 하위 클래스로부터 상위 클래스를 향해서 화살표가 뻗어 있다.

 

인터페이스와 구현

interface Printable {
    abstract void print();
    abstract void newPage();
}

class PrintClass implements Printable {
    void print() {
        // ...
    }
    void newPage() {
        // ...
    }
}

인터페이스와 구현 클래스를 나타낸 클래스 다이어그램

구현 클래스에서 인터페이스 방향으로의 화살표 방향(implements 화살표)

 

집약(aggregation)

class Color {
    // ...
}

class Fruit {
    // ...
}

class Basket {
    // ...
}

집약 관계(갖고 있는 관계)

인스턴스를 가지고 있으면, 개수에 관계없이 그 관계는 집약이다. 마름모꼴 기호가 붙은 선은 집약을 나타낸다.

 

액세스 제어

class Something {
    private int privateField;
    protected int protectedField;
    public int publicField;
    int packageField;
    private void privateMethod() {
    }
    protected void protectedMethod() {
    }
    public void publicMethod() {
    }
    void packageMethod() {
    }
}

엑세스 제어를 명시한 클래스 다이어그램

+: public인 메서드 또는 필드, 어디에서든 엑세스 가능

-: private인 메서드 또는 필드, 클래스 외부에서 엑세스할 수 없음

#: protected인 메서드 또는 필드, 같은 클래스, 하위 클래스 및 같은 패키지 내의 클래스에서만 엑세스 가능

~: 같은 패키지 내에서만 엑세스할 수 있는 메서드 또는 필드

 

클래스의 관계

클래스의 관계에 ►를 붙여 표기

 

시퀀스 다이어그램

프로그램이 작동할 때 어떤 메서드가 어떤 순서로 실행되는지, 어떤 사건이 어떤 순서로 실행되는지를 표현

클래스 다이어그램은 '시간에 따라 변하지 않는 것(정적인 관계)'을 나타내고,

시퀀스 다이어그램은 '시간에 따라 변하는 것(동적인 관계)'을 나타낸다.

class Client {
    Server server;
    void work() {
        server.open();
        server.print("Hello");
        server.close();
    }
    // ...
    
}

class Server {
    Device device;
    void open() {
        // ...
    }
    void print(String s) {
        device.write(s);
        // ...
    }
    void close() {
        // ...
    }
    // ...
}

class Device {
    void write(String s) {
        // ...
    }
}

시퀀스 다이어그램(메서드 호출)

인스턴스에 이름이 필용할 때 server:Server처럼 콜론 앞에 이름을 적는다.

각 인스턴스에서 아래 방향으로 뻗은 파선을 라이프 라인(생명선)이라 하고 라이프 라인은 인스턴스가 생존하는 동안만 존재한다(시간은 아래 방향으로 흐른다).

가늘고 긴 직사각형은 객체가 활동 중임을 나타낸다.

open 화살표에서 시작된 server의 길쭉한 직사각형 하단에서 다시 client 쪽으로 파선 화살표(<----)가 뻗어 있다. 이 화살표는 open 메서드에서의 리턴(반환)을 나타낸다. 이 다이어그램은 모든 메서드의 리턴을 그렸지만 생략하는 경우도 있다. 제어 client가 되돌아왔으므로 server 인스턴스가 활동 중인 사각형은 일단 종료된다.

 

 

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...