[Effective Java] 아이템65 - 리플렉션보다는 인터페이스를 사용하라

Method.invoke 와 같이 리플렉션 기능을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있다. Class 객체가 주어지면 그 클래스의 Constructor, Method, Filed 인스턴스를 가져올 수 있고 인스턴스로부터 그 클래스의 멤버이름, 필드타입, 메서드 시그니처 등을 가져올 수 있다.

리플렉션을 이용하면 컴파일 당시에 존재하지 않던 클래스도 이용할 수 있는데, 단점이 존재한다.

  • 컴파일타임 타입 검사가 주는 이점을 누릴 수 없다.
    • 리플렉션 기능을 써서 존재하지 않거나 접근할 수 없는 메서드를 호출하려고 하면 런타임 오류가 발생한다.
  • 리플랙션을 이용하면 코드가 지저분하고 장황해진다. (어렵다는 뜻이다)
  • 성능이 떨어진다.
    • 일반 메서드 호출보다 훨씬 느리다. (new 메서드로 생성하면 될 것을 복잡하게 생성하기 때문이다.)

리플렉션은 아주 제한된 형태로만 사용해야 그 단점을 피하고 이점만 취할 수 있다.

리플렉션은 객체 생성에만 사용하고, 생성한 객체를 이용할 때는 적절한 인터페이스나 컴파일 타임에 알 수 있는 상위 클래스로 참조해 사용하자

Class<? extends Set<String>> cl = (Class<? extends Set<String>>) Class.forName(args[0]);
Constructor<? extends Set<String>> cons = cl.getDeclaredConstructor();

댓글남기기