본문 바로가기

Effective Java

[이펙티브 자바] 아이템 65. 리플렉션보다는 인터페이스를 사용하라

 

 

1) 리플렉션(reflection)이란?

 

 

 

- 리플렉션 기능(java.lang.reflect)을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있습니다.

  Class 객체가 주어지면 그 클래스의 생성자, 메서드, 필드에 해당하는 

  Constructor, Method, Field 인스턴스를 가져올 수 있습니다. 

  그리고 이 인스턴스들로는 그 클래스의 멤버 이름, 필드 타입, 메서드 시그니처 등을 가져올 수 있습니다. 

 

- 나아가 Constructor, Method, Field 인스턴스를 이용해 각각에 연결된 

  실제 생성자, 메서드, 필드를 조작할 수도 있습니다. 

  이 인스턴스들을 통해 해당 클래스의 인스턴스를 생성하거나, 메서드를 호출하거나,

  필드에 접근할 수 있다는 뜻입니다. 

 

-  예를 들어, Method.invoke는 어떤 클래스의 어떤 객체가 가진 어떤 메서드라도 

   호출할 수 있게 해줍니다. 

   

 

2) 리플렉션(reflection)의 단점

 

(1) 컴파일타임 타입 검사가 주는 이점을 하나도 누릴 수 없다

- 리플렉션을 사용하면, 코드에서 타입이나 메서드를 동적으로 다룹니다. 

  따라서 프로그램이 리플렉션 기능을 써서 존재하지 않는 

  혹은 접근할 수 없는 메서드를 호출하려 시도하면  런타임 오류만 검출 가능합니다.

 

(2) 리플렉션을 이용하면  코드가 지저분하고 장황해진다

- 지루한 일이고, 읽기도 어렵습니다.

 

(3) 성능이 떨어진다

- 리플렉션을 통한 메서드 호출은 일반 메서드 호출보다 훨씬 느립니다.