- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
리플렉션 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
리플렉션은 실행 시점(Runtime, 런타임)에 인터페이스나 구조체 등의 타입 정보를 얻어내거나 결정하는 기능입니다. 리플렉션은 Java, C#처럼 가상 머신 위에서 실행되는 언어나 Python, Ruby 등의 스크립트 언어에서 주로 사용하였습니다. 마찬가지로 Go 언어도 기본 패키지에서 리플렉션을 제공합니다.
간단하게 변수와 구조체의 타입을 표시해보겠습니다.
package main
import (
"fmt"
"reflect"
)
type Data struct { // 구조체 정의
a, b int
}
func main() {
var num int = 1
fmt.Println(reflect.TypeOf(num)) // int: reflect.TypeOf로 자료형 이름 출력
var s string = "Hello, world!"
fmt.Println(reflect.TypeOf(s)) // string: reflect.TypeOf로 자료형 이름 출력
var f float32 = 1.3
fmt.Println(reflect.TypeOf(f)) // float32: reflect.TypeOf로 자료형 이름 출력
var data Data = Data{1, 2}
fmt.Println(reflect.TypeOf(data)) // main.Data: reflect.TypeOf로 구조체 이름 출력
}
int
string
float32
main.Data
reflect.TypeOf 함수를 사용하면 일반 자료형이나 구조체의 타입을 알 수 있습니다. 여기서는 int, string, float32 형 변수의 자료형이 출력됩니다. 마찬가지로 구조체도 타입을 알아낼 수 있는데 Data 구조체는 main 패키지 안에 속해있기 때문에 main.Data로 나옵니다.
리플렉션으로 변수의 타입뿐만 아니라 값에 대한 상세한 정보도 얻어올 수 있습니다.
package main
import (
"fmt"
"reflect"
)
func main() {
var f float64 = 1.3
t := reflect.TypeOf(f) // f의 타입 정보를 t에 저장
v := reflect.ValueOf(f) // f의 값 정보를 v에 저장
fmt.Println(t.Name()) // float64: 자료형 이름 출력
fmt.Println(t.Size()) // 8: 자료형 크기 출력
fmt.Println(t.Kind() == reflect.Float64) // true: 자료형 종류를 알아내어
// reflect.Float64와 비교
fmt.Println(t.Kind() == reflect.Int64) // false: 자료형 종류를 알아내어 reflect.Int64와 비교
fmt.Println(v.Type()) // float64: 값이 담긴 변수의 자료형 이름 출력
fmt.Println(v.Kind() == reflect.Float64) // true: 값이 담긴 변수의 자료형 종류를
// 알아내어 reflect.Float64와 비교
fmt.Println(v.Kind() == reflect.Int64) // false: 값이 담긴 변수의 자료형 종류를
// 알아내어 reflect.Int64와 비교
fmt.Println(v.Float()) // 1.3: 값을 실수형으로 출력
}
float64
8
true
false
float64
true
false
1.3
reflect.TypeOf 함수로 float64 변수의 타입 정보 reflect.Type를 얻어왔습니다. 타입 정보로는 타입의 이름, 변수(타입)의 크기 등을 알 수 있으며 Kind 함수를 사용하면 상수 형식으로된 타입 종류도 알 수 있습니다.
reflect.ValueOf 함수로 float64 변수의 값 정보 reflect.Value를 얻어오면 타입 정보, 타입 종류, 변수에 저장된 값을 알 수 있습니다. 여기서 변수가 float64라면 v.Float(), int라면 v.Int(), string이라면 v.String()과 같이 각 타입에 맞는 함수를 사용하면 변수에 저장된 값을 가져올 수 있습니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.