JAVA : 상속

친환경 개발자
|2024. 7. 21. 14:00

상속이란

  • 상위 클래스의 속성(=멤버변수)과 메서드(멤버메서드)를 물려 받아 자식 클래스를 정의하는 것
  • 상위 클래스가 쓰던 것을 그대로 쓰는데, 거기에 더 확장하고 차별화를 두고 싶을 때 사용
  • 상위, 부모, super클래스 <---- 하위, 자식, sub 클래스
    자동차 / 개 / 사람 <---- 세단, 트럭,... / 말티즈, 요크셔테리어,... / 요리사, 학생,...

 

 

 

 

 

상속의 특징

  • 확장성, 재사용성: 자동차 리스트를 관리하는데, 별개로 세단과 전기차, 버스 등을 별도로 관리하고 싶다면?
                                  자동차의 속성을 그대로 가져가면서도 버스, 수용인원 등의 별도 속성을 관리할 수 있도록
                                  상속을 활용하여 하위 클래스를 생성할 수 있다.
  • 자식 클래스는 부모 클래스의 멤버 변수와 메서드들을 마치 본인이 선언한 것처럼 사용이 가능
  • extends 키워드를 사용해 상속받을 수 있다 :
              [접근제어자] (static) 클래스명 extends 부모클래스명 {

              }
  • 생성자 호출 시 super() 키워드 사용! (생략해도 구동 시 알아서 부모 클래스에서 찾아온다.)
  • super키워드는 반드시 자식클래스 생성자 내 첫 번째 줄에 위치해야만 한다!
class Car {    // 부모 클래스
    String brand;
    int year;

    // 기본 생성자
    Car() {
        this.brand = "Unknown";
        this.year = 0;
        System.out.println("Car의 기본 생성자가 호출되었습니다.");
    }

    // 파라미터를 입력받는 생성자
    Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
        System.out.println("Car의 파라미터 생성자가 호출되었습니다.");
    }
}

 

class Sedan extends Car {    //자식 클래스
    int seats;

    // 기본 생성자
    Sedan() {
        // super()는 부모 클래스의 기본 생성자를 호출합니다.
       super();
        this.seats = 5;
        System.out.println("Sedan의 기본 생성자가 호출되었습니다.");
    }

    // 파라미터를 입력받는 생성자
    Sedan(String brand, int year, int seats) {
        // super(brand, year)는 부모 클래스의 파라미터를 입력받는 생성자를 호출합니다.
        super(brand, year);
        this.seats = seats;
        System.out.println("Sedan의 파라미터 생성자가 호출되었습니다.");
    }
}

 

 

Object 클래스??

  • 모든 클래스는 Object라는 클래스를 기본적으로 상속받고 있다. extends Object를 쓰지 않아도 알아서 상속한다.
  • equals(), hashCode(), toString() 등의 메서드를 선언하지 않고 사용하는 것은 Object클래스에 이미 마련되었기 때문!

 

 

 

오버라이딩

  • 상위 클래스에서 선언된 메서드를 상속받은 자식 클래스에서 재정의하는 것 ( = 덮어쓰기)
  • 서드의 이름, 반환형, 매개변수가 모두 동일해야 한다! = 단지 메서드 내부 로직이 바뀌는 것!
  • 반드시 상속 관계에서만 사용 가능
  • 어노테이션 표시를 해야 한다. (권장)
  • 조상보다 더 큰 예외를 던질 수 없다.

 

class Car {
    void startEngine() {
        System.out.println("엔진이 켜졌습니다.");
    }
}

class ElectricCar extends Car {
    // 오버라이딩: ElectricCar만의 방식으로 startEngine 메서드를 다시 정의합니다.
    @Override    // 어노테이션
    void startEngine() {
        System.out.println("전기 엔진이 조용히 켜졌습니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        ElectricCar myElectricCar = new ElectricCar();
        myElectricCar.startEngine();  // "전기 엔진이 조용히 켜졌습니다." 출력
    }
}