상속성

상속성(Inheritance)은 기존 클래스(부모, 슈퍼클래스)의 속성과 메서드다른 클래스(자식, 서브클래스)가 물려받아 재사용하거나 확장할 수 있게 하는 객체지향 프로그래밍(OOP)의 핵심 개념이다. 코드 중복을 줄이고, 공통 구조를 한 곳에서 관리할 수 있게 해 준다.

핵심 효과

  • 코드 재사용: 부모의 구현을 다시 쓰지 않아도 됨
  • 계층 구조: 일반 → 특수 방향으로 클래스 관계 표현
  • 다형성: 부모 타입으로 자식을 다룰 수 있음
  • 확장성: 기존 코드를 건드리지 않고 기능 추가

상속의 종류

종류설명
단일 상속한 부모만 상속 (Java, C#, Kotlin)
다중 상속여러 부모 상속 (C++, Python)
인터페이스 상속계약만 상속 (Java interface)
믹스인(Mixin)기능 조각을 조합

다중 상속은 다이아몬드 문제(공통 조상 메서드가 중복) 때문에 많은 언어가 기피한다.

is-a 관계

상속은 “자식 is a 부모” 관계에서 써야 한다. “개는 동물이다”는 상속에 적합하지만, “자동차는 엔진이다”는 부적절하다(엔진은 구성 요소, has-a 관계).

상속 vs 합성 (Composition)

구분상속합성
관계is-ahas-a
결합도강함약함
유연성컴파일 타임런타임 변경 가능
원칙객체지향 입문의 출발”상속보다 합성” 원칙

현대 OOP는 *“가능하면 상속보다 합성”*을 권장한다. 상속은 부모의 변경이 자식에 전파되는 강한 결합을 만들기 때문이다.

주의할 점

  • 깊은 계층: 3~4단계 넘어가면 이해가 어려워진다
  • LSP(리스코프 치환 원칙): 자식은 부모 자리에 대체 가능해야 한다
  • 취약한 베이스 클래스 문제: 부모 수정이 자식 동작을 깨뜨릴 수 있음
  • 오버라이드의 함정: 부모 메서드의 전제 조건을 깨면 위험

관련 노트