이번 편의 목표: 연체료 계산과 일수 증가를 책 타입의 메서드로 붙입니다.

func와 이름 사이에 받는 값을 적으면 메서드입니다. 값이 복사되기를 원하면 Book을 받고, 호출자의 책을 바꾸려면 *Book을 받습니다. 변수에서 포인터 메서드를 호출하면 컴파일러가 주소를 넘깁니다.

Go
package main

import "fmt"

type Book struct {
	Title string
	Days  int
}

func (book *Book) addDay() {
	book.Days++
}

func (book Book) fee() int {
	if book.Days <= 0 {
		return 0
	}
	return book.Days * 100
}

func main() {
	book := Book{Title: "생각나무", Days: 3}
	book.addDay()
	fmt.Println(book.fee())
}

출력은 400입니다. addDay가 Days를 3에서 4로 바꾸고, fee가 4 * 100을 돌려줍니다. fee는 책을 복사해서 읽기만 하므로 필드를 바꾸지 않습니다. addDay를 값 수신자로 만들면 복사본의 일수만 늘어나고, main의 book.Days는 3으로 남습니다.

직접 해 보기

addDay를 두 번 호출한 뒤 fee를 출력하세요. 시작이 3이면 결과는 500입니다.

해설

호출마다 일수가 1 늘어납니다. 3에서 두 번 늘어나면 5이고, 연체료는 500입니다.