본문 바로가기

Java

상속(Inheritance)

상속이란

 

자바에서 상속(Inheritance)은 하나의 클래스가 다른 클래스의 속성과 메소드를 물려받아 재사용하는 방식을 의미한다.

 

상속 방식은 주로 다단계 상속, 계층적 상속 두 가지 방식을 띄게 되는데 부모 클래스를 통해 자식, 손자까지 내려가는 방식을 다단계 상속이라고 하며 하나의 부모가 여러 개의 자식을 가지는 것을 계층적 상속이라고 한다.

 


 

자바에서 다중 상속은 불가능 하다.

 

자바 클래스가 다중 상속이 불가능한 이유는 다음과 같다.

1. A라는 class에 test()라는 메소드가 있음
2. B라는 class에 test()라는 메소드가 있음
3. C라는 class가 A와 B 클래스를 모두 상속받음
4. C에서 부모 클래스의 test() 메소드 호출
  - 이러면 어느 부모의 test() 메소드를 호출해야 할지 모름

 


 

자바 클래스 상속 방법

 

자바 클래스의 상속 방법은 다음과 같다.

 

public class Parent {
    private int phone;
    private String name;
    protected String address;

    public Parent(int phone, String name, String address){
        this.phone = phone;
        this.name = name;
        this.address = address;
    }

    public int getNum() {
        return phone;
    }

    public String getName(){
        return name;
    }
}

 

public class Child extends Parent{
    private int childPhone;
    private String childName;

    public Child(int parentPhone, String parentName, String parentAddress, int childPhone, String childName){
        super(parentPhone, parentName, parentAddress);
        this.childPhone = childPhone;
        this.childName = childName;
    }

    public void printParentName(){
        System.out.println(super.getName());
    }

    public void printParentAddress(){
        System.out.println(super.address);
    }
}

 

 

[상속을 할 때 반드시 해야 하는 작업]

  • 자식 클래스에서 부모 클래스를 상속받으려면 extends 키워드를 사용
  • 자식 클래스의 생성자에서 부모 클래스의 생성자 호출
    - 단 부모 클래스에 기본 생성자가 있는 경우 자식 클래스의 생성자에서 부모 클래스 생성자 호출을 생략할 수 있다. (컴파일러가 자동으로 부모 클래스의 기본 생성자를 호출해주기 때문)

 

[super 키워드]

  • 자식 클래스에서 부모 클래스를 가리킬 때 사용하는 키워드
  • 주로 부모 클래스의 필드에 접근하거나 메소드를 호출할 때 사용

 


 

부모 클래스에서 상속되지 않는 것

 

  • 부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다.
  • 부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없다.

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

필드나 메소드의 접근제어자가 public이거나 protected일 때만 상속이 가능하다.

 


 

자바 접근 제어자

 

  • public
    - 모든 클래스에서 접근 가능

  • protected
    - 같은 패키지 내 클래스 or 다른 패키지에 있는 자식 클래스에서만 접근 가능

  • default (다른 말로 package-private)
    - 같은 패키지 내 클래스에서만 접근 가능
    - public, protected, private과 달리 아무것도 선언하지 않아야 default 접근자로 인식함
      ex) default String name; (X) / String name; (O)

  • private
    - 같은 클래스에서만 접근 가능

출처 : 
https://www.tcpschool.com/java/java_inheritance_concept
https://coding-factory.tistory.com/865