이번 편의 목표: 종이책과 전자책이 서로 다른 하루 요율을 쓰면서, 같은 Fee 이름으로 호출되게 합니다.

interface는 메서드 목록입니다. 그 목록을 가진 타입은 인터페이스 값으로 넘길 수 있습니다. implements 키워드는 없습니다. 메서드가 있으면 구현입니다.

Go
package main

import "fmt"

type Overdue interface {
	Fee() int
}

type Paper struct {
	Days int
}

type Ebook struct {
	Days int
}

func (paper Paper) Fee() int {
	if paper.Days <= 0 {
		return 0
	}
	return paper.Days * 100
}

func (ebook Ebook) Fee() int {
	if ebook.Days <= 0 {
		return 0
	}
	return ebook.Days * 50
}

func printFee(item Overdue) {
	fmt.Println(item.Fee())
}

func main() {
	printFee(Paper{Days: 2})
	printFee(Ebook{Days: 2})
}

출력은 200과 100, 두 줄입니다. 종이책은 하루 100원, 전자책은 하루 50원입니다. printFee는 구조체 필드를 모릅니다. 인터페이스가 요구한 Fee만 호출합니다.

메서드 이름이 인터페이스와 같아야 합니다. Fee와 fee는 다른 이름입니다. 이 편은 대문자 Fee로 맞춰 두었습니다.

직접 해 보기

두 구조체의 Days를 3으로 바꿔 출력이 300과 150인지 확인하세요.

해설

종이책 3일은 300원이고 전자책 3일은 150원입니다. printFee는 수정하지 않습니다.