본문 바로가기
IT 공부/객체지향 설계 공부

코드 재사용과 상속에 대해

by exdus3156 2023. 12. 7.

처음부터 검증된 교과서를 가지고 배워서 그런지, 상속에 대한 오해를 바로잡는 문구를 보면 오히려 이해가 가지 않는다.

많은 교과서에서 상속을 사용할 때, 코드의 재사용을 위해서 상속을 사용하지 말라고 주의한다. 하지만 나는 이게 오히려 무슨 말인지 잘 모르겠다... 코드를 재사용하는데 왜 상속이라는 번거로운 걸 하는거지..? 싶다.

여하튼, 상속을 설명할 때 계층화의 관점에서 설명하는 예시가 많다. 하지만 계층화보다는 나는 "부모클래스와 자식클래스가 서로 동일한 타입으로 간주된다"라는 설명이 조금 더 와닿는다.

기본적으로 상속의 가장 큰 특징 중 하나는 부모클래스의 public 인터페이스를 자식도 그대로 외부에 드러낸다는 점이다.

위 사항이 정말 중요한데, 왜냐하면 코드의 재사용을 위해서 상속을 한다는 것이 바로 이 지점에서 논파되기 때문이다.

자식클래스는 부모클래스의 public 인터페이스를 그대로 외부로 드러낸다. 따라서 이건 부모클래스의 코드를 재사용하는 것이 아니다. 사용하려 했던 바로 그 코드를 자식도 그대로 외부로 드러내기 때문에, 외부에서는 부모나 자식이나 같은 놈(?)이다.

부모와 자식이 같은 타입이다. 흔히 Is a 라는 표현으로 설명되는 바로 그 논리다.

IS A 앞뒤로 오는 것은 바로 시스템에서 특정 역할을 수행하고 있는 객체다. 따라서 "is a"는 두 객체가 서로 역할이 같다는 뜻이다. 

따라서 자식 클래스가 부모 클래스의 코드를 재사용하겠답시고 무작정 상속을 하면 자식은 반드시 부모가 수행하고 있던 역할도 그대로 수행할 책임이 생긴다.

조영호님의 <객체지향의 사실과 오해> 라는 책에서 객체지향의 핵심 메커니즘은 객체에게 적절한 책임과 역할을 부여해 좋은 협력 구조를 만드는 것이라고 했다. 그렇다. 부모 클래스는 그냥 단순하게 인터페이스를 제공하는게 아니라, 특정 시스템에서 특정 역할을 수행하는 책임을 지고 있는 것이다.

즉, 자식클래스는 부모클래스의 코드가 아니라 역할과 책임을 물려 받는다.

 

따라서 상속하는 자식은 상속을 할 때, 반드시 부모 클래스가 담당하고 있던 시스템의 책임을 본인도 짊어져야 한다고 단단히 주의해야 한다.

상속을 오로지 재사용만을 위해서만 한다면 부모에게서 얻어 먹기만 하고 책임은 회피하는 불효 자식(?) 이다...

이와 관련된 재밌는 예시가 <코드 컴플리트> 책에 나온다. (2-1-2. 추상화 레벨이 뒤죽박죽이다 참고)

 

처음 자바를 배울 때 상속에 대해 오직 문법적 기능만을 배웠으므로 이런 미묘한 객체지향 원리를 생각하지도 못했는데, 이제는 조금이나마 문법을 어떻게 활용해야 올바른 것인지 알아가는 것 같다.