java.lang.reflect의 핵심 리플렉션 기능을 이용하면 메모리에 적재된 클래스으 ㅣ정보를 가져오는 프로그램을 작성할 수 있다. Class객체가 주어지면, 해당 객체가 나타내는 클래스의 생성자, 메서드, 필드 등을 나타내는 Constructor,Method,Field 객체들을 가져올 수 있다. 게다가 이렇게 얻은 객체들로 거기 연결되어 있는 실제 생성자, 메서드, 필드들을 조작할 수 있다. 하지만 이런 능력에는 대가가 따른다.

  • 컴파일 시점에 자료형을 검사함으로써 얻을 수 있는 이점들을 포기해야 한다. 리플렉션을 통해 존재하지 않는,또는 접근 할 수 없는 메서드를 호출하면 실행 도중에 오류가 발생할 것이다. 그러니 특별히 주의해야 한다.
  • 리플렉션 기능을 이용하는 코드는 가독성이 떨어진다. 
  • 성능이 낮다. 리플렉션을 통한 메서드 호출 성능은 일반적인  메서드 호출에 비해 훨씬 낮다.
 리플렉션 기능은 원래 컴포넌트 기반 응용프로그램 저작도구를 위해 설계된 기능이었다. 그런 도구는 보통 요청에 따라 클래스를 메모리에 올린 다음, 리플렉션 기능을 통해 어떤 메서드와 생성자가 지원되는지를 알아낸다. 하지만 일단 완성된 프로그램은 리플렉션을 더 이상 사용하지 않는다. 리플렉션을 설계할 때만 활용된다. 따라서 일반적인 프로그램은 프로그램 실행 중에 리플렉션을 통해 객체를 이용하려 하면 안된다는 것이다. 

 하지만, 이러한 리플렉션을 아주 제한적으로만 사용하면 오버헤드는 피하면서도 리플렉션의 다양한 장점을 누릴 수 있다. 객체 생성은 리플렉션으로 하고 객체 참조는 인터페이스나 상위 클래스를 통하면 된다. 

요약

리플렉션은 특정한 종류의 복잡한 시스템 프로그래밍에 필요한, 강력한 도구다. 하지만 단점이 많다. 컴파일 시점에는 알 수 없는 클래스를 이용하는 프로그램을 작성하고 있다면, 리플렉션을 사용하되 가능하면 객체를 만들 때만 이용하고, 객체를 참조할 때는 컴파일 시에 알고 있는 인터페이스나 상위 클래스를 이용하라.



+ Recent posts