더북(TheBook)

4.4.3 인터페이스 임베딩

구조체가 다른 사용자 정의 타입을 임베딩할 수 있었던 것과 마찬가지로 인터페이스도 다른 인터페이스를 임베딩할 수 있다. 이는 임베디드된 인터페이스의 메서드 서명을 직접 갖고 있는 것과 같은 효과를 준다.

다음 코드는 앞에서 봤던 Costerfmt.Stringer 인터페이스를 임베디드 인터페이스로 지정하여 Itemer를 정의한다.

type Itemer interface {
    Coster
    fmt.Stringer
}

Itemer 인터페이스로 사용하려면 Coster 인터페이스에 정의된 Cost() 메서드와 fmt.Stringer 인터페이스에 정의된 String() 메서드를 모두 갖고 있어야 한다.

Itemer를 임베디드 필드로 가진 Order 구조체를 정의해 보자. OrderCost() 메서드에서는 tax를 적용한 최종 가격을 계산하고, String() 메서드에서는 전체 정보를 담는 문자열을 만든다.

type Order struct {
    Itemer
    taxRate float64
}
 
func (o Order) Cost() float64 {
    return o.Itemer.Cost() * (1.0 + o.taxRate/100)
}
 
func (o Order) String() string {
    return fmt.Sprintf(“Total price: %.0f(tax rate: %.2f)\n\tOrder details: %s”,
        o.Cost(), o.taxRate, o.Itemer.String())
}

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