[go] Go 언어에서의 리플렉션과 타입 정보

Go 언어는 정적 타입 언어이지만, 리플렉션을 통해 런타임에 변수들의 타입 정보를 조사하고 조작할 수 있습니다. 리플렉션을 사용하면 변수의 동적 생성, 변경, 함수 호출 등을 할 수 있어 매우 유용합니다.

리플렉션 (Reflection)

리플렉션은 프로그램이 자기 자신을 조사하고 수정할 수 있는 능력을 가리킵니다. Go 언어에서는 reflect 패키지를 통해 리플렉션을 지원합니다.

리플렉션을 사용하려면 먼저 reflect 패키지를 임포트해야 합니다.

import "reflect"

리플렉션을 사용해 변수의 타입을 가져오거나 변경하고, 해당 타입의 메서드를 호출할 수 있습니다. 예를 들어, reflect.TypeOf 함수는 주어진 변수의 타입을 가져올 수 있습니다.

type MyStruct struct {
    Name string
    Age  int
}

func main() {
  a := MyStruct{"Alice", 30}
  t := reflect.TypeOf(a)
  fmt.Println(t)
  // Output: main.MyStruct
}

타입 정보 (Type Information)

Go 언어에서의 타입 정보는 reflect.Type으로 표현됩니다. reflect.Type은 해당 타입의 메서드와 속성들을 조사하고 타입 간의 비교를 할 수 있습니다.

예를 들어, 두 개의 변수의 타입이 동일한지 확인하려면 reflect.TypeOf를 통해 두 변수의 타입 정보를 가져온 뒤 reflect.DeepEqual 함수를 사용할 수 있습니다.

type MyStruct struct {
    Name string
    Age  int
}

func main() {
  a := MyStruct{"Alice", 30}
  b := MyStruct{"Bob", 25}
  
  t1 := reflect.TypeOf(a)
  t2 := reflect.TypeOf(b)
  
  fmt.Println(reflect.DeepEqual(t1, t2))
  // Output: true
}

결론

Go 언어의 리플렉션과 타입 정보는 변수의 동적 조작을 가능케 하며, 이를 통해 유연하고 동적인 프로그래밍을 할 수 있습니다. 그러나 리플렉션은 성능 면에서 부담을 줄 수 있으므로 신중하게 사용해야 합니다.

참고 문헌:

이상으로 Go 언어에서의 리플렉션과 타입 정보에 대해 알아보았습니다.