본문 바로가기

언어/JAVA

[UML]클래스 다이어그램

디자인패턴 공부하다가 프로그램 설계를 표현하는 것을 보고 공부해보고자한다.

 

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();
 }
}

 

참고

https://sabarada.tistory.com/72

https://gmlwjd9405.github.io/2018/07/04/class-diagram.html

'언어 > 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