메서드의 함수 표현식
함수를 변수에 할당하거나 또 다른 함수의 매개변수로 전달할 수 있듯이 메서드도 변수에 할당할 수 있고 함수의 매개변수로 전달할 수도 있다. 메서드의 함수 표현식은 메서드의 리시버를 첫 번째 매개변수로 전달하는 함수이다.
다음 예제에서는 rect의 area()와 resize() 메서드를 함수 표현식으로 변환하여 사용한다.
type rect struct{ width, height float64 } func (r rect) area() float64 { return r.width * r.height } func (r *rect) resize(w, h float64) { r.width += w r.height += h } func main() { r := rect{3, 4} fmt.Println("area :", r.area()) // area : 12 r.resize(10, 10) fmt.Println("area :", r.area()) // area : 182 /* area() 메서드의 함수 표현식 서명: func(rect) float64 */ areaFn := rect.area /* resize() 메서드의 함수 표현식 서명: func(*rect, float64, float64) */ resizeFn := (*rect).resize fmt.Println("area :", areaFn(r)) // area : 182 resizeFn(&r, -10, -10) fmt.Println("area :", areaFn(r)) // area : 12 }
앞서 말했듯이 이 예제에서는 다음 두 메서드를 함수 표현식으로 사용했다.
• areaFn 메서드: func(rect) float64
첫 번째 매개변수로 rect를 받는다.
• resizeFn 메서드: func(*rect, float64, float64)
첫 번째 매개변수로 *rect를 받고, 두 번째와 세 번째 매개변수로 float64를 받는다.
메서드 자체를 다른 함수의 매개변수로 전달해야 할 때는 메서드를 함수 표현식으로 변환하여 전달할 수 있다.