디자인 패턴 공부를 위한 기본 클래스 다이어그램 개념 및 작성법 공부 중 .. 완전히 내 것으로 만들기 !


UML(Unified Modeling Language)

시스템을 시각화하거나 요구 사항 명세서 또는 설계를 문서화하기 위한 표현 방법으로 클래스나 인터페이스의 관계를 표현하기 위해 사용

클래스 다이어그램

클래스나 인스턴스, 인터페이스 등 간의 정적인 관계를 표현

image1
각각의 클래스는 직사각형으로 표현하며 클래스 간의 관계에 따라 이어지는 선의 모양이 결정된다.

상속(extends) 관계

/* 상위 클래스 (부모 클래스) */
abstract class ParentClass{
  int field1;
  static char field2;
  abstract void methodA();
  double methodB(){
    // ...
  }

/* 하위 클래스 (자식 클래스, 파생 클래스)*/
  class childClass extends ParentClass{
    void methodA(){
      // ...
    }
    static void methodC(){
      // ...
    }
  }
}

image2
상속 관계는 두 클래스 간의 관계를 화살표가 붙은 실선으로 표현한다. 이 때, 화살표는 하위 클래스에서 상위 클래스로 향한다. 추상클래스인 PrentClass 클래스와 추상메소드인 methodA의 이름은 이탤릭체로 표현하며 정적 변수인 field2와 정적 메소드인 methodC 의 이름에는 밑줄을 추가한다.

  • 추상 클래스(abstract class) : 추상 메소드를 하나 이상 가지고 있는 클래스
  • 추상 메소드(abstract method) : 구현 부분이 없는 메소드로 자식 클래스가 구현
  • 정적 필드(static field) : 객체가 아니라 클래스에 포함된 변수로 객체마다 하나씩 생성되지 않음
  • 정적 메소드(static method) : 객체가 아니라 클래스에 포함된 메소드로 정적 메소드나 정적 필드만을 접근할 수 있음

인터페이스 구현(implements)

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

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

  void newPage(){
    // ...
  }
}

image3
PrintClass 클래스가 Printable 인터페이스를 구현하고 있으므로 PrintClass는 반드시 print()와 newPage() 메소드를 구현해야 한다. 인터페이스와 구현 클래스의 관계는 화살표가 붙은 점선으로 표현한다. 이 때, 화살표는 구현 클래스에서 인터페이스로 향한다.

  • 인터페이스(interface) : 구현 부분이 생략되어 있는 메소드들의 이름만 선언되어 있는 특수한 클래스

집합(Aggregation) 관계

class Color{
  // ...
}

class Fruit{
  Color color;
  // ...
}

class Basket{
  Fruit[] fruits;
  // ...
}

image4
Bascket 클래스는 Fruit 클래스의 인스턴스를 가지며 Fruit 클래스는 Color 클래스의 인스턴스를 가진다. 가지고 있는 인스턴스 변수를 클래스 다이어그램에 작성해줘야 하며 마름모가 붙은 실선으로 표현한다.

액세스 제어

class Something{
  private int priateField;
  protected int protectedField;
  public int publicField;
  int packageField;

  private void privateMethod(){}

  protected void protectedMethod(){}

  public void publicMethod(){}

  void packageMethod(){}
}

image5

  • +가 붙은 경우 : public인 메소드나 필드를 나타내며 모든 경우 액세스 가능
  • -가 붙은 경우 : private인 메소드나 필드를 나타내며 동일한 클래스에서만 액세스 가능
  • #이 붙은 경우 : proteced인 메소드나 필드를 나타내며 동일한 클래스나 하위 클래스 또는 패키지 내의 클래스만 액세스 가능
  • ~이 붙은 경우 : 동일한 패키지 내에서만 액세스할 수 있는 메소드나 필드

연관(Association) 관계
image6
클래스간의 관계를 나타내기 위해 클래스를 연결하고 그 위에 관계를 나타내는 이름을 붙이며 삼각형 방향으로 해석한다.

시퀀스 다이어그램

프로그램이 동작할 떄, 객체들 사이의 메소드들이 어떤 순서로 실행(호출) 되는지를 표현한 것으로 동적인 관계를 표현한다.

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

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

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

image7
각각의 인스턴스는 직사각형 안에 콜론 : 뒤에 클래스명을 표기하며 인스턴스 아래 점선은 생명선으로 인스턴스가 존재하는 동안 존재한다. 객체가 cpu를 얻어서 실행이 되어 활동하는 동안에는 직사각형으로 표시한다. 또한, 객체 간 호출과 반환을 화살표로 표시한다.


Reference

  • 영진닷컴, 『Java 언어로 배우는 디자인 패턴 입문』