본문 바로가기
자바(Java)/자바 클래스

[Java Class.06] 상속(Inheritance)

by 긱펀 2024. 2. 23.
반응형

[Java Class.06] 상속(Inheritance)

 

1.클래스 상속(Class inheritance)

  • 부모가 자식에게 상속을 하듯이, 객체 지향 프로그램에서도 부모 클래스의 멤버를 자식 클래스에게 상속할 수 있다.
  • 부모 클래스를 상위 클래스라고 부르기도 하고, 자식 클래스를 하위 클래스 or 파생 클래스라고 부른다.
  • 상속은 이미 잘 개발된 클래스를 재사용하는 방법이므로 코드의 중복을 줄여준다.

 

// parent class
public class Phone {
  String model;
  String color;

  void powerOn() {
    System.out.println("Power on.");
  }
  void powerOff() {
    System.out.println("Power off.");
  }
}

 

// child class
public class SmartPhone extends Phone {
  String wifi;

  SmartPhone(String model, String color, String wifi) {
    this.model = model;  // from parent class
    this.color = color;  // from parent class
    this.wifi = wifi;
  }

  void connect_wifi(String wifi) {
    System.out.println("Connecting to " + wifi);
  }
}

 

 

// 자식 클래스(child class) 테스트
public class Main {
  public static void main(String[] args) {
    SmartPhone sm = new SmartPhone("Galaxy S10", "White", "KT");
    
    // Phone으로부터 상속받은 필드와 메소드(from 부모)
    System.out.println(sm.model);
    System.out.println(sm.color);
    sm.powerOn();
    sm.powerOff();
    
    // SmartPhone에서 추가한 필드와 메소드(자식)
    System.out.println(sm.wifi);
    sm.connect_wifi("KT");
  }
}

 

 

2.부모 생성자 호출(Super Constructor)

  • 자바에서는 자식 객체를 생성하면, 먼저 부모 객체가 생성되고 그 다음에 자식 객체가 생성된다.
  • 모든 객체는 클래스의 생성자(Constructor)를 호출해야만 생성된다.
  • 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다.
  • 생성자가 명시적으로 선언되지 않으면 컴파일러가 아래와 같이 기본 생성자를 만든다.
SmartPhone {  // 자식 생성자
	super();  // 부모의 기본 생성자 호출
}
  • 생성자가 미리 코딩되어 있지않다면 컴파일러에 의해 기본 생성자가 만들어지므로 문제없이 실행된다.
  • 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하려면 아래와 같이 코딩한다.
// parent class
public class Phone {
  String model;
  String color;

  public Phone(String model, String color) {
    this.model = model;
    this.color = color;
  }
}

 

 

// child class
public class SmartPhone extends Phone {
  String wifi;

  public SmartPhone(String model, String color, String wifi) {
    super(model, color); // 부모 생성자 호출
    this.wifi = wifi;
  }
}

 

// 자식 클래스(child class) 테스트
public class Main {
  public static void main(String[] args) {
    SmartPhone sm = new SmartPhone("Galaxy S10", "White", "KT");
    
    // 부모에게서 상속받은 필드 출력
    System.out.println(sm.model);
    System.out.println(sm.color);

    // 자식에게서 추가한 필드 출력
    System.out.println(sm.wifi);
  }
}

 

  • super(매개변수, ....)는 매개변수의 타입과 일치하는 부모 생성자를 호출한다.
  • 만약 매개변수의 타입과 일치하는 부모 생성자가 없으면 컴파일 오류가 발생한다.
  • super(매개변수,...)가 생략되면 컴파일러에 의해 자동적으로 super()가 추가되기 때문에 부모의 기본 생성자가 미리 존재해야 한다.
  • 부모 클래스에 기본 생성자가 없고, 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위해 super(매개변수,...)를 명시적으로 호출해야 한다.
  • super(매개변수,...)는 반드시 자식 생성자의 첫 줄에 위치해야 한다.(그렇지 않으면 컴파일 에러가 난다.)
  • 바로 위 자식 클래스 코드에서, spuer(model, color) 가 없으면 부모의 기본 생성자가 없으니 다른 생성자를 명시적으로 호출하라는 에러가 발생한다.

 

 

 


 

 

728x90
반응형

댓글