더북(TheBook)

인터페이스를 통한 다형성

그림 4-2처럼 타입이 다른 구조체 세 개를 정의하고, 인터페이스로 아래 구조체 세 개를 같은 방식으로 처리해 보자.

그림 4-2 다형성

먼저 Cost() float64 메서드 서명을 가진 Coster 인터페이스를 만들고, Coster 인터페이스를 매개변수로 받아 Coster 인터페이스의 Cost()를 출력하는 displayCost() 함수를 만든다.

type Coster interface {
    Cost() float64
}
 
func displayCost(c Coster) {
    fmt.Println(“cost: “, c.Cost())
}

Item 타입과 DiscountItem 타입을 정의하고 각 타입에 Cost() float64 메서드를 정의한다.

type Item struct {
    name     string
    price    float64
    quantity int
}
 
func (t Item) Cost() float64 {
    return t.price  float64(t.quantity)
}
 
type DiscountItem struct {
    Item
    discountRate float64
}
 
func (t DiscountItem) Cost() float64 {
    return t.Item.Cost()  (1.0 - t.discountRate/100)
}

Item 타입과 DiscountItem 타입은 Cost() float64 메서드를 가지므로 Coster 인터페이스로 사용할 수 있다. ItemDiscountItem 둘 다 displayCost() 함수를 통해 Cost()를 출력한다.

func main() {
    shoes := Item{“Sports Shoes”, 30000, 2}
    eventShoes := DiscountItem{
        Item{“Women’s Walking Shoes”, 50000, 3},
        10.00,
    }
    displayCost(shoes)      // cost: 60000
    displayCost(eventShoes) // cost: 135000
}

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