상속은 한 타입을 그대로 사용하면서 구현을 추가할 수 있도록 해주는 방법을 제공한다.

public class Lotto {
    private List<Integer> numbers;

    public Lotto(List<Integer> numbers) {
        this.numbers = numbers;
    }

    public int match(List<Integer> numbers) {
        // 전부 일치하면 6을 반환
    }
}

여기서 match라는 기능을 확장해서 사용하려하면 상속을 사용해서 문제를 해결할 수 있다.

class OtherLotto extends Lotto {
    private List<Integer> numbers;

    public OtherLotto(List<Integer> numbers) {
        super(numbers);
    }

    @Override
    public int match(List<Integer> numbers) {
        // 다른 로직으로 기능을 확장할 수 있다
    }
}

이때 상속 대상이 되는 Lotto 클래스를 상위 클래스 또는 부모 클래스라고 부르고, 상속을 받는 클래스를 하위 클래스 또는 자식 클래스라고 부른다. 자식 클래스는 부모 클래스에 정의된 구현을 물려받는다.

하위 클래스는 필요에 따라 상위 클래스에 정의된 메서드를 새롭게 구현할 수 있는데 이를 재정의(Overriding)라고 한다. 메서드를 재정의하면 메서드를 실행할 때 상위 타입의 메서드가 아닌 하위타입의 메서드가 실행된다.

다형성과 상속

다형성은 한 객체가 여러가지 모습을 갖는 것을 의미한다. 모습은 타입을 의미한다. 다형성은 한 객체가 여러 타입을 가질 수 있다는 것을 의미한다.

객체는 여러 타입에 정의된 기능을 제공할 수 있다.

객체는 여러 타입에 정의된 기능을 제공할 수 있다.

위와 같은 로또는 기능 요청에따라 다양한 로또가 될 수 있다. 여러가지 타입을 가질 수 있기에 다형성이라 부를 수 있다.

인터페이스 상속과 구현 상속

자바에서 상속은 인터페이스 상속과 구현 상속으로 구분할 수 있다. 인터페이스 상속은 타입 정의만 상속을 받는 것이다. 자바의 인터페이스나 추상 클래스를 상속받는 경우가 이에 속한다. 자바는 다중 상속을 지원하지 않아 인터페이스를 이용해 객체가 다형을 갖는다.

스크린샷 2022-03-05 오전 3.19.55.png

SNS는 Text와 Picture 인터페이스를 상속받는다. SNS 클래스의 객체는 Text타입도 되고 Picture 타입도 된다. SNS는 Picture와 Text의 인터페이스에 정의된 메서드를 구현하게 된다. Text와 Picture 인터페이스는 메서드의 시그니처만 제공할 뿐 실제 구현은 제공하지 않는다. 실제 구현 코드는 SNS가 하게 된다. 구현 상속은 클래스 상속을 통해 이루어진다. 구현 상속은 보통 상위클래스에 정의된 기능을 재사용하기 위한 목적으로 사용된다.

구현상속은 재정의를 통해 상위 타입에 정의된 기능을 자신에 맞게 수정할 수 있다.