☕Java 상속(Inheritanse), super

hamsang·2022년 5월 28일
0

Java

목록 보기
14/36
post-thumbnail

👪상속(Inheritance)

여러 개체들이 지닌 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립하는 과정 (일반화)

  • 부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있으며, 자식 클래스는 부모 클래스를 선택해서, 그 부모의 멤버를 상속받아 그대로 쓸 수 있습니다.

  • 코드의 중복을 없앱니다. (상속 관계를 맺으면 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 다시 정의할 필요가 없다.)


IS-A 관계 (is a relationship)

'~은 ~이다' / 상속관계

  • 상위 클래스 : 일반적인 개념
  • 하위 클래스 : 구체적인 개념

    ex) 상위클래스: 동물, 하위클래스: 포유류, 파충류
    ex) 햄스터는 동물이다. (햄스터의 부모 클래스는 동물)

HAS-A 관계 (has a relationship)

'~은 ~을 가지고 있다.' / 포함관계 or 구성 (Composition) 관계
클래스가 다른 클래스를 소유한 관계이다.

ex) 컴퓨터 안에는 CPU가 있다. (컴퓨터 객체가 CPU 객체를 구성함)


😎 상속 기능을 사용할 때 알아야할 점!

상속을 받는다고 하더라도 자식 클래스가 부모의 모든 것을 물려받는 것은 아닙니다.

  • 부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없습니다.

  • 부모와 자식 클래스가 서로 다른 패키지에 있을 때, default 접근 제한을 갖는 부모 클래스의 필드 및 메소드는 자식이 물려받을 수 없습니다.
    (default 접근 제한은 ‘같은 패키지에 있는 클래스’만 접근이 가능하게끔 하는 접근 제한자이기 때문입니다.)


💻 클래스 상속

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

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

📂 예제 코드

public Class Parent{ .... }; // 부모 클래스
public Class Child extends parent { .... }; // 자식 클래스
//부모 클래스
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);
  Child.Print();
}

책의 이름과 가격 : 나의 라임오렌지 나무 10000

ChildBook 클래스가 ParentBook의 필드와 메소드를 상속받았습니다. 그러므로 ChildBook 클래스 내에 따로 필드나 메소드가 선언되어 있지 않은데도 생성자의 this.name 선언이나 main 메소드의 Child.Print()에 에러가 나지 않고 잘 컴파일되는 것을 볼 수 있습니다.

그냥 부모의 필드와 메소드를 그대로 가져다 쓴다고 생각하면 편합니다.


🦸‍♂️ 부모 생성자의 호출 : super(…);

super 키워드는 부모 클래스(객체)를 나타냅니다.

원래 ‘명시적인 생성자 선언’이 없다면, 자동으로 컴파일러에서 디폴트 생성자를 생성하여 호출합니다.

위 코드에서 부모 클래스(ParentBook)에는 명시적 생성자 선언이 없었고, 자식 클래스(ChildBook)에는 명시적 생성자 선언이 존재합니다.
그렇기 때문에 부모 클래스의 생성자는 자식 클래스의 생성자 선언 내부에 맨 첫줄에 super(); (디폴트 생성자) 형태로 생성됩니다.

📂 메소드 상속 예제 코드

//부모 클래스의 showInfo() 메서드

public void showInfo() {
    System.out.println("==="+ this.name + "===");
    System.out.println("price is " + this.price);
    }
//자식 클래스의 showInfo() 메서드
  
public void showInfo() {
    super.showInfo();
    System.out.println("phone number is " + this.phoneNumber + ".");
    }

위 코드에서 자식 클래스는 부모 클래스의 showInfo() 메서드 기능을 그대로 상속받아 기능을 추가해 사용하고 있습니다. 중복되는 기능을 다시 구현할 필요 없이 super 키워드로 간편히 재사용이 가능합니다.

profile
햄생

0개의 댓글