일반화와 상속의 차이
starUML을 사용하다보니 다음과 같은 의문이 들었다.
" 상속(Inheritance) 기호를 왜 일반화 기호로 표기했을까? "
Generalization이라 표기되어있는 상속기호
고민을 하다보니, 문득 예전에 객체지향프로그래밍 과목(C++) 시간에배운 is-a / has-a 관계가 생각났다.
따라서, 이번 글에서는 일반화와 상속의 차이에 대해 정리하고, is-a / has-a 관계에 대해 리뷰해보는 시간을 가져보자.
1. is-a
사람과 학생 클래스가 있다. 이들의 관계를 표현해보자
is-a 관계가 성립할 때 이를 상속으로 표현할 수 있다.
1) Person is a student. : 사람은 학생이다. -> 논리적으로 옳지 않다. 모든 사람은 학생이 아니기 때문이다.
2) Student is a person. : 학생은 사람이다. -> 논리적으로 옳다. 모든 학생은 사람이라는 속성을 가진다.
따라서 is-a 관계에 의해 우리는 위의 다이어그램과 같이 person클래스를 상속받는 학생 클래스를 만들 수 있다.
2 has-a
학생증이라는 클래스를 추가해보자. 이들의 관계를 표현해보자.
학생 has a 학생증.
is a 관계라 가정하면, 다음과 같이 표현할 수 있다.
1) Student is a student card. : 사람은 학생증이다. -> 논리적으로 옳지 않다
2) Student card is a student. : 학생증은 사람이다. -> 논리적으로 옳지 않다
매우 어색하다. 우리는 이를 표현하기 위해 has - a 관계라는 것을 정의함으로써 다음과 같이 올바르게 표현할 수 있다.
3) Student has a student card. :
즉, 우리는 이와 같은 관계를 가질 때 이를 has-a 관계라고 부르며, 포함(Aggregation) 관계라 부르기도 한다. (일반적으로 필드가 객체를 포함하는 상황에서 has-a 관계를 가진다)
이때 한가지 더 첨언하자면, 학생 클래스 객체가 생성되면 학생 객체가 학생증 클래스의 생성자를 호출해 학생증 객체를 만든다. <-- 개념 다시 정리
이제 본격적으로, 일반화와 상속의 차이에 대해 이해해보자.
1. 일반화 (Generalization)
Bottom-up Process로 비슷한 클래스끼리의 공통 유사 속성을 묶은 것이다. 일반적으로 is-a 관계로 표현될 수 있으며,
Specialization Class is a Generalization Class. 로 나타내어진다.
( 구체화 클래스 is a 일반화 클래스 )
사진 출처 : http://www.universalteacherpublications.com/univ/free-asgn/2008/mcs32/page1.htm
위의 예시를 보면 shape 의 한 종류로 사각형, 원, 삼각형이 있는 것을 알 수 있다. 도형이라는 속성으로 일반화가 되었다고 볼 수있다. (반대로 구체화과정을 거치면 shape를 구체화하면 사각형, 원, 삼각형이 될 수 있다는 걸 알 수있다.)
2. 상속
(정의 보강 예정)
부모클래스로부터 자식클래스가 물려받을 때, 우리는 이를 상속이라고 부른다. 일반화관계일 때 보통 상속구조를 가질 수 있다.
예를 들어 학생이 사람을 상속받는다면, 사람의 속성을 학생이 다 가질 수 있기 때문이다.
따라서 관점의 차이에서 만들어낸 용어의 차이로, 일반화와 상속은 같은 뜻을 가진 용어라고 봐도 무방하다.
'IT 지식 > 공통' 카테고리의 다른 글
UML 클래스 다이어그램(1) (0) | 2018.01.07 |
---|