[go] Go 언어에서 메소드 포인터

Go 언어는 함수형 언어로서, 함수를 변수로 할당하거나 다른 함수로 전달하는 것이 가능합니다. 이러한 기능을 이용하여 메소드 포인터를 사용할 수 있습니다. 메소드 포인터란 특정 객체의 메소드를 가리키는 포인터로, 해당 객체에 대한 메소드를 호출하는 것이 가능합니다. 이를 통해 동적으로 메소드를 선택해서 실행하거나, 다양한 객체에 대한 메소드를 통합적으로 호출할 수 있습니다.

메소드 포인터 정의하기

메소드 포인터를 정의하기 위해서는 type 키워드를 사용하여 포인터 형을 선언해야 합니다. 아래의 예시를 살펴보겠습니다.

type Person struct {
    name string
    age  int
}

func (p Person) SayHello() {
    fmt.Println("Hello,", p.name)
}

func main() {
    p := Person{"Alice", 27}

    var sayHello func()
    sayHello = p.SayHello

    sayHello()
}

위 코드에서 Person 구조체에 SayHello 메소드를 정의했습니다. 그리고 main 함수에서 Person 객체를 생성하고, sayHello 변수를 선언하여 p.SayHello 메소드를 할당했습니다. 이후 sayHello 함수를 호출하면, Person 객체에 대한 SayHello 메소드가 실행됩니다.

동적으로 메소드 선택하기

메소드 포인터를 사용하면 동적으로 메소드를 선택해서 실행할 수 있습니다. 예를 들어, 다양한 객체에 대한 메소드를 통합적으로 호출해야 할 때 유용합니다. 아래의 예시를 살펴보겠습니다.

type Dog struct {
    name string
}

func (d Dog) Bark() {
    fmt.Println(d.name, "barks!")
}

type Cat struct {
    name string
}

func (c Cat) Meow() {
    fmt.Println(c.name, "meows!")
}

func main() {
    animals := []interface{}{
        Dog{"Max"},
        Cat{"Lucy"},
        Dog{"Buddy"},
    }

    for _, animal := range animals {
        switch v := animal.(type) {
        case Dog:
            v.Bark()
        case Cat:
            v.Meow()
        }
    }
}

위 코드에서 DogCat 구조체에 각각 BarkMeow 메소드를 정의했습니다. 그리고 main 함수에서 animals 슬라이스에 다양한 동물 객체를 저장하고, 반복문을 통해 각 동물에 대한 메소드를 호출하고 있습니다. 이때 switch문을 사용하여 객체의 타입에 따라 적절한 메소드를 선택하여 실행하고 있습니다.

결론

Go 언어에서 메소드 포인터를 사용하면 동적으로 메소드를 선택하거나 다양한 객체에 대한 메소드를 호출하는 것이 가능합니다. 이를 통해 유연하고 효율적인 프로그래밍을 할 수 있습니다.