더북(TheBook)

이제 Rental 타입을 새로 추가하고 Rental 타입에도 Cost() 메서드를 정의해 보자.

type Rental struct {
    name         string
    feePerDay    float64
    periodLength int
    RentalPeriod
}
 
type RentalPeriod int
 
const (
    Days RentalPeriod = iota
    Weeks
    Months
)
 
func (p RentalPeriod) ToDays() int {
    switch p {
    case Weeks:
        return 7
    case Months:
        return 30
    default:
        return 1
    }
}
 
func (r Rental) Cost() float64 {
    return r.feePerDay * float64(r.ToDays()*r.periodLength)
}

main 함수에서 ItemRental 타입 값을 생성하고, 마찬가지로 생성한 값을 displayCost() 함수에 전달하여 Cost()를 출력한다.

func main() {
    shirt := Item{"Men's Slim-Fit Shirt", 25000, 3}
    video := Rental{"Interstellar", 1000, 3, Days}
           
    displayCost(shirt) // cost: 75000
    displayCost(video) // cost: 3000
}

코드에서 ItemRental 타입은 Coster 인터페이스와 아무런 연결 고리가 없다. ItemRental 타입에 Coster 인터페이스에 정의된 메서드와 형태가 같은 Cost() 메서드가 정의되어 있을 뿐이다. 다시 말해 ItemRental 타입은 Cost() 메서드를 통해 인터페이스에서 정의한 것과 같은 방식으로 사용될 수 있고, 이 말은 즉 ItemRental 타입이 Coster 인터페이스로 사용될 수 있다는 것을 의미한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.