지식보부상님의 공부 일지

Java [07] 상속 본문

KB IT's Your Life/Java

Java [07] 상속

지식보부상님 2025. 4. 22. 18:42

[1] 상속 개념 

◈ 상속 (Inheritance)

- 코드의 중복성을 막기 위해 부모가 자식에게 필드, 메소드를 물려주는 행위


[2] 클래스 상속

◈ 클래스 상속

public class 자식클래스 extends 부모클래스 {
}

- extends 뒤에 부모 클래스명 작성

- 다중상속 지원 x


[3] 부모 생성자 호출 

◈ 부모 생성자 호출

- 자식 객체 생성시 부모 객체 생성된 후에 자식 객체가 생성됨

- 부모 생성자는 자식 생성자의  super(); 에 의해 호출되는데, 생략시 기본 생성자 호출

- 원하는 부모 생성자가 있으면 자식 생성자 첫줄에 super(매개값 ...); 으로 명시하면 됨


[4] 메소드 재정의 

◈ 메소드 오버라이딩

- 부모로부터 상속된 메소드를 자식 클래스에서 재정의하는 것

- 자식 메소드가 우선적으로 사용됨

- 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수 등)이 동일해야

- 접근 제한을 강화하는 오버라이딩 불가 (public→private으로 변경 x)

- 새로운 예외 throw 불가

- @Override : 정확히 오버라이딩 되었는지 체크 후 문제가 있다면 컴파일 에러 발생시키는 어노테이션

 

◈ 부모 메소드 호출

- super.메소드(); 로 자식에서 부모의 메소드 호출 가능


[5] final 클래스와 final 메소드 

◈ final 클래스

- final 클래스는 최종적인 클래스이므로 상속 불가

 

◈  final 메소드

- final 메소드는 오버라이딩 불가

=> 부모의 final 메소드는 자식에서 재정의 불가함


[6] protected 접근 제한자 

◈ protected 접근제한자

- 같은 패키지 내 또는 자식 객체에서만 접근 가능하도록 제한

- 다른 패키지(자식)이 호출할 때, new 연산자로 부모생성자 직접 호출 불가, super();로 부모생성자 호출해야


[7] 타입 변환 

◈ 자동 타입 변환 (Promotion)

부모타입 변수 = 자식타입객체;

- 자동으로 타입 변환이 일어나 부모와 동일하게 취급 가능

=> 자동 타입 변환 일어난 이후에는 부모 클래스의 필드, 메소드만 접근 가능

- ★ 자식 클래스에서 오버라이딩된 메소드 있으면 부모대신 자식의 오버라이딩된 메소드가 호출됨!

 

◈ 강제 타입 변환 (Casting)

- 부모는 자식타입으로 자동 변환 안됨

=> 캐스팅 연산자로 강제 타입 변환해야!

Parent parent = new Child();	// 자동 타입 변환
Child child = (Child) parent;	// 강제 타입 변환

[8] 다형성 

◈ 다형성

- 사용 방법은 동일하나 실행 결과가 다양하게 나오는 성질

- 자동 타입 변환 + 메소드 오버라이딩 으로 다형성 구현

 

◈ 필드 다형성

- 필드타입 동일하나, 대입 객체가 달라 결과가 다양하게 나올 수 있는 것

 

◈ 매개변수 다형성

- 메소드의 매개변수가 클래스 타입인 경우, 어떤 자식 객체 제공되느냐에 따라 메소드 실행 결과 달라짐

더보기

Driver.java

public class Driver {
    public void drive(Vehicle vehicle) {
        vehicle.run();
    }
}

 

Vehicle.java

public class Vehicle{
    public void run() {
        System.out.println("차가 달립니다.");
    }
}

 

Bus.java

public class Bus extends Vehicle {
    @Override
    public void run() {
        System.out.println("버스가 달립니다.");
    }
}

 

Taxi.java

public class Taxi extends Vehicle {
    @Override
    public void run() {
        System.out.println("택시가 달립니다.");
    }
}

 

DriverMain.java

public class DriverMain {
    public static void main(String[] args){
        Driver driver = new Driver();
        
        Bus bus = new Bus();
        driver.run(bus); // 버스가 달립니다. 출력
        
        driver.run(new Taxi()); // 택시가 달립니다. 출력
        
        driver.run(new Vehicle()); // 차량이 달립니다. 출력
    }
}

^ driver.run() 메서드의 매개변수에 어떤 자식(Bus, Taxi, Vehicle)이 주어지느냐에 따라 다른 결과(다형성)


[9] 객체 타입 확인 

instanceof 연산자

- 변수가 참조하는 객체의 타입 확인

boolean result = 객체 instanceof 타입;

- [객체] 가 [타입] 의 타입이면 true, 아니면 false를 리턴

 

if(parent instanceof Child child) {
    child.childMethod1(); // 사용 가능
}

Java12 이후에는 위의 결과가 true면 parent 를 child변수에 대입  (타입 변환 발생)


[10] 추상 클래스 

추상 클래스

- 객체 생성할 수 있는 실체 클래스들의 공통적인 필드/메소드 추출하여 선언한 클래스

- 실체 클래스의 부모 역할로 공통적인 필드/메소드 물려받을 수 있음

 

◈ 추상 클래스 선언

- 클래스 선언에 abstract 키워드 추가

- new 연산자로 객체 직접 생성 불가 

- 실체 클래스를 만들기 위한 부모 클래스로만 사용됨

public abstract class 클래스명{
    // 필드
    // 생성자
    // 메소드
}

- 자식 객체에서 추상 클래스의 생성자가 호출되므로 생성자 반드시 있어야 함

 

◈ 추상 메소드와 재정의

- 메소드 선언부만 동일하고, 실제 내용은 자식 클래스마다 달라야 하는 경우 주로 사용

abstract 리턴타입 메소드명(매개변수, ..);

- 중괄호가 없음!

 

더보기
public abstract class Animal {
    abstract void sound();
}

^ 각 동물들은 sound() 메서드 가지지만 동물별로 울음소리가 모두 다르므로,

실제 메소드 내의 내용은 모두 달라야 함 => 추상 메소드 이용


[11] 봉인된 클래스 

◈ sealed 클래스

- Java 15부터 무분별한 자식 클래스 생성 방지를 위해 도입됨

- sealed 키워드 사용시 permits 키워드 뒤에 상속 가능한 자식 클래스 지정

public sealed class Person permits Employee, Manager { ... }

^ Employee, Manager 클래스에서만 Person을 상속받을 수 있음

public final class Employee extends Person { ... }

^ final 키워드로 Employee 클래스는 더이상 자식 생성 불가

public non-sealed class Manager extends Person { ... }

^ non-sealed 키워드로 Manager 클래스는 자식 클래스 생성 가능

 

'KB IT's Your Life > Java' 카테고리의 다른 글

Java [09] 중첩 선언과 익명 객체  (0) 2025.04.24
Java [08] 인터페이스  (0) 2025.04.23
Java [06] 클래스  (1) 2025.04.22
Java [05] 참조 타입  (3) 2025.04.22
Java [04] 조건문과 반복문  (1) 2025.04.21