상속 (객체지향)
더 많은 작업
상속(Inheritance)은 객체지향 프로그래밍에서 이미 정의된 클래스(상위 클래스)의 속성과 메서드를 새 클래스(하위 클래스)가 물려받아, 필요한 부분만 더하거나 다시 정의해 쓰게 하는 클래스 간 관계이다.
상속은 객체지향의 핵심 개념 가운데 하나로, 공통 기능을 상위 클래스에 한 번만 두고 하위 클래스들이 그것을 재사용하게 한다. 자바에서는 class B extends A 처럼 쓰며, 하위 클래스는 상위 클래스의 public·protected 멤버를 물려받고 생성자는 물려받지 않는다. 하위 클래스의 생성자는 첫 줄에서 상위 클래스 생성자를 부른다(super(...), 생략하면 인자 없는 생성자가 불린다).[1] 파이썬은 class B(A): 처럼 괄호 안에 상위 클래스를 적고, 하위 클래스에 같은 이름의 메서드가 있으면 그것이 상위 클래스의 것보다 먼저 찾아진다.[2]
상속 관계는 "B 는 A 의 한 종류이다(is-a)"가 성립할 때 쓴다. 상위 클래스를 일반화(generalization), 하위 클래스를 특수화(specialization)라고도 한다.
클래스 다이어그램에서 상속은 일반화 관계로 그린다. 하위 클래스에서 상위 클래스 쪽으로 실선을 긋고, 상위 클래스 끝에 속이 빈 삼각형 화살촉을 단다. 하위 클래스가 여럿이면 화살촉 하나에 선을 모아 그리기도 한다.
부분-전체 관계인 집합(aggregation)은 전체 쪽 끝에 속이 빈 마름모를 단다. 삼각형과 마름모를 혼동하면 상속을 집합으로 잘못 읽게 된다.
상속 관계에서 하위 클래스 객체는 상위 클래스 타입 변수에 그대로 대입할 수 있다(업캐스팅). 반대로 상위 클래스 타입의 객체를 하위 클래스 타입 변수에 넣는 것은 명시적 캐스트 없이는 컴파일 오류이고, 캐스트를 써도 실제 객체가 그 하위 타입이 아니면 실행 중 ClassCastException 이 난다 → 자바 다형성
class A { }
class B extends A { }
A x = new B(); // 가능: 하위 객체를 상위 타입으로
B y = new A(); // 컴파일 오류: 상위 객체를 하위 타입 변수에
| 구분 | 상속(일반화) | 집합·구성(포함) |
|---|---|---|
| 관계 | is-a(종류) | has-a(부분) |
| UML 화살촉 | 속이 빈 삼각형 | 속이 빈 마름모(집합), 속이 찬 마름모(구성) |
| 예 | 자동차 → 탈것 | 자동차 ◇ 바퀴 |
| 재사용 방식 | 상위 클래스의 구현을 물려받음 | 다른 객체를 멤버로 두고 위임 |
- ↑ 1.0 1.1 「Inheritance」, The Java Tutorials, Oracle, https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html, 확인일: 2026-11-04.
- ↑ 「9. Classes - 9.5 Inheritance」, The Python Tutorial, Python Software Foundation, https://docs.python.org/3/tutorial/classes.html, 확인일: 2026-11-04.