이번 편의 목표: 책의 데이터와 그 데이터를 읽는 함수를 클래스 하나로 묶습니다.

구조체는 데이터를 묶었습니다. 클래스는 데이터와 멤버 함수를 한 타입으로 묶고, 바깥에서 직접 바꾸면 안 되는 멤버를 숨깁니다. public은 공개, private은 그 클래스의 멤버 함수만 접근하는 영역입니다.

C++
#include <iostream>
#include <string>

class Book {
public:
    Book(int id, const std::string &title, int price)
        : id_(id), title_(title), price_(price) {}

    int id() const { return id_; }
    const std::string &title() const { return title_; }
    int price() const { return price_; }

private:
    int id_;
    std::string title_;
    int price_;
};

int main() {
    Book book(1, "개미", 12000);
    std::cout << book.id() << '\n';
    std::cout << book.title() << '\n';
    std::cout << book.price() << '\n';
    return 0;
}

Book(1, "개미", 12000)은 생성자를 호출합니다. 콜론 뒤의 목록은 멤버를 그 자리에서 초기화합니다. id()처럼 뒤에 const가 붙은 멤버 함수는 객체의 멤버를 바꾸지 않습니다. title()이 참조를 반환해도 const이므로 호출자가 제목을 바꾸지 못합니다.

멤버 이름 끝의 밑줄은 매개변수 title과 멤버 title_을 눈으로 구분하기 위한 표기입니다. main에서는 멤버 변수를 직접 대입하지 않고, 공개 함수로 값을 읽습니다.

직접 해 보기

가격만 반환하는 대신, 가격에 일수를 곱하는 연체료 함수를 Book 바깥의 함수로 만들어 3일 요금을 출력하세요. 하루 요금은 100원입니다.

해설

int fee(const Book &book, int days)처럼 책을 const 참조로 받습니다. book.price() 대신 하루 100원을 곱하면 3일의 결과는 300입니다. 이 계산은 책 가격이 아니라 연체 규칙이므로 클래스 밖에 두어도 됩니다.