[go] Go 언어에서 함수 포인터와 메소드 포인터의 차이점

Go 언어는 강력한 타입 시스템을 가지고 있으며, 기능적인 측면에서 많은 유연성을 제공합니다. 이러한 유연성을 이용하여 함수 포인터와 메소드 포인터를 사용할 수 있습니다. 하지만 함수 포인터와 메소드 포인터 사이에는 몇 가지 중요한 차이점이 있습니다.

함수 포인터

함수 포인터는 변수처럼 함수를 가리킬 수 있는 포인터입니다. 이는 함수를 인수로 전달하거나 함수를 반환하는 고차 함수를 작성하는 데 유용합니다. Go에서 함수 포인터를 선언하려면 다음과 같은 구문을 사용합니다.

var add func(int, int) int

위의 예제에서 add는 매개변수로 두 개의 정수를 받고, 정수를 반환하는 함수 타입을 가리키는 함수 포인터입니다. 이제 add를 일반 함수처럼 사용하고 호출할 수 있습니다.

func sum(a, b int) int {
    return a + b
}

add = sum
result := add(1, 2) // 3

함수 포인터에 함수를 할당한 후에는 일반 함수와 마찬가지로 호출할 수 있습니다.

메소드 포인터

메소드 포인터는 구조체 타입의 메소드를 가리키는 포인터입니다. 이는 구조체 인스턴스에 결합된 메소드를 호출할 때 유용합니다. Go에서 메소드 포인터를 선언하려면 다음과 같은 구문을 사용합니다.

type Rectangle struct {
    width  int
    height int
}

func (r *Rectangle) Area() int {
    return r.width * r.height
}

type AreaFunc func(*Rectangle) int

var area AreaFunc

위의 예제에서 Rectangle 구조체에 Area 메소드를 정의하고, AreaFuncRectangleArea 메소드를 가리키는 메소드 포인터 타입입니다. area는 이제 RectangleArea 메소드를 호출할 수 있는 포인터입니다.

rect := Rectangle{width: 10, height: 5}

area = (*Rectangle).Area
result := area(&rect) // 50

메소드 포인터를 사용하여 rectArea 메소드를 호출할 수 있습니다.

결론

함수 포인터와 메소드 포인터는 Go 언어에서 다른 용도로 사용됩니다. 함수 포인터는 단순히 함수를 가리키는 포인터로 사용되며, 함수를 전달하거나 반환하기 위해 사용됩니다. 반면에 메소드 포인터는 구조체 타입의 메소드를 가리키는 포인터로 사용되며, 메소드를 호출하기 위해 사용됩니다.

이러한 차이점을 이해하고 적절하게 활용하면 Go 언어에서 더욱 효율적이고 유연한 코드를 작성할 수 있습니다.


참고 자료: