더북(TheBook)

제네릭 컬렉션

3장에서 배열, 슬라이스, 맵에는 정해진 타입 값만 담을 수 있다고 했다. 즉, 슬라이스를 []int로 선언하면 int 타입 값만 슬라이스에 담을 수 있다. 하지만 타입을 인터페이스로 지정하면 인터페이스를 충족하는 타입 값은 어떤 값이라도 배열이나 슬라이스에 담을 수 있다.

Items 타입을 Coster 인터페이스의 슬라이스로 정의해 보자.

type Items []Coster

이렇게 정의하면 Items에는 실제 타입과 관계없이 Coster 인터페이스로 사용할 수 있는 타입(Cost() 메서드를 가진 타입)은 모두 담을 수 있다.

Items에도 Cost() 메서드를 추가하면 ItemsCoster 인터페이스로 사용할 수 있다.

func (ts Items) Cost() (c float64) {
    for _, t := range ts {
        c += t.Cost()
    }
    return
}

Items의 각 요소는 모두 Coster 인터페이스로 사용할 수 있으므로 ItemsCost() 메서드에서는 모든 요소를 반복하여 Cost()의 합을 계산한다.

이제 Item, DiscountItem, Rental 모두 Items 슬라이스 하나에 담을 수 있게 되었다. 그리고 ItemsCost() 메서드를 가지므로 displayCost() 함수로 가격을 출력할 수 있다.

func main() {
    shirt := Item{“Men’s Slim-Fit Shirt”, 25000, 3}
    video := Rental{“Interstellar”, 1000, 3, Days}
    eventShoes := DiscountItem{
        Item{“Women’s Walking Shoes”, 50000, 3},
        10.00,
    }
    items := Items{shirt, video, eventShoes}
    displayCost(items) // cost: 213000
}

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