이번 편의 목표: @Override로 전자책 연체료를 바꾸고, Book 타입 변수로 실제 객체에 맞는 계산을 호출합니다.
상속만 하면 전자책도 종이책과 같은 하루 100원입니다. 계산 규칙이 다르면 부모 메서드를 자식에서 다시 정의합니다.
메서드 재정의
EBook.java의 메서드를 추가합니다. 11편의 Book.lateFee는 그대로 하루 100원입니다.
@Override
public int lateFee() {
return getLateDays() * 50;
}@Override는 부모의 메서드를 정확히 재정의하는지 컴파일러가 확인하게 합니다. 이름을 lateFees처럼 잘못 적으면 컴파일 오류가 납니다. 재정의하지 않은 새 메서드를 만든 것으로 조용히 넘어가지 않습니다.
EBook ebook = new EBook("파이썬 기초", 2, "python.epub");
System.out.println(ebook.lateFee());출력은 100입니다. 2일 곱하기 50원입니다.
부모 타입으로 다루기
계산하는 쪽은 종이책인지 전자책인지 매번 알고 싶지 않을 수 있습니다. 공통 부모 타입으로 모아 두면 반복문은 한 가지 모습만 보면 됩니다.
public class FeeList {
public static void main(String[] args) {
Book[] items = {
new Book("개미", 3),
new EBook("파이썬 기초", 2, "python.epub")
};
int total = 0;
for (Book item : items) {
total = total + item.lateFee();
System.out.println(item.getTitle() + " " + item.lateFee());
}
System.out.println(total);
}
}출력은 개미 300, 파이썬 기초 100, 합계 400입니다. 변수 타입은 Book이지만, lateFee 호출은 실제 객체를 따릅니다. 전자책 객체이면 재정의된 50원 규칙이 실행됩니다. 이것을 다형성이라고 부릅니다.
부모 타입에는 자식만의 메서드를 바로 호출할 수 없습니다. items[1].getFileName()은 Book 타입으로 보이므로 컴파일되지 않습니다. 파일 이름이 필요하면 그 객체를 전자책으로 다룰 별도의 경로가 필요합니다. 합계 계산에는 부모 메서드로 충분합니다.
직접 해 보기
종이책 1일, 전자책 4일을 배열에 넣고 연체료 합계를 출력하세요. 전자책 하루 요금은 50원입니다.
해설
합계는 100 + 200 = 300원입니다. 반복문 안에서는 item.lateFee()만 호출하면 됩니다. 종이책과 전자책을 if로 가리지 않아도 됩니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.