[Go 공식문서 한국어 정리] ①4⑦. 리플렉션의 법칙
리플렉션의 법칙 (The Laws of Reflection)
https://go.dev/blog/laws-of-reflection
리플렉션(Reflection)은 프로그램이 자신의 구조, 특히 타입을 검사하는 능력입니다. Go의 리플렉션은 강력하지만 혼란스러울 수 있어, 이 글에서는 세 가지 법칙을 통해 명확히 설명합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 서론
Go는 정적 타입 언어입니다. 모든 변수는 컴파일 시점에 알려진 정확히 하나의 타입을 가집니다. 인터페이스는 고정된 메서드 집합을 나타낸다. interface{}(또는 any)는 모든 값을 저장할 수 있습니다.
② 핵심 개념
1. 인터페이스의 표현: 인터페이스 변수는 (값, 타입 기술자) 쌍을 저장합니다.
2. reflect.Type과 reflect.Value: 리플렉션의 핵심 타입입니다.
3. Settability(설정 가능성): 리플렉션 객체가 실제 저장소를 수정할 수 있는지 여부입니다.
③ 주요 내용 상세
제1법칙: 인터페이스 값 → 리플렉션 객체
reflect.TypeOf(x)와 reflect.ValueOf(x)로 인터페이스 값의 타입과 값을 추출합니다.
- Kind()는 기본 타입을 나타냅니다(int, float64, slice 등).
- Type()은 정적 타입을 반환합니다.
- Int(), Float() 등으로 값을 추출합니다.
주의: ValueOf에 전달된 인자는 복사되므로, 수정하려면 포인터를 전달해야 합니다.
제2법칙: 리플렉션 객체 → 인터페이스 값
v.Interface()로 reflect.Value를 다시 interface{}로 복원합니다.
- ValueOf의 역함수입니다.
- fmt.Println(v.Interface())처럼 사용하면 구체적인 값을 출력할 수 있습니다.
제3법칙: 수정하려면 값이 설정 가능해야 함
v.CanSet()이 true여야 SetFloat, SetInt 등이 동작합니다.
- reflect.ValueOf(x)는 x의 복사본을 받으므로 설정 불가능합니다.
- reflect.ValueOf(&x).Elem()처럼 포인터를 전달하고 Elem()으로 간접 참조해야 설정 가능합니다.
구조체 필드 수정 예시:
s := reflect.ValueOf(&t).Elem()
s.Field(0).SetInt(77)
- &t로 주소를 전달하고 Elem()으로 구조체 값을 얻습니다.
- exported(대문자) 필드만 설정 가능합니다.
④ 실전 활용
- JSON/XML 마샬링/언마샬링 라이브러리에서 구조체 태그를 읽을 때 사용합니다.
- ORM에서 데이터베이스 결과를 구조체에 매핑할 때 사용합니다.
- DI(의존성 주입) 프레임워크에서 타입을 동적으로 생성할 때 사용합니다.
- 테스트에서 비공개 필드에 접근해야 할 때(권장하지 않음) 사용할 수 있습니다.
⑤ 정리
Go 리플렉션의 세 가지 법칙:
1. 인터페이스 값에서 리플렉션 객체로 간다.
2. 리플렉션 객체에서 인터페이스 값으로 돌아간다.
3. 수정하려면 값이 설정 가능해야 한다.
이 법칙들을 이해하면 리플렉션이 훨씬 쉬워집니다. 리플렉션은 강력한 도구이지만 꼭 필요할 때만 신중하게 사용하세요.
#Go #Golang #Reflection #리플렉션 #Interface #인터페이스 #메타프로그래밍 #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30