☕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개의 댓글

관련 채용 정보