더북(TheBook)

메서드의 함수 표현식

함수를 변수에 할당하거나 또 다른 함수의 매개변수로 전달할 수 있듯이 메서드도 변수에 할당할 수 있고 함수의 매개변수로 전달할 수도 있다. 메서드의 함수 표현식은 메서드의 리시버를 첫 번째 매개변수로 전달하는 함수이다.

다음 예제에서는 rectarea()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를 받는다.

메서드 자체를 다른 함수의 매개변수로 전달해야 할 때는 메서드를 함수 표현식으로 변환하여 전달할 수 있다.

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