학습할 것 (필수)

자바 상속의 특징

자바의 상속은 한 클래스가 다른 클래스에서 파생될 수 있음을 뜻한다. 한 클래스가 다른 클래스를 상속받는 경우, 상속받는 클래스를 서브클래스, 상속의 대상이 되는 클래스를 수퍼클래스라고 부르고 서브클래스는 수퍼클래스의 모든 멤버-필드와 메서드-를 상속받는다(하지만 멤버의 접근제어자에 따라 상속이 제한된다). 수퍼클래스가 없는 최상위 클래스인 Object 클래스를 제외한 자바의 모든 클래스는 하나의 클래스를 상속받고 이를 단일상속이라고 한다. 자바는 단일상속만을 허용한다! 상속받는 클래스를 따로 명시해주지 않을 경우에는 Object 클래스를 상속받게 된다.

super 키워드

super 키워드는 서브클래스에서 수퍼클래스의 멤버에 접근을 가능하게 한다. 가령 서브클래스에서 수퍼클래스의 메서드를 오버라이딩할 때 수퍼클래스의 오버라이드된 메서드를 불러오려면 이 super 키워드를 사용할 수 있다.

public class Superclass() {
	public void printMethod() {
		System.out.println("Printed in Superclass");
	}
}
public class Subclass extends Superclass {

    public void printMethod() {
        super.printMethod();
        System.out.println("Printed in Subclass");
    }
    public static void main(String[] args) {
        Subclass s = new Subclass();
        s.printMethod();    
    }
}
// 결과:
// Printed in Superclass
// Printed in Subclass

또한 수퍼클래스의 생성자는 멤버가 아니라 서브클래스에서 직접적으로 사용할 수는 없지만 super 키워드를 이용하면 서브클래스의 생성자 구현부분에서 불러와 사용할 수 있다.

super() 로는 수퍼클래스의 인자없는 생성자가, super(param list) 로는 인자와 매치되는 생성자가 호출되게 된다. 수퍼클래스의 생성자가 명시적으로 호출되지 않는다면 자바 컴파일러가 인자없는 생성자를 불러와주지만 수퍼클래스에 인자없는 생성자가 없다면 컴파일 에러가 발생하게 된다.

메소드 오버라이딩

인스턴스 메서드

서브클래스에서 수퍼클래스의 인스턴스 메서드의 이름, 인자의 타입과 수, 리턴타입을 같게 하면 해당 인스턴스 메서드의 오버라이딩이 가능하다. 수퍼클래스의 메서드와 비슷하지만 필요에 따라 다른 행동을 구현하고 싶을 때 수퍼클래스의 인스턴스 메서드를 오버라이딩 한다.

인스턴스 메서드를 오버라이딩하면 서브타입을 리턴해도 되는데 이러한 타입을 covariant return type이라고 부른다.