1 분 소요

상속이란 무엇인가?

상속(Inheritance)기존 클래스(부모·Super) 의 필드와 메서드를 새로운 클래스(자식·Sub) 가 물려받아 확장하는 객체 지향 핵심 개념입니다. 이 덕분에 중복 코드를 제거하고, 계층적 구조를 통해 재사용성다형성을 자연스럽게 구현할 수 있습니다.


상속이 주는 세 가지 이점

1) 코드 재사용성 향상

부모 클래스의 검증된 로직을 그대로 활용하므로 새 기능 개발 시 작성해야 할 코드량이 대폭 감소합니다.

2) 유지보수성 향상

공통 로직을 부모에 모아두면 수정 지점이 단일화되어 버그 수정·기능 개선이 수월해집니다.

3) 다형성(Polymorphism) 지원

부모 타입으로 자식 객체를 참조할 수 있어, 동적 바인딩메서드 오버라이딩으로 유연한 프로그램 설계가 가능합니다.


자바 상속 선언 방법

class Parent { /* … */ }

class Child extends Parent {  // Child IS-A Parent
    /* 추가 필드·메서드 */
}
  • extends 키워드로 단일 상속만 허용
  • 부모의 생성자·private 멤버·초기화 블록은 상속되지 않음

상속 시 접근 제한자 영향

한정자 자식 클래스 접근 외부 접근
public 가능 가능
protected 가능 (패키지 다르면 상속 통해서만) 불가
(default) 같은 패키지에서만 불가
private 불가 불가

TIP: 자식에서 부모의 private 필드를 쓰고 싶다면 Getter/Setter를 제공해 캡슐화를 유지하세요.


Object 클래스: 모든 클래스의 최상위 부모

자바는 클래스 선언 시 extends Object암묵적으로 추가합니다. 덕분에 toString(), equals(), hashCode() 같은 공통 메서드를 모든 객체가 자동으로 사용합니다.


실전 예제: 동물 클래스 계층

class Animal {
    void sound() { System.out.println("Some sound"); }
}

class Dog extends Animal {         // 상속
    @Override
    void sound() { System.out.println("Bark"); }
}

public class Main {
    public static void main(String[] args) {
        Animal pet = new Dog();    // 다형성
        pet.sound();               // 출력: Bark
    }
}
  • 오버라이딩으로 동작 변경
  • IS-A 관계가 성립해 DogAnimal로 취급 가능

상속 설계 시 주의할 점

  • 단일 상속 원칙: 자바 클래스는 한 부모만 선택 가능 → 복합 기능은 인터페이스 다중 구현으로 보완
  • 과도한 깊이의 상속 트리는 복잡도 증가 → “구성(Composition)이 상속보다 낫다” 원칙 고려
  • 공통 코드가 적다면 상속 대신 위임(Delegation) 이 더 깔끔할 수 있음

질문 정리

Q1. 자바에서 다중 상속이 왜 금지되나요?

A. 동일 메서드를 가진 두 부모가 있을 때 어느 구현을 상속할지 모호해지는 Diamond 문제를 방지하기 위함입니다.

Q2. 인터페이스 다중 구현은 안전한가요?

A. 인터페이스는 구현이 없거나 default 메서드 충돌 시 명시적으로 해결하도록 강제하므로 다중 구현이 가능합니다.

Q3. 부모 생성자는 언제 호출되나요?

A. 자식 생성자 호출 시 가장 먼저 부모의 기본 생성자가 자동 실행됩니다. 다른 생성자를 원하면 super(param)으로 지정하세요.

Q4. 상속받은 메서드를 막고 싶으면?

A. 부모 메서드를 final로 선언하면 자식에서 오버라이딩 금지가 가능합니다.

Q5. 상속보다 인터페이스를 쓰는 기준은?

A. 상태(필드) 공유가 필요 없고 행동 규약만 정의할 때 인터페이스가 더 유연합니다.

카테고리:

업데이트:

댓글남기기