[Java] Chapter 7. 상속

SeungWoo Cha·2025년 9월 8일

Chapter 7. 상속

7.1 상속 개념

  • 개발 시간을 단축시키고 코드 재사용성을 높인다.
  • 부모 클래스 수정 시 자식 클래스 전체에 반영된다.

7.2 클래스 상속

  • extends 키워드로 부모 클래스를 확장한다.
  • 자바는 단일 상속만 허용한다.
class Parent {}
class Child extends Parent {}

7.3 부모 생성자 호출 (super())

  • 자식 객체 생성 시 부모 객체가 먼저 생성된다.
  • super()는 컴파일러가 자동 추가하여 부모의 기본 생성자를 호출한다.
  • 부모 클래스에 기본 생성자가 없으면, 반드시 super(매개값)을 직접 호출해야 한다.
class Parent {
    Parent(String msg) {
        System.out.println("부모 생성자: " + msg);
    }
}

class Child extends Parent {
    Child() {
        super("Hello"); // 명시적으로 부모 생성자 호출
        System.out.println("자식 생성자");
    }
}

7.4 메소드 재정의 (Overriding)

1. 규칙

  1. 부모 메소드와 선언부(리턴 타입, 이름, 매개변수)가 동일해야 한다.
  2. 접근 제한자는 더 강하게 변경할 수 없다. (public → private 불가)
  3. 새로운 예외를 던질 수 없다.

2. 부모 메소드 호출

  • 중복 코드 방지를 위해 super.method()로 부모 메소드를 호출할 수 있다.
class Parent {
    void display() {
        System.out.println("부모 출력");
    }
}

class Child extends Parent {
    @Override
    void display() {
        super.display(); // 부모 메소드 호출
        System.out.println("자식 출력");
    }
}

7.5 final 클래스와 final 메소드

  • final수정 불가 의미를 가진다.
  1. final 클래스 → 상속 불가

    final class A {}
    // class B extends A {}  // 오류 발생
  2. final 메소드 → 오버라이딩 불가

    class Parent {
        final void show() {}
    }
    class Child extends Parent {
        // void show() {} // 오류
    }

7.6 protected 접근 제한자

  • 같은 패키지에서는 default처럼 접근 가능.
  • 다른 패키지에서는 자식 클래스만 접근 가능.
package p1;
public class A {
    protected void method() {}
}

package p2;
import p1.A;

class B extends A {
    void call() { super.method(); } // 가능
}

7.7 타입 변환 (다형성과 관련)

1. 자동 타입 변환 (Upcasting)

  • 자식 → 부모 타입 자동 변환
  • 부모 멤버만 접근 가능하지만, 오버라이딩된 메소드는 자식 메소드가 실행됨
Parent p = new Child(); // 자동 타입 변환
p.method();             // 자식 메소드 실행

2. 강제 타입 변환 (Downcasting)

  • 부모 타입 → 자식 타입 변환 시 캐스팅 연산자 필요
  • 단, 원래 자식 객체여야만 가능
Parent p = new Child();
Child c = (Child) p;  // 가능

7.8 다형성

  1. 필드 다형성
class Car {
    Tire tire;
}
car.tire = new HankookTire();
car.tire = new KumhoTire(); // 다른 객체로 교체 가능
  1. 매개변수 다형성
void drive(Car car) {
    car.run();
}

drive(new Bus());   // Bus의 run() 실행
drive(new Taxi());  // Taxi의 run() 실행

7.9 객체 타입 확인

  • instanceof 연산자로 객체 타입을 확인할 수 있다.
if (obj instanceof Child) {
    Child c = (Child) obj;
}

7.10 추상 클래스

  • 공통된 필드와 메소드를 모아놓은 클래스
  • new로 직접 객체 생성 불가, 반드시 상속 후 사용해야 한다.
abstract class Animal {
    abstract void sound();
}

class Dog extends Animal {
    void sound() { System.out.println("멍멍"); }
}

7.11 봉인된 클래스 (Sealed Class, Java 15+)

  • 무분별한 상속을 제한하기 위해 도입.
  • permits 키워드로 상속 가능한 클래스를 지정해야 한다.
public sealed class Person permits Employee, Manager {}

public final class Employee extends Person {}
public non-sealed class Manager extends Person {}

  • extends로 단일 상속만 가능
  • super()로 부모 생성자 호출
  • 메소드 오버라이딩 규칙과 super.method() 활용
  • final, protected, 타입 변환, 다형성 원리
  • 추상 클래스, sealed 클래스 개념
profile
한 발자국씩

0개의 댓글