[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 언어의 리플렉션과 타입 정보는 변수의 동적 조작을 가능케 하며, 이를 통해 유연하고 동적인 프로그래밍을 할 수 있습니다. 그러나 리플렉션은 성능 면에서 부담을 줄 수 있으므로 신중하게 사용해야 합니다.
참고 문헌:
- The Laws of Reflection (Go Blog)
- The reflect package (pkg.go.dev)
이상으로 Go 언어에서의 리플렉션과 타입 정보에 대해 알아보았습니다.