Search

아이템65 : 리플렉션보다는 인터페이스를 사용하라

 리플렉션(java.lang.reflect)

임의의 클래스에 접근할 수 있다.
Class 객체가 주어지면 생성자, 메서드 필드에 접근 가능하다.
멤버 이름, 필드 타입, 메서드 시그니처 등 인스턴스를 가져올 수 있다.
심지어 메서드를 호출하거나 private으로 선언된 필드의 값을 가져오거나 조작이 가능하다.

 리플렉션은 어떤 단점이 있을까?

1.
컴파일타임 타입 검사가 주는 이점을 누릴 수 없다.
2.
객체만 생성하는 데도 코드가 지저분하고 장황해진다.
3.
성능이 떨어진다.
4.
많은 예외를 던져야 한다.

 단점이 많지만.. 사용할 경우 주의할 점은?

이러한 단점으로 일반적인 애플리케이션에 필요 없을 가능성이 매우 높다.
드물지만 런타임에 존재하지 않을 수도 있는 클래스, 메서드, 필드 의존성을 관리할 때 적합하다. ex) 스프링
외부 패키지를 다룰 때 유용할 수 있다.
사용하더라도 제한된 형태로 사용해야 한다.
되도록 인스턴스 생성에 쓰고, 상위 클래스나 인터페이스로 참조해 사용하자.

 핵심 정리

복잡한 특수한 경우가 아니라면 리플렉션은 사용하지 않는 것이 좋다.
단점이 치명적일 수 있다.
사용해야 하는 경우면 객체 생성에만 사용하자.
생성한 객체는 적절한 인터페이스나 상위 클래스로 변환해서 사용하자.