이번 편의 목표: extends로 전자책이 종이책의 제목과 연체 일수를 물려받게 하고, super로 부모 생성자를 호출합니다.

전자책에도 제목과 연체 일수가 있습니다. 필드를 복사해 새 클래스를 만들면 검사 규칙을 두 곳에 적게 됩니다. 전자책은 종이책의 특별한 종류라고 보면 상속이 맞습니다.

부모 생성자 호출

파일 Book.java는 11편 그대로 둡니다. 전자책은 EBook.java입니다.

Java
public class EBook extends Book {
    private final String fileName;

    public EBook(String title, int lateDays, String fileName) {
        super(title, lateDays);
        if (fileName == null || fileName.isBlank()) {
            throw new IllegalArgumentException("파일 이름이 필요합니다.");
        }
        this.fileName = fileName.trim();
    }

    public String getFileName() {
        return fileName;
    }
}

extends Book은 EBook이 Book을 상속한다는 선언입니다. super(title, lateDays)는 부모 생성자를 호출합니다. 부모에게 기본 생성자가 없고 매개변수가 있는 생성자만 있으면, 자식 생성자의 첫 줄에서 super를 호출해야 합니다.

부모의 title과 lateDays는 private입니다. 자식 클래스 안에서도 그 필드를 직접 읽을 수 없습니다. getTitle과 getLateDays를 사용합니다. private은 상속되어 객체 안에 존재하지만, 접근은 선언한 클래스 안으로 제한됩니다.

Java
EBook ebook = new EBook("파이썬 기초", 2, "python.epub");
System.out.println(ebook.getTitle());
System.out.println(ebook.getLateDays());
System.out.println(ebook.getFileName());
System.out.println(ebook.lateFee());

출력은 파이썬 기초, 2, python.epub, 200입니다. lateFee는 아직 부모 규칙인 하루 100원입니다. 전자책만 하루 50원으로 바꾸는 일은 다음 편에서 메서드를 재정의하며 합니다.

자바 클래스는 부모를 하나만 둘 수 있습니다. extends 뒤에 클래스는 한 개입니다. 모든 클래스의 최상위에는 Object가 있습니다. 직접 적지 않아도 Book은 Object를 상속합니다.

직접 해 보기

EBook을 하나 만들어 파일 이름까지 출력하고, 부모의 lateFee 결과도 함께 출력하세요.

해설

Java
EBook ebook = new EBook("자바 입문", 4, "java.epub");
System.out.println(ebook.getFileName());
System.out.println(ebook.lateFee());

파일 이름은 java.epub이고 연체료는 400입니다. 4일 곱하기 100원입니다.