상속이 갖는 단점들
- 상속은 객체지향 프로그래밍의 핵심 기능이지만, 몇가지 단점을 가지고 있다.
- 그래서 일반적으로는 합성(composition)을 사용하는 것이 권장된다.
강한 결합이 강제된다.
- 부모 클래스의 소스 코드를 그대로 내려받을 수 있다는 장점이 있지만, 그만큼 자식 클래스가 많아졌을 때 부모 클래스의 소스코드 변경이 힘들다는 말도 된다.
- 부모 클래스의 변화가 모든 자식 클래스에 영향을 미치게 된다.
- 변경하려면 자식 클래스의 구현들이 제대로 돌아갈 수 있을지 테스트를 많이 거쳐야 한다.
- 코드의 유지보수와 수정을 어렵게 만든다.
- 함부로 변경했다가 자식 클래스에서 쉽게 알아차리기 힘든 미묘한 버그를 만들어낼 수 있는 가능성도 생긴다.
접근자에 대한 제약이 강하게 걸린다.
- 초기에
public
으로 공개해놨던 필드나 메서드를 이용하는 자식 클래스가 여럿 있다면,private
으로 바꿀 필요를 느껴도 바꿀 수 없다. - 접근자를 더 좁은 범위로 바꾸려면 서브 클래스도 다 같이 바꿔야 되는 경우가 생긴다.
정적인 코드가 된다.
- 합성(Composition)은 의존성 주입과 같이 런타임에 관계를 결정할 수 있는 반면, 상속은 정적인 컴파일 타임에 이미 관계가 결정되어 있다.
- 변화에 취약하고 더 딱딱한 코드가 된다.
캡슐화와 은닉을 깨뜨릴 수 있다.
- 상위 클래스의 구현을 전부 알고있거나, 모른다면 살펴봐야 하위 클래스를 구현할 수 있다.
- 상위 클래스의 구현을 숨기고 싶어도 숨기기 어렵다.
복잡한 구조를 갖게 된다.
- 상속을 2~3 번 이상 반복하면, 계속 계층 구조를 따라다녀야 한다.
- 정해진 메서드를 구현하기만 하면 되는 인터페이스 방식이나 클래스 사용 방식과 대비된다.
- 매 상속마다 자식 클래스는 모든 계층에 존재하는 부모의 필드, 메서드를 이어받기 때문에 상속을 여러번 받다보면 매우 복잡해진다.
- 서브클래스의 정체성을 알기 위해 모든 부모 클래스를 다 살펴봐야 한다.
하위 클래스에서 동작을 100% 확신할 수는 없다.
- 부모 클래스는 정확히 부모 클래스의 상황에 맞춰 코드가 구현된 것이라 자식 클래스에서 부모 클래스와 같은 코드를 사용한다고 해서 100% 동작한다는 확신은 없다.
하위 클래스는 선택권이 없다.
- 하위 클래스는 원하든 원하지 않든 부모 클래스의 모든 필드와 메서드를 이어받아야 한다.
- 필요한 필드, 필요한 메서드 외에도 필요 없더라도 모든 메서드와 필드를 상속받아야 한다.
상속은 딱 한번만 가능하다.
- 자바에서 클래스 상속은 딱 하나의 클래스만 상속 가능하기 때문에 신중하게 상속해야 한다.
- 합성 패턴은 몇개든 원하는 클래스를 이용할 수 있는 점과 대비된다.
상속이 적절한 경우는?
- 보통 자식 클래스로 부모 클래스를 완전히 대체할 수 있는 경우에만 유효하다.
레퍼런스
https://incheol-jung.gitbook.io/docs/q-and-a/architecture/undefined-2
반응형
'Java > 자바 잡지식' 카테고리의 다른 글
자바 함수형 인터페이스 혹은 람다 인터페이스란? (0) | 2023.03.29 |
---|---|
Java Stream API 에서 평가 (evaluation) 란? (0) | 2023.03.28 |
로컬과 운영 환경의 log4j 나누기 (0) | 2022.12.28 |
ObjectMapper (Jackson) 커스텀 직렬화 역직렬화 구현 (0) | 2022.05.23 |
자바 8 이상에서 날짜 올바르게 다루기 (0) | 2022.05.19 |