[Java] 상속이란

재피터노트북·2022년 10월 14일
0

상속(Inheritance)

  • 우리가 생각하는 상속이라는 단어가 맞다. 현실 세계에서 부모님이 자식들에게 재산을 물려주는 것과 비슷하다. 차이라고 하면 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는다. 이때 상속받는 클래스를 자식 클래스, 하위 클래스 또는 서브 클래스라고 부른다. 상속을 해주는 클래스를 부모 클래스, 상위 클래스 또는 슈퍼 클래스라고 한다.
public class ParentBook{
  String name; //필드
  int price;

public void Print(){ // 메소드
  System.out.println("책의 이름과 가격 : "+name+" "+price);
}
public class ChildBook extends ParentBook{
  ChildBook (String name, int price){ // 생성자
    this.name = name;  //  ChildBook이 ParetBook의 필드를 상속받아서 가능한 선언
    this.price = price; //  "
}

public static void main (String[] args){
  ChildBook Child = new ChildBook("나의 라임오렌지 나무", 10000);
  System.out.print("[구현 결과 1] ");
  Child.Print();
}

ParentBook 이라는 부모 클래스가 있고 ChildBook라는 자식클래스가 상속받아서 생성자의 name하고 price는 부모클래스에서 상속받아 사용한다.

부모생성자의 호출 Super

public class ParentBook{
  String name; //필드
  int price;

  public ParentBook (String name, int price){ // 부모의 생성자가 있는 경우
    this.name = name;
    this.price = price;
}
  public void Print(){ // 메소드
    System.out.println("책의 이름과 가격 : "+name+" "+price);
}
public class ChildBook extends ParentBook{
  ChildBook (){ // 자식 생성자
    super("나의 라임오렌지 나무", 10000); // 반드시 자식 생성자 첫줄에 선언
}

public static void main (String[] args){
  ChildBook Child = new ChildBook();
  System.out.print("[구현 결과 2] : ");
  Child.Print();
}

만일 부모에게 매개변수를 포함한 명시적 생성자 선언이 있었는데, 자식 생성자에서 super 를 통하여 호출해주지 않았을 경우 컴파일 에러가 납니다.

또한, 앞에서도 말했다시피 반드시 자식 생성자 내부의 첫 줄에 super(…..); 를 써야만 컴파일 에러가 나지 않습니다.

메소드 재정의

  • 부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계되어 있다면 가장 이상적인 상속이지만 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수도 있다. 이 경우 상속된 일부 메소드는 자식 클래스에서 다시 수정해서 사용해야함.
public class Airplane {
    public void land() {
        System.out.println("착륙합니다");
    }
    public void fly() {
        System.out.println("일반비행합니다");
    }
    public void takeOff() {
        System.out.println("이륙합니다");
    }
}
public class SupersonicAirplane extends Airplane{

    public static final int NORMAL = 1;
    public static final int SUPERSONIC = 2;

    public  int flyMode = NORMAL;

    @Override
    public void fly() {
        if (flyMode == SUPERSONIC) System.out.println("초음속비행합니다");
        else super.fly();
    }
    
    public static void main(String[] args) {
    	SupersonicAirplane sa = new SupersonicAirplane();
    	sa.takeOff();
    	sa.fly();
    	sa.flyMode = SupersonicAirplane.SUPERSONIC;
        sa.fly();
        sa.land();
    }
}
profile
난 이 재 선

0개의 댓글