Meandering Trajectory

Go: 리플렉션 #1 본문

컴퓨터/GoLang

Go: 리플렉션 #1

latentis 2017. 7. 15. 18:08

리플렉션(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번째 메서드에 대응되는 오브젝트 반환.

그런데 이런 것들로 도대체 무엇을 할 수 있을까?

이어지는 글에서 리플렉션으로 할 수 있는 일에 대해 조금 더 자세히 살펴볼 예정이다.

사족: 글을 포스팅하고 난 뒤 갑자기 궁금해서 내가 가지고 있는 오래된 자바책을 펴서 리플렉션을 설명하는 부분을 봤다. 혹시나 했는데 역시나 열심히 밑줄 쳐가며 읽은 흔적이 있다. 사람은 나는 역시 망각의 동물... ㅡ.,ㅡ;;;


  1. 전문직인 그래서밥벌이 관점에서 더 중요한 의미라고 할 수 있다. [본문으로]
  2. 물론 아주 오래전 언젠가 자바를 공부했었으니 리플렉션에 대해 읽었을 수도 있다. 하지만 전혀 기억이 안 나니 리플렉션에 대해 읽은 적이 있다 하더라도 아예 몰랐던거랑 별 차이가 없다. [본문으로]
  3. Go의 associative array [본문으로]
  4. 해당 타입의 변수가 아니라 타입 자체에 대응되는 값 [본문으로]

'컴퓨터 > 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
Comments