[Java] 상속(inheritance)

chael_lo·2021년 5월 12일
0

Java

목록 보기
17/52

상속이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것이다.
기존의 클래스를 재사용해서 만들 수 있기 때문에 효율적이다.

상속과 관련된 클래스 용어 정리

  • 기존에 정의 되어 있는 클래스

    부모클래스(parent class), 상위클래스(super class), 기초클래스(base class)

  • 상속을 통해 작성되는 클래스

    자식클래스(child class) , 하위클래스(sub class), 파생클래스(derived class)

  • 자바의 최상위 클래스(모든 클래스는 자동으로 Object 클래스의 모든 필드와 메소드를 상속)

    java.lang.Object

부모 클래스와 자식 클래스의 비교

부모 클래스

  • 여러 개의 자식 클래스를 가질 수 있다.
  • 자식 클래스의 자원을 사용할 수 없다.
  • 부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다.
  • 부모와 자식 클래스가 서로 다른 패키지에 있을 경우, 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없다.

자식 클래스

  • 자식 클래스는 여러 개의 클래스로부터 상속을 받을 수 없다.
  • 자식 클래스는 또 다른 클래스의 부모 클래스가 될 수 있다.
  • 자식 클래스는 부모클래스로부터 물려받은 자원들을 override하여 수정하여 사용할 수 있다.
  • 만약 동일한 이름의 변수가 부모 클래스와 자식 클래스에 존재한다면,
    부모 클래스의 변수는 가려진다.
  • private 멤버를 제외한 부모 클래스의 모든 멤버는 상속된다.

상속의 선언

상속받을 자식클래스 뒤에 extends 키워드를 사용하고 부모 클래스를 적는다.
default 접근 제어자: 같은 패키지에 있는 클래스만 접근 가능하다.

public class 자식클래스 extends 부모클래스 {

}

super와 super()

super

부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수다.
부모 클래스의 멤버와 자식 클래스의 필드나 메소드의 이름이 같을 경우 super 키워드를 사용하여 부모 클래스에 접근할 수 있다.

class Parent {
int a = 10;
	public void test(){
    	System.out.println("test");
    }
}
class Child extends Parent {
	int a = 20;
    void display() {
        System.out.println(a);//출력: 20
        System.out.println(super.a);//출력: 10
        super.test();//출력: test
    }
}

super()

부모 클래스의 기본 생성자를 호출할 때 사용하는 메소드다.
자식 클래스에 super(매개값)이 생략되면 자바 컴파일러가 모든 자식 클래스의 생성자 첫 줄에 자동으로 super 메소드를 추가하여 부모 클래스의 생성자를 초기화 해준다.

유의!
부모 클래스에 매개 변수가 있는 생성자만 있고 기본 생성자가 없다면,
자식 생성자에서 반드시 부모 생성자 호출을 위해 super(매개값)자식 생성자 첫 줄에 호출해야 한다.

자식클래스(매개변수선언, ...){
	super(매개값, ...);//매개값과 타입이 일치하는 부모 생성자를 호출
}

예시
부모클래스: TestParent
자식클래스: Test

//부모클래스
public class TestParent {
	public String id;
	public int num;
	
        //기본 생성자 없음
    
        //매개변수가 있는 생성자 선언
	public TestParent(String id, int num) {
	    //인스턴스 변수를 초기화
	    this.id = id;
	    this.num = num;
	}
}

//자식클래스
public class Test extends TestParent {
	int intTest = 10;
		
	public Test(String id, int num, int intTest) {
		super(id, num);//부모 생성자 호출
		this.intTest = intTest;
	}
}
profile
천천히 꾸준히

0개의 댓글