ARCHIVES

Reflection

(주)비트나인 2015. 9. 22. 16:19



이번 포스팅에서는 reflection이 무엇인지, Java는 어떻게 reflection을 지원하는지 알아보도록 하겠습니다.




Reflection이란?


위키피디아에서는 "프로그램이 그 프로그램의 구조와 동작을 실행시간(runtime)에 살펴보고 수정하는 능력"이라고 설명하고 있습니다. 한국어 위키피디아에서는 "반영"이라는 단어를 사용했는데, "내성(內省)"이나 "내관(內觀)"이 의미적으로 더 부합되지 않나 생각해봅니다.


그렇다면 어떻게 프로그램이 자신의 구조와 동작을 살펴보고 수정할 수 있을까요? 사실 실행중인 프로그램과 그 프로그램이 다루는 자료는 모두 메모리에 있는 0과 1의 향연에 지나지 않습니다. 프로그램이란 CPU가 수행할 연산들을 나열한 자료일 뿐이죠. 여기까지 읽으셨다면, 프로그램이 자기 자신을 자료로 다룬다면 reflection이 가능하겠다 생각하실 수 있을겁니다.


Java에서는 java.lang.reflect package로 reflection을 지원하고 있습니다. 그러면 이제 "프로그램의 구조와 동작을 살펴보고 수정하는 Java의 능력"을 예제와 함께 알아보도록 하겠습니다.




살펴보고 수정하기


프로그램이 그 프로그램을 살펴본다는 것은 어떤 의미일까요? 아래의 예제 소스 코드를 통해 알아봅시다.



위 코드는 프로그램ReflectMethod 클래스에 있는 add라는 메소드를 얻어온 후 호출하고있습니다. 벌써부터 프로그램이 프로그램을 다루는 모습이 보이지 않나요? 사실 위 코드의 main 메소드는 아래와 같이 간단하게 작성할 수 있습니다.



그렇다면 첫 번째 코드와 두 번째 코드의 차이점은 무엇일까요? 바로, 두 번째 코드는 프로그래머ReflectMethod 클래스에 있는 add라는 메소드를 호출하도록 작성했다는 점입니다.


좀 더 와닿는 예제는, main 메소드의 인자(args)로 호출할 메소드의 이름("add" 혹은 "sub")을 받고, 해당하는 메소드를 호출하는 프로그램을 첫 번째 코드와 두 번째 코드에서 작성해보는 것입니다. 이건 여러분들에게 숙제로 남기도록 하고, 다음에는 Java에서 제공하는 reflection인 Proxy에 대해 알아보도록 하겠습니다.






Posted by Bitnine(비트나인)