본문 바로가기

Programming/Java

[Java] Annotation, Annotation Processing, Reflection

Annotation

Annotation

자바 어노테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 본질적인 목적은 소스코드에 메타데이터를 표현하는 것. 단순히 부가적인 표현뿐만이 아닌 리플렉션을 이용하면 어노테이션 지정만으로도 원하는 클래스를 주입하는 것이 가능해진다.

참고 : Java Annotation이란?, Java - Annotation(어노테이션 활용 예제1), Java Annotation: 인터페이스 강요로부터 자유를…(어노테이션 활용 예제2), 깔끔한 정리

Annotation Processing

컴파일 단계에서 어노테이션만 가지고 자바코드를 만들어내는데 사용됨. Room, DataBinding, Glide, ButterKnife, Retrofit 등에서 활용. 어노테이션들을 가지고 어노테이션 프로세서는 지지고 볶음.

어노테이션 프로세서를 활용하면 어노테이션만으로도 여러가지 모델 클래스들을 만들어낼 수 있는 팩토리를 구성할 수 있다.

그래서 Room 쓸 때 @Entity, @Database 와 같은 어노테이션들을 붙이면 알아서 모델 클래스들을 생성해주는 듯 싶다. 그리고 Room 사용할 때도 그래들에 어노테이션 프로세서도 함께 추가해줘야한다는 것이 기억난다.

참고 : Annotation Processing : Don’t Repeat Yourself, Generate Your Code., Annotation Processing 101 (번역)

Reflection

리플렉션이란 객체를 통해 클래스의 정보를 분석해내는 프로그램 기법. 투영, 반사라는 사전적인 의미를 지니고있다. 리플렉션은 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API이다.

그런데 한가지 의문점이 있다. “내가 만드는 프로그램의 코드 흐름인데, 내가 사용할 클래스의 이름과 타입을 모르는 경우가 있을까?” 일반적으로 만나기 힘든 경우지만, 코드 작성 시점에는 어떤 타입의 클래스를 사용할 지 모르는 경우가 있다. 다시말해, 런타임에 현재 실행되고있는 클래스를 가져와서 실행해야한다는 것이다.

대표적으로 프레임워크나 IDE에서 이러한 동적 바인딩을 이용한 기능을 제공하는데 IntelliJ의 자동완성, 스프링 프레임워크의 어노테이션과 같은 기능이 코드를 설계하고 작성할 당시에는 사용될 클래스가 어떤 타입인지 알 수 없지만, 리플렉션을 이용해서 코드를 일단 작성하고 런타임에 확인해서 활용할 수 있도록 하는 메커니즘이다.

객체의 타입은 알고있지만 형변환을 할 수 없는 상태에서 리플렉션으로 객체의 메서드를 호출할 수 있다.

리플렉션의 가장 기초적인 쓰임은, 클래스에서 정의한 메소드가 무엇인지 찾아내는 것이다. getDeclaredMethods 를 통해서 메소드 리스트, getMethods를 사용해서 상속된 메소드에 대한 정보를 얻을 수 있다.

그 외 제공하는 기능들
  • Reflection 을 사용한 Set up
  • Simulating the instanceof Operator
  • 생성자에 대한 정보 얻기
  • Class Field 찾기
  • 이름으로 메소드 실행하기
  • 새로운 객체 만들기
  • 필드값 바꾸기

참고 : 자바의 리플렉션, Java Reflection 개념 및 사용법

'Programming > Java' 카테고리의 다른 글

[Java] toString() 메서드  (0) 2018.09.03