상속성
상속성(Inheritance)은 기존 클래스(부모, 슈퍼클래스)의 속성과 메서드를 다른 클래스(자식, 서브클래스)가 물려받아 재사용하거나 확장할 수 있게 하는 객체지향 프로그래밍(OOP)의 핵심 개념이다. 코드 중복을 줄이고, 공통 구조를 한 곳에서 관리할 수 있게 해 준다.
핵심 효과
- 코드 재사용: 부모의 구현을 다시 쓰지 않아도 됨
- 계층 구조: 일반 → 특수 방향으로 클래스 관계 표현
- 다형성: 부모 타입으로 자식을 다룰 수 있음
- 확장성: 기존 코드를 건드리지 않고 기능 추가
상속의 종류
| 종류 | 설명 |
|---|---|
| 단일 상속 | 한 부모만 상속 (Java, C#, Kotlin) |
| 다중 상속 | 여러 부모 상속 (C++, Python) |
| 인터페이스 상속 | 계약만 상속 (Java interface) |
| 믹스인(Mixin) | 기능 조각을 조합 |
다중 상속은 다이아몬드 문제(공통 조상 메서드가 중복) 때문에 많은 언어가 기피한다.
is-a 관계
상속은 “자식 is a 부모” 관계에서 써야 한다. “개는 동물이다”는 상속에 적합하지만, “자동차는 엔진이다”는 부적절하다(엔진은 구성 요소, has-a 관계).
상속 vs 합성 (Composition)
| 구분 | 상속 | 합성 |
|---|---|---|
| 관계 | is-a | has-a |
| 결합도 | 강함 | 약함 |
| 유연성 | 컴파일 타임 | 런타임 변경 가능 |
| 원칙 | 객체지향 입문의 출발 | ”상속보다 합성” 원칙 |
현대 OOP는 *“가능하면 상속보다 합성”*을 권장한다. 상속은 부모의 변경이 자식에 전파되는 강한 결합을 만들기 때문이다.
주의할 점
- 깊은 계층: 3~4단계 넘어가면 이해가 어려워진다
- LSP(리스코프 치환 원칙): 자식은 부모 자리에 대체 가능해야 한다
- 취약한 베이스 클래스 문제: 부모 수정이 자식 동작을 깨뜨릴 수 있음
- 오버라이드의 함정: 부모 메서드의 전제 조건을 깨면 위험
관련 노트
- 다형성: 상속과 결합해 OOP를 완성
- 추상화 · 모듈화: 상속의 상위 설계 개념
- SDLC · 소프트웨어 아키텍쳐: 상속이 설계에 미치는 영향