상속

Eungae's avatar
Dec 21, 2025
상속

상속 (Inheritance)

기존 클래스의 기능을 확장하여 새로운 클래스를 만드는 것.
하나의 클래스가 다른 클래스의 속성과 메서드를 물려받는 것.
  • 물려주는 클래스는 부모 클래스 (Parent Class, Superclass), 물려받는 클래스는 자식 클래스(Child Class, Subclass) 라고도 부른다.
 

class ChildClass extends ParentClass { ... }

class Person { void eat() { print("냠냠!"); } } class Student extends Person { void study() { print("열공!"); } } void main() { Student student = Student(); student.eat(); // 냠냠! student.study(); // 열공! }
 
cf. 부모 클래스에는 자식 클래스에 있는 멤버(속성, 메서드)를 사용할 수 없다.
class Cart { void add() { print("장바구니에 품목이 추가되었습니다."); } } class Purchase extends Cart { void paid() { print("구매가 완료되었습니다."); } } void main() { Purchase purchase = Purchase(); purchase.add(); // 장바구니에 품목이 추가되었습니다. purchase.paid(); // 구매가 완료되었습니다. Cart cart = Cart(); cart.add(); // 장바구니에 품목이 추가되었습니다. cart.purchase; // Error : The method 'purchase' isn't defined for the type 'Cart'. }
 
super를 통해 자식 클래스가 부모 클래스의 속성과 메서드를 사용할 수 있다.
class Cart { String goods = "귤 1box"; void add() { print("장바구니에 품목이 추가되었습니다."); } } class Purchase extends Cart { void paid() { super.add(); print("$goods 구매가 완료되었습니다."); } } void main() { Purchase purchase = Purchase(); purchase.paid(); } /* 장바구니에 품목이 추가되었습니다. 귤 1box 구매가 완료되었습니다. */
 

재정의 (Overriding)

자식 클래스가 부모 클래스로부터 상속받은 속성과 메서드를 그대로 사용하지 않고, 덮어씌우는 것.
부모 클래스에 정의되어 있는 속성이나 메서드를 새로 정의할 때 사용.
 

예시

<속성 오버라이드> class Cart { String goods = "귤 1box"; void add() { print("장바구니에 품목 $goods이 추가되었습니다."); } } class Purchase extends Cart { @override String goods = "고구마 1box"; void paid() { super.add(); print("$goods 구매가 완료되었습니다."); } } void main() { Purchase purchase = Purchase(); purchase.paid(); } /* 장바구니에 품목 고구마 1box이 추가되었습니다. 고구마 1box 구매가 완료되었습니다. */
<메서드 오버라이드> class Cart { String goods = "귤 1box"; void add() { print("장바구니에 품목 $goods이 추가되었습니다."); } } class Purchase extends Cart { @override void add(){ print("$goods 구매가 완료되었습니다."); } } void main() { Purchase purchase = Purchase(); purchase.add(); // 귤 1box 구매가 완료되었습니다. }
 

종류

메서드 오버라이드
class A { void foo() {} } class B extends A { @override void foo() { print("override"); } }
 
toString() 오버라이드
@override String toString() { return "내용"; }
getter / setter 오버라이드
class A { int get value => 0; } class B extends A { @override int get value => 10; }
 

재정의(오버라이드)를 활용한 기능 확장

<예시> class Cart { String goods = "귤 1box"; void add() { print("장바구니에 품목 $goods이 추가되었습니다."); } } class Purchase extends Cart { @override void add() { super.add(); print("$goods 구매가 완료되었습니다."); } } void main() { Purchase purchase = Purchase(); purchase.add(); }
공통적인 속성과 메서드를 부모 클래스에 정의하고, 공통되지 않는 요소들만 따로 자식 클래스에 정의해서 중복된 코드를 줄이고, 코드의 재사용성을 높일 수 있다.
 

상속되지 않는 클래스 final

final class Cart { void add() { print("장바구니에 품목이 추가되었습니다."); } } class Purchase extends Cart { // Error: The type 'Purchase' must be 'base', 'final' or 'sealed' because the supertype 'Cart' is 'final'. Try adding 'base', 'final', or 'sealed' to the type. @override void add() { super.add(); print("구매가 완료되었습니다."); } } void main() { Purchase purchase = Purchase(); purchase.add(); }
 
Share article

나새끼메이커