일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- md600alpha
- 엘리스배열
- 고양이책
- 터미널
- 양자역학
- 프라파손
- magicsculpt
- go언어
- 음각몰드
- 다이어트
- Go
- nil
- 리플렉션
- 스플릿키보드
- 체리적축저소음
- mf642cdw
- emacs
- mistel md600 alpha
- Go 언어
- 이맥스
- driverless
- mopria
- 벤치마크
- Golang
- 패널라인
- Reflection
- Griffiths
- 바로코
- 건프라
- 키보드
- Today
- Total
Meandering Trajectory
Go: 리플렉션 #1 본문
리플렉션(reflection)의 사전적 의미는 '반사'다.
컴퓨터 프로그래머에게 리플렉션은 이런 사전적 의미 외에 다른 1 의미가 하나 더 있다. 그들 업계에서 통용되는 리플렉션은 프로그램이 실행 중에 프로그램에 포함된 타입과 메서드에 대한 정보를 조회하고 이렇게 얻은 정보를 바탕으로 메서드 실행까지도 할 수 있도록 해주는 기능이다.
사람이 자신의 얼굴을 잘 보려면 거울에 비춰(reflection)봐야 한다. 그런데 프로그램이 스스로에 대한 정보를 실행 중에 알아네는 행동 역시 거울에 비춰보는 행위와 유사하다고 볼 수 있으니 그야말로 적절한 용어선택이다.
이렇게 아는 척을 했지만 내가 업계적 의미의 리플렉션을 알게 된 것은 사실은 불과 며칠 전이다. 2 예기인 즉슨 Go로 된 오픈소스 소프트웨어의 코드를 읽다가 뭔가 괴상한 부분을 발견했고 그게 reflect 패키지를 이용한 코드였던 것.
그 코드는 메서드에 대한 정보를 읽은 뒤 관련 정보를 맵 3(map)에 담고 이후에 JSON RPC 서비스를 통해 map에 담긴 메서드들이 호출될 수 있도록 하고 있었다.
Go 언어는 reflect 패키지의를 통해 리플렉션을 지원하는데 reflect 패키지에 속한 함수 중 2가지만 소개하면:
TypeOf(i interface{}): 호출하면 입력으로 준 변수의 리플렉션 타입 4(reflect.Type 타입)을 반환.
ValueOf(i inteface{}): 호출하면 입력으로 준 변수의 값(reflect.Value 타입)을 반환.
TypeOf()가 반환한 리플렉션 타입(reflect.Type) 오브젝트 역시 여러 메서드를 가지고 있는데 역시 2가지만 살펴보자
NumMethod(): 위에서 얻은 타입에 구현된 메서드 수를 반환.
Method(): 입력값으로 숫자 i를 줬다고 가정할 때 해당 타입의 i번째 메서드에 대응되는 오브젝트 반환.
그런데 이런 것들로 도대체 무엇을 할 수 있을까?
이어지는 글에서 리플렉션으로 할 수 있는 일에 대해 조금 더 자세히 살펴볼 예정이다.
사족: 글을 포스팅하고 난 뒤 갑자기 궁금해서 내가 가지고 있는 오래된 자바책을 펴서 리플렉션을 설명하는 부분을 봤다. 혹시나 했는데 역시나 열심히 밑줄 쳐가며 읽은 흔적이 있다. 사람은 나는 역시 망각의 동물... ㅡ.,ㅡ;;;
'컴퓨터 > GoLang' 카테고리의 다른 글
Go 채널 (0) | 2017.08.09 |
---|---|
Go: 리플렉션 #2 (0) | 2017.07.16 |
Go 언어 - 벤치마크 (0) | 2017.07.08 |
Go 패키지의 정체 (0) | 2017.06.29 |
Go 언어: 환경변수 설정 (0) | 2017.05.08 |