Java객체지향

상속과 다형성

상속이 코드 재사용을 넘어서 타입 관계를 어떻게 만들고, 다형성이 왜 중요한지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

java
class Animal {
    void speak() {
        System.out.println("...");
    }
}

class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("woof");
    }
}

설명

  • 상속은 기존 클래스의 상태와 동작을 이어받아 더 구체적인 클래스를 만드는 방식입니다. 하지만 단순한 코드 재사용 도구로만 보면 오히려 과도하게 쓰기 쉽습니다.
  • 진짜 중요한 개념은 다형성입니다. Animal a = new Dog();처럼 상위 타입 참조로도 하위 객체를 다룰 수 있고, 실제 호출은 런타임 타입에 맞는 메서드가 선택됩니다.
  • @Override는 단순한 장식이 아니라, 의도한 메서드 재정의가 맞는지 컴파일러가 검증하게 해 주는 중요한 안전장치입니다.
  • 상속은 "is-a 관계"가 분명할 때 잘 맞습니다. 단순히 코드 몇 줄을 재사용하고 싶다는 이유만으로 상속을 쓰기 시작하면 클래스 계층이 금방 왜곡됩니다.
  • 실무에서는 상속보다 조합을 더 선호하는 경우도 많습니다. 그래서 이 카드는 상속을 배우되, 언제 과해지는지도 함께 보는 것이 중요합니다.

빠른 정리

개념의미
extends부모 클래스를 상속
override부모 메서드를 다시 구현
다형성상위 타입으로 하위 객체를 다룸
장점공통 계약과 동작 재사용
주의점단순 재사용 목적 상속은 구조를 왜곡할 수 있음

주의할 점

상속을 "코드 복붙 줄이기" 용도로만 쓰기 시작하면 클래스 계층이 쉽게 부자연스러워집니다. 관계가 진짜 is-a인지, 아니면 조합이 더 자연스러운지를 먼저 보세요.

참고 링크

3 sources