이번 편의 목표: 제목과 연체 일수를 한 객체의 필드로 두고, 그 객체의 메서드로 연체료를 계산합니다.

메서드만 분리하면 제목과 일수는 여전히 따로 놀습니다. 클래스는 자료와 그 자료를 다루는 동작을 한 틀로 정의합니다. 객체는 그 틀로 만든 개별 책입니다.

필드와 메서드

Java
public class Book {
    String title;
    int lateDays;

    int lateFee() {
        return lateDays * 100;
    }

    public static void main(String[] args) {
        Book first = new Book();
        first.title = "개미";
        first.lateDays = 3;

        Book second = new Book();
        second.title = "공책";
        second.lateDays = 0;

        System.out.println(first.title + " " + first.lateFee());
        System.out.println(second.title + " " + second.lateFee());
    }
}

new Book()이 객체를 만듭니다. first와 second는 서로 다른 객체이므로 필드를 바꿔도 다른 객체에 영향을 주지 않습니다. 출력은 개미 300과 공책 0입니다.

인스턴스 메서드 lateFee는 static이 아닙니다. 호출할 때 어떤 객체의 일수를 쓸지 객체 이름으로 지정합니다. this.lateDays라고 적어도 같은 필드를 가리킵니다. 이름이 겹치지 않으면 this를 생략할 수 있습니다.

이 필드는 아직 누구나가 바꿀 수 있습니다. 음수 일수도 들어갈 수 있습니다. 다음 편에서 생성 시점에 검사하고 필드를 숨깁니다.

직접 해 보기

Book 객체 두 개를 만들어 연체 일수 1과 4를 넣고, 두 연체료의 합을 출력하세요.

해설

Java
public class BookSum {
    String title;
    int lateDays;

    int lateFee() {
        return lateDays * 100;
    }

    public static void main(String[] args) {
        BookSum a = new BookSum();
        a.lateDays = 1;
        BookSum b = new BookSum();
        b.lateDays = 4;
        System.out.println(a.lateFee() + b.lateFee());
    }
}

출력은 500입니다. 연습용 클래스 이름을 BookSum으로 둔 이유는 한 파일에 public class Book이 이미 있으면 파일 이름과 충돌하기 때문입니다. public 클래스는 파일 이름과 같아야 합니다.