학습(구)/Java(구)

어노테이션

잉아당 2021. 3. 22. 22:11
728x90

어노테이션

- 다른곳 혹은 다른 프로그램에게 제공될 어떤 기능을 알리고자 할 때 사용하는 메타데이터 입니다.

#주석 vs 어노테이션

- 주석은 개발자 혹은 유지보수자인 사람을 상대로 프로그램에 대한 설명으로 번역시 포함되지 않습니다.

- 어노테이션은 다른 프로그램을 상대로 자신의 프로그램이 제공하는 기능에 대한 설명을 알려줍니다.

 

어노테이션 정의

- 별도의 자바 파일을 사용해서 생성합니다.

- 실체를 생성하는 것이 아닌 다른 프로그램에게 어떤 기능을 제공하고자 할 때 제공 하는 기능의 사용과 관련된 정보에 대한 내용을 정의하는 타입입니다.

- @interface 를 사용하여 내용을 정의 하며 세부 내용은 블록에서 엘리먼트들을 사용하여 정의 합니다. 기본 엘리먼트의 경우 다른 엘리먼트를 사용하지 않았을 때 '이름=값'의 형식이 아닌 값만 작성이 가능합니다.

- @Target 을 사용하여 어노테이션 적용 가능 대상을 지정하는데 @Target()소괄호 안에 ElementType의 열거상수를 지정하여 나타냅니다.

ex) ElementType.FIELD

- @Retention을 사용하여 정의되는 어노테이션의 유지범위를 지정하는데 @Retention() 소괄호 안에 RetentionPolicy의 열거상수를 지정하여 나타냅니다.

ex) RetentionPolicy.RUNTIME

 

어노테이션 사용

- 기본 API로 제공되지 않는 어노테이션을 사용하기 위해서는 어노테이션 타입을 정의하는 라이브러리와 실행하는 라이브러리를 메이븐 등을 사용하여 포함시킨 후 사용해야 합니다.

- '@어노테이션이름' 으로 엘리먼트의 세부 값은 ()안에 'key = value'의 형식으로 엘리먼트에 대한 값을 지정하여 사용합니다.

- 기본 엘리먼트에 대한 값은 값만 전달하여 사용할 수 있습니다.

 

어노테이션 실행

- 어떤 어노테이션을 어느 장소에서 어떤 값을 제공하면서 사용하는지는 리플렉션 기술을 사용하여 알아낸 후 제공 받은 값들을 사용하여 약속한 기능을 수행합니다.

 

리플렉션

- Class 객체를 사용해서 클래스와 관련된 모든 정보를 구할 수 있는 행위 입니다.

- 어노테이션 관련 정보 뿐만아니라 필드, 메서드 등 모든 정보를 담고 있습니다.

- 클래스.class : 클래스로부터 Class 객체를 구하는 방법입니다.

- 객체참조변수.getClass() : 객체로부터 Class를 구하는 방법입니다.

- Class.forName("패키지를 포함한 클래스 이름") : 매개변수를 통해 동적으로 로딩되는 클래스로부터 Class를 구할 수 있습니다. 

- 동적으로 결정되는 경우 newInstance()메서드를 통해 객체를 초기화하며 생성할 수 있습니다.

- 내가 어떤 객체를 생성해야 하는지 알고 있는 경우에는 new 연산자를 사용해서 생성합니다.