[go] Go 언어에서 메소드 리터럴

Go 언어는 객체 지향 프로그래밍을 지원하는데, 메소드는 객체의 동작을 정의하는 함수입니다. 일반적으로 메소드는 타입에 연결되어 사용됩니다. 하지만 Go 언어에는 메소드 리터럴이라는 기능이 제공되어, 메소드를 변수에 할당하거나 함수의 인자로 전달할 수 있습니다.

메소드 리터럴은 익명 함수와 유사한 형태를 가지며, 타입과 함수의 본문을 포함합니다. 메소드 리터럴은 func 키워드를 사용하여 정의되며, 타입과 메소드명 사이에 ()를 사용해 인자를 전달할 수 있습니다.

type Person struct {
    Name string
    Age  int
}

func (p Person) GetName() string {
    return p.Name
}

func main() {
    p := Person{
        Name: "John",
        Age: 30,
    }

    // 메소드 리터럴을 변수에 할당
    getName := p.GetName
    name := getName()
    fmt.Println(name) // "John"
}

위의 예시에서는 Person이라는 타입에 GetName()이라는 메소드를 정의했습니다. main() 함수에서는 Person 객체를 생성하고, 해당 객체의 GetName() 메소드를 메소드 리터럴로 변수에 할당한 후 호출했습니다.

메소드 리터럴을 사용하면 기존의 메소드를 다른 함수로 전달할 수 있습니다. 예를 들어, 슬라이스에 대해서 메소드를 정의하고, 해당 메소드를 sort 패키지의 Sort() 함수의 인자로 전달하여 정렬할 수 있습니다.

type Numbers []int

func (n Numbers) Len() int {
    return len(n)
}

func (n Numbers) Less(i, j int) bool {
    return n[i] < n[j]
}

func (n Numbers) Swap(i, j int) {
    n[i], n[j] = n[j], n[i]
}

func main() {
    nums := Numbers{5, 2, 9, 1, 3}
    sort.Sort(nums)
    fmt.Println(nums) // [1 2 3 5 9]
}

위의 예시에서는 Numbers라는 타입에 Len(), Less(), Swap() 메소드를 정의했습니다. 이 메소드들은 sort.Interface 인터페이스의 요구사항을 충족시킵니다. 그래서 Numbers 타입의 슬라이스를 sort.Sort() 함수에 전달하여 정렬할 수 있습니다.

메소드 리터럴은 Go 언어의 강력한 기능 중 하나로, 객체 지향적인 프로그래밍에서 유연한 코드 구성을 가능하게 해줍니다. 이를 통해 코드의 재사용성과 가독성을 높일 수 있으며, 유지 보수에도 도움이 됩니다.

더 자세한 내용은 Go 언어 공식 문서를 참조하시기 바랍니다.