본문 바로가기
Concepts/UML

UML - 클래스 다이어그램 고급 - 클래스화와 일반화

by ocwokocw 2021. 2. 10.

- 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다.

- 클래스화(classification)와 일반화(generalization)

하위 타입을 판단할 때 "is-a 관계"를 사용하라고 말한다. 하지만 이 문장에는 함정이 있다. 아래 문장은 모두 "is-a" 로 표현할 수 있는 문장이다.

  • 양치기 개는 콜리이다. (클래스화)
  • 콜리는 개이다. (일반화)
  • 개는 동물이다. (일반화)
  • 콜리는 품종이다. (클래스화)
  • 개는 종이다. (클래스화)

위의 문장들을 합쳐서 생각해보자. 1+2 문장을 합치면 "양치기 개는 개이다"가 된다. 2+3을 합치면 "콜리는 동물이다"가 되고, 1+2+3을 하면 "양치기 개는 동물이다"가 된다. 3 문장 모두 오류가 없다. 역시 하위 타입 판별에는 "is-a"만한게 없네 라고 생각할 수 있다.

 

하지만 1+4 문장을 합치거나 2+5 문장을 합치면 얘기가 달라진다. "양치기 개는 품종이다"라거나 "콜리는 종이다"는 문장은 맞지가 않다. 왜 어떤건 맞는 문장이고 어떤 것은 아닐까? 눈치가 빠른 독자라면 알겠지만 일반화와 클래스화에 답이 있다.

 

우선 어떤 문법적으로 is-a와 같은 형태의 문장이 주어졌을 때 클래스화와 일반화를 구분할수가 있어야 한다. 클래스화라고 표시된 1번째 문장을 보자. 클래스화를 판단할 때에는 인스턴스인가? 라고 생각해보아야 한다. "양치기 개의 모든 인스턴스는 콜리의 인스턴스이다." 라고 생각해보자. 이렇게 생각하면 양치기 개는 콜리의 하위타입이 아닌 콜리라는 클래스의 인스턴스라고 생각할 수 있다. 이 생각이 맞다면 클래스화 라고 볼 수 있다.

 

일반화는 ~의 일종이다라는 문장으로 치환해보아야 알 수 있다. "콜리는 개의 일종이다"나 "개는 동물의 일종이다"는 성립하며, 하위 타입을 표현한 문장이다. 동물의 하위에는 개,소,양 여러가지가 있기 때문이다. 하지만 4번째 문장인 "콜리는 품종의 일종(하위타입)이다"는 콜리는 품종의 하위가 아닌 품종 그 자체이므로 맞지 않는다.

그러므로 하위 타입 판단시에는 "is-a"를 대입하여 성립하면 알 수 있다는것은 위험한 생각이다. 이를 잘못사용하면 상속을 부적절하게 사용하게되고, 클래스의 책임이 혼란스러워진다.


- UML 표기

일반화는 Generalization 화살표를 사용하면 되는데, 클래스화는 UML 에서 어떻게 나타내야 좋을까? 클래스화를 UML 에서 표시할때에는 의존(Dependency)과 <<instantiate>> 키워드를 함께 사용한다. 위의 예제 문장에서 1,2,3 문장을 UML로 나타내보자.

위에서 일반화에 관한 2,3 문장은 일반화 화살표로 이어주면 된다. 클래스화에 관한 1번 문장은 의존 화살표로 이어주고, instantiate 키워드로 표시한다.

댓글