Skip to content

UML 클래스 다이어그램 정리

3줄 요약

  • 이 글은 클래스 다이어그램의 각 요소를 설명하고 있음

  • 각 요소의 예제 코드는 java로 작성되어 있음

  • 클래스 다이어그램에 익숙해지면 클린 코드, 클린 아키텍처, 오브젝트 등 설계관련 책을 읽을 때 작가의 의도를 한눈에 알아볼 수 있게 됨

클래스 다이어그램 정리

소개하고 있는 용어는 아래와 같음

객체 구성 요소

  • 클래스(Class)

  • 속성(Attribute)

  • 동작(Operation)

객체간 관계

  • 의존(Dependency) 관계

  • 연관(Association) 관계

  • 일반화(Generalization) 관계

  • 실제화(Realization) 관계

객체 구성 요소

클래스, 속성, 동작

클래스(Class) 클래스 명이 들어감 실제 다루고자 할 객체에 대한 명칭이 들어감 아래의 예제는 영화라는 객체를 구현함

속성(Attribute) 한 객체 안에 있는 상태를 저장하기 위한 속성 값이 들어있음. 영화라는 객체 안에 영화 제목이라는 속성이 있다고 표현함

동작(Operation) 한 객체가 할 수 있는 행위에 대한 정보가 담겨짐. 영화는 영화 요금을 반환할 수 있다고 표현함

Image title

그림 1 - 객체

이를 코드로 작성하면 아래와 같은 코드가 나타나게 됨

Movie.java
1
2
3
4
5
6
class Movie { // 클래스
    private String title; // 속성
    void calculateMovieFee() { // 동작

    }
}

객체간 관계

의존(Dependency) 관계

의존 관계는 기능을 수행하기 위해 다른 객체가 필요한 상황을 나타날 때 사용함.

클래스 안의 속성 및 동작은 생략하여 표현하면 아래와 같이 점선의 꽉찬 화살표(---▶)로 표현됨

Image title

그림2 - 의존 관계

MovieScreen의 관계를 코드로 작성하면 다음과 같은 코드가 나타남

Dependency.java
class Movie {
    // 구현
}

class Screening {
    // doSomthing을 사용하기 위해 Movie 객체가 필요함
    void doSomething(Movie movie) { 
        // doSomething을 사용하기 위해 Movie 객체가 필요한 경우도 의존 관계임
        Movie newMovie = new Movie(); 
    }
}

연관(Association) 관계, 역할 명(Role name)

한 객체가 다른 객체를 갖고 있으면 연관 관계이다. 의존 관계와 같이 객체가 동작하기 위해 다른 객체가 필요한건 동일하다.

갖고 있을 때, 가진 객체는 역할 명을 갖게된다.

의존 관계와 연관 관계의 차이점은 다른 객체를 의존한다는 건 변함이 없지만, 의존 관계는 객체를 매개변수로 받거나, 별도로 생성하고, 연관 관계는 객체를 속성으로 가지고 있다.

즉, A와 B의 의존관계라고 한다면, A의 동작을 수행하는데 B가 필요하고 와 B의 연관관계라고 한다면, A안에 B가 있음을 알 수 있다.

그림으로 표현하다면 의존 관계와 다르게 실선의 꽉찬 화살표(-▶)로 표현된다.

MovieDiscountPolicy는 의존 관계이고, Movie안에 discountPolicy가 있음을 알 수 있다.

Image title

그림3 - 연관 관계와 역할 명

이를 코드로 표현하면 아래와 같다.

Association.java
1
2
3
4
5
6
7
8
class Movie{
    DiscountPolicy discountPolicy;
    // ...
}

class DiscountPolicy {
    // ...
}

만약 한 객체가 다수의 객체를 갖는 관계이면 아래와 같이 다중성(multiplicity)의 의미로 *(별표)가 표기될 수도 있다.

아래의 그림 예제에서 DiscountPolicy가 여래개의 DiscountCondition을 가지고 있음을 *(별표)를 통해 알 수 있다.

Image title

그림4 - 연관 관계(다중성)

이를 코드로 표현하면 아래와 같다.

AssociationWithMultiplicity.java
1
2
3
4
5
6
7
class DiscountPolicy {
    List<DiscountCondition> conditions;
}

class DiscountCondition {
    // ...
}

일반화(Generalization) 관계

하나의 클래스가 다른 클래스를 상속받았을 때 일반화 관계가 있다고 표현한다.

아래의 그림에서 DiscountPolicyAmountDiscountPolicyPercentDiscountPolicy실선의 비어 있는 화살표(-▷)를 통해 상속받았음을 알 수 있다.

Image title

그림5 - 일반화 관계

이를 코드로 표현하면 아래와 같다.

Generalization.java
class DiscountPolicy {
    // ...

class AmountDiscountPolicy extends DiscountPolicy {
    // ...
}

class PercentDiscountPlicy extends DiscountPolicy {
    // ...
}

실체화(Realization) 관계

하나의 인터페이스를 implements로 상속받아 구체적인 기능을 구현하는 관계이다.

아래의 그림에서 DiscountCondition의 인터페이스를 SequenceConditionPeriodCondition점선의 비어 있는 화살표(---▷)를 통해 isSatisfiedBy() 기능을 구체적으로 구현하였음을 알 수 있다.

Image title

그림6 - 실체화 관계

이를 코드로 표현하면 아래와 같다.

Realization.java
interface DiscountCondition {
    boolean isSatisFiedBy();
}

class SequenceCondition implements DiscountCondition {
    boolean isSatisFiedBy() {
        // do SequenceCondition
    }
}

class PeriodCondition extends PeriodCondition {
    boolean isSatisFiedBy() {
        // do PeriodCondition
    }
}

결론

이로서 클래스 다이어그램의 기본적인 요소를 알아봤다. 처음엔 관계를 알아보는 데에서 시작하자. 작은 단계부터 이해하다 보면 어느 순간 익숙해 질 것이고, 큰 그림을 보면서 이러한 관계로 구성한 이유는 무엇인지 곰곰히 생각해 볼 수 있을 것이다.


Comments