Purple Bobblehead Bunny

Backend/JAVA

[JAVA] 상속(Inheritance)

준영어린이 2022. 4. 22. 16:27

 

자바는 상속(Inheritance)라는 개념이 존재한다.

부모 클래스(상위클래스)와 자식 클래스(하위 클래스)가 있고, 자식 클래스는 부모클래스를 선택해서,

그 부모의 멤버를 상속을 받아 그대로 쓸 수 있게 된다.

이미 준비가 되어 있는 클래스를 재 사용을 해서 만들 수 있기 때문에 효율적이고,시간 절약도 된다.

 

하지만 몇 가지 제한이 있다.

 

  • 부모 클래스의 private 접근 제한을 갖는 필드 밑 메소드는 자식이 물려 받을 수 없다
  • 부모와 자식 클래스가 서로 다른 패키지에 있다면,default 접근 제한을 갖는 필드, 메소드도 자식이 물려 받을 수 없다. (접근제한자)
  • 그 이외의 경우는 모두 상속의 대상

 

상속 받는 자식 클래스 명 옆에 extends를 붙이고, 상속할 부모 클래스명을 적는다.

자바는 다중 상속을 허용하지 않는다 !

public class A {...};            //부모 클래스
public class B extends A {...}   //자식 클래스

 

 

코드 예제

 

public class Abook {
 //필드
    String name;
    int price;
    
    public void Info() { 
     System.out.println("책 이름, 가격 : " + name+","+price);
}


public class Bbook extends Abook {
   Bbook(String name, int price) {  //생성자
       this.name = name;   // Bbook이 Abook의 필드를 상속받아서 가능한 선언
       this.price = price;
}

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

 

Bbook 클래스가 Abook 의 필드와 메소드를 상속 받는다.

Bbook 클래스 내에 필드나 메소드가 선언 되어 있지 않았음에도

생성자의 this.name 선언이나, main 메서드의 Child.Info() 가 컴파일 에러가 발생하지 않는다.

 

부모의 필드와 메소드를 그대로 가져다 쓴다!

 

 

 

부모 생성자의 호출 super();

 

하위 객체를 생성하면, 상위 객체를 먼저 생성 후 하위 객체가 그다음에 생성이 된다.

위 예제는 부모 객체를 생성하는 과정에 구현되어 있지 않는데, 내부적으로는 생성이 되어 있는 상태이다.

 

생성자는 명시적인 생성자 선언이 없다면, 컴파일러는 알아서 기본 생성자를 생성하여 호출한다.

 

위 예제에서 상위 클래스(Abook)는 명시적 생성자 선언이 없었고,

하위 클래스(Bbook)는 명시적 생성자 선언이 있다.

 

여기서 상위 클래스의 생성자 선언은, 하위 클래스의 생성자 선언 내부 첫줄에 super();가 생성이 된다.

 

상위 클래스의 기본 생성자 선언을 포함해 명시적 생성자 선언이 없기 때문에 

 

컴파일러가 super(); 를 알아서 생성을 한다. 그 super();는 상위 클래스의 기본 생성자를 컴파일러가 호출 하는 것이다.

 

super(); 는 상위 클래스 (객체) 를 나타내는 키워드이다.

 

 

public class Abook {
  String name;   //필드
  int price 
  
  public Abook (String name, int price){ //부모 생성자가 있는 경우
     this.name = name;
     this.price = price;
}
  public void Info() {
     System.out.println("책 이름과 가격 : " + name +" ,"+ price);
}

public class Bbook extends Abook {
   Bbook() {     //생성자
   super("자바의 정석", 10000);    //하위 생성자 첫줄에 선언
   }
   
public static void main(String[] args) {
   Bbook B = new Bbook();
   System.out.print("[결과] : ");
   B.Info();
}

상위클래스에 기본 생성자는 없고, 매개 변수가 있는 명시적 생성자만 있다면

 

하위 클래스에서는 반드시 생성자 내부 첫줄에 super(매개값, 매개값); 과 같이 선언을 해줘야 한다.

 

 

'Backend > JAVA' 카테고리의 다른 글

[JAVA] HashMap  (0) 2022.04.27
[JAVA] chatAt(int i) - '0'  (0) 2022.04.23
[JAVA] Singleton Pattern  (0) 2022.04.21
[JAVA] 간단한 도서 관리 프로그램  (0) 2022.04.20
[JAVA] 간단한 커피 자판기 프로그램  (0) 2022.04.17