Inheritance
Problems

UserPreferences

제목

단어

도움말

찾기

대문

바뀐글

OOP의 최고의 장점이면서 동시에 최고의 단점이 Inheritance이라고들 한다. 왜 그렇게도 많은 프로그래머들이 Inheritance를 잘못
사용하고, 오류에 머리 아파 하며, 자신의 언어 탓을 하는가.

과연 상속이란 무엇인가? 어떤 경우에 상속을 이용해야 하는가?

기본 원칙

T 클래스를 S 클래스가 상속을 한다면, S는 T의 모든 외부적 행동(behavior)을 상속해야 한다. (Room이
Cube를 상속한다고 보자. Room IS-A Cube이긴 하지만, 만약 Cube에 rotate라는 메써드가 있다면, Room에 rotate를
했을 때 의미가 있어야 한다.)

T가 사용되는 모든 곳에 S가 대신 사용될 수 있어야 한다. (LiskovSubstitutionPrinciple^)

S는 T에 비해, Require No More, Promise No Less 해야 한다.

보통 상속은 IS-A 관계에 있으면 성립한다고들 하는데, 여기에서 많은 사람들이 함정에 빠진다.

예를 들어서, "Women's university IS-A university"는 분명 참이다. 그러면 여학교가 학교의 일종이기 때문에
여학교는 학교를 상속해야 한다고 말할 수 있을까?

꼭 그럴 것만 같다. 여학교의 학교의 특별한 경우이기 때문에, 학교가 사용되는 모든 곳에서 여학교도 사용될 수 있다. 고로 LSP를
성립하는 듯 보인다. 즉, 학교의 학생 수를 구하는 함수 getNumOfStudents(aUniversity)가 있다고 했을 때
aUniversity 자리에 WomensUniversity?의 인스턴스가 전달되어도 아무 문제가
없다. 모든 경우에 이러할까?

학교에 acceptStudent(aStudent)라는 메써드가 있다고 하자. 이 때 aStudent는 남자일 수도, 여자일 수도 있다.
하지만, WomensUniversity?의 acceptStudent는 여자만
받아들인다. 따라서, University를 기대하는 장소에 WomensUniversity?를 전달해 줬다가는
WomensUniversity?의 invariants와
consistency가 깨어진다. 고로, 여학교는 학교를 상속할 수 있는 관계가 되지 못한다. 하지만, 만약 여학교의 acceptStudent가
예컨대, 남자는 물론 동물도 학생으로 받는다고 하면 여학교는 학교를 기대하는 장소에 대신 쓰일 수 있게 된다. 상속 관계가 성립하는 것이다.

precondition에서 상속하는 클래스의 그것이 상속 당하는 클래스의 그것보다 약한(범위가 더 넓은) 것을 일러 "require no
more"(더 많은 조건을 요구하지 말라 -- 상속하는 클래스는 최대한 상속당하는 클래스가 가진 조건 모두를 만족할 수 있다)라고 하며, 이를
contravariance라고 한다.

특이하게도, 학교의 getNumOfStudents는 결과값으로 짝수를 리턴한다고 하자. 그리고 여학교는 getNumOfStudents의
결과값으로 자연수를 리턴한다고 하자. 이 경우에도 상속 관계가 성립하지 않는다. 즉 학교를 기대하는 곳에서는 결과값으로 짝수만 올 것을
예상하는데, 여학교를 그 곳에 대신 사용하면 홀수도 전달되어 오기 때문이다.

postcondition에서 상속하는 클래스의 그것이 상속 당하는 클래스의 그것보다 강한(범위가 더 좁은) 것을 일러 "promise no
less"(더 적은 조건을 약속하지 말라 -- 상속하는 클래스는 최소한 상속당하는 클래스가 가진 조건 모두를 만족해야 한다.)라고 하며, 이를
covariance라고 한다.

T 클래스를 S 클래스가 상속을 한다면, S의 입구는 T의 입구보다 같거나 더 넓어야 하고, S의 출구는 T의 출구보다 같거나 더 좁아야
한다.

응용

년말 보너스 계산을 하는 메써드가 getBonus(aPerfEval)이고, 이 메써드는 퍼센티지를 리턴한다고 하자. Employee라는
클래스가 있고, 이를 Manager 클래스가 상속을 받는다. (Manager IS-A Employee)

Employee는 PerfEval?(Performance Evaluation)로 0점에서
5점까지 받는다. 만약 Manager는 PerfEval?로 4-5점을 받을 수 있다면 제대로된 상속 관계가
아니다. 하지만, Manager의 PerfEval?이 0에서 10점까지라면 가능하다.

Employee의 PerfEval?은 0에서 10%까지의 보너스율을 리턴한다고 하자.
만약 Manager의 그것이 0에서 20%까지라면 제대로된 상속 관계가 안된다. 0에서 10%까지거나 혹은 그보다 더 좁아야 한다.

이렇듯 상속은 "사용하는 클라이언트의 입장"에서 생각해 보아야 한다.

이를 일러 Inheritance는 기존 코드 reuse를 위해서가 아니고 자신이 reuse 당하기 위해 한다는 측면에서 생각해야 한다고
말한다.

--김창준

See also CovariantReturnTypes,
WideParameterNarrowReturn

EditText
of this page (last modified 2003-07-10 17:06:13)
FindPage
by browsing, searching, or an index
Or try one of these actions: DeletePage,
DeleteUploadedFile,
EditAdd,
LikePages,
Publish,
SisterSitesLikePages,
SpellCheck,
UploadFile