[go] reflect 패키지를 활용한 타입 정보 조작

Go에서 reflect 패키지는 프로그램의 실행 중에 변수, 구조체 필드 등의 타입 정보를 조작할 수 있는 강력한 도구입니다. 이 기능을 활용하면 런타임에서 타입 정보를 동적으로 조작하여 유연하고 동적인 프로그램을 작성할 수 있습니다.

reflect 패키지 소개

import "reflect"

reflect 패키지는 Go 프로그램에서 타입 정보를 다루는 데 사용됩니다. 이 패키지를 사용하면 변수의 동적 조작, 구조체 필드의 조회 및 조작, 함수 호출 등 다양한 기능을 수행할 수 있습니다.

reflect 패키지의 활용

변수의 동적 조작

reflect 패키지를 사용하여 변수의 타입을 동적으로 확인하고 값 할당 및 조회를 할 수 있습니다.

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var num float64 = 3.14
	valueOfNum := reflect.ValueOf(num)
	fmt.Println("변수 타입:", valueOfNum.Type())
	fmt.Println("변수 값:", valueOfNum.Float())
}

구조체 필드의 조회 및 조작

구조체의 필드 정보를 동적으로 조회하고 조작할 수 있습니다.

type Person struct {
	Name string
	Age  int
}

func main() {
	p := Person{Name: "Alice", Age: 30}
	v := reflect.ValueOf(p)
	f := v.FieldByName("Name")
	fmt.Println("Name 필드 값:", f.String())
}

### 함수 호출

reflect 패키지를 사용하여 함수를 동적으로 호출할 수도 있습니다.

```go
package main

import (
	"fmt"
	"reflect"
)

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

func main() {
	addFunc := reflect.ValueOf(Add)
	args := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)}
	result := addFunc.Call(args)
	fmt.Println("결과:", result[0].Int())
}

이 외에도 reflect 패키지를 활용하여 동적으로 구조체를 생성하거나 타입 정보를 확인하는 등 다양한 기능을 수행할 수 있습니다.

결론

reflect 패키지를 활용하면 런타임 시점에서 프로그램의 타입 정보를 동적으로 다룰 수 있어 유연하고 동적인 프로그래밍을 할 수 있습니다. 그러나 이러한 유연성은 성능 저하와 코드 가독성 문제를 유발할 수 있으므로 신중하게 활용해야 합니다.

참고 자료