어노테이션

위키원
tjdgus399 (토론 | 기여)님의 2020년 8월 12일 (수) 10:37 판
이동: 둘러보기, 검색

자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @ 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.[1]

개요

어노테이션이란 java 5부터 등장한 기능이며 @를 이용한 주석, 자바코드에 주석을 달아 특별한 의미를 부여한 것이다.

또한 컴퍼일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보를 추가하는 정형화된 방법이다.[2]

어노테이션이 붙은 코드는 어노테이션의 구현된 정보에 따라 연결되는 방향이 결정된다. 따라서 전체 소스코드에서 비즈니스 로직에는 영향을 주지는 않지만 해당 타겟의 연결 방법이나 소스코드의 구조를 변경할 수 있다.

쉽게 말해서 "이 속성을 어떤 용도로 사용할까, 이 클래스에게 어떤 역할을 줄까?"를 결정해서 붙여준다고 볼 수 있다.
어노테이션은 소스코드에 메타데이터를 삽입하는 것이기 때문에 잘 이용하면 구독성 뿐 아니라 체계적인 소스코드를 구성하는데 도움을 준다.

// 어노테이션 사용의 예
@CanSale
public class Apple{
    ...
}

Annotation은 위의 예시와 같이 @(;AT)을 앞에 붙여서 표현한다. 이 어노테이션은 자바가 기본적으로 제공하기도 하고(@Deprecated, @Override, @SuppressWarning), 개발자가 직접 정의해서 사용할 수 있다. 개발자는 어노테이션을 붙일 타겟과 유지시기 등을 설정하여 자신이 원하는 용도로 활용 가능하다. 이 기능을 잘 활용한다면, 비즈니스 로직과는 별도로 시스템 설정과 관련된 부가적인 사항들은 @에게 위임하고 개발자는 비즈니스 로직 구현에 집중할 수 있다. 따라서 어노테이션을 통해 우리는 AOP(Aspect Oriented Programming; 관심지향프로그래밍)을 편리하게 구성할 수 있다. 어노테이션은 컴파일시기에 처리될 수도 있고 자바의 리플렉션을 거쳐서 런타임에 처리될 수도 있다. 리플렉션은 실행 중인 자바 클래스의 정보를 볼 수 있게 하고, 그 클래스의 구성 정보로 기능을 수행할 수 있도록 한다. 따라서 자바는 리플렉션 기능이 있기 때문에 어노테이션을 더욱 효율적으로 사용할 수 있다. [3]

특징

어노테이션(Annotation) 사용

Annotation.PNG 어노테이션은 소스코드에 붙이는 하나의 라벨이라고 생각하면 이해가 쉽다. 위 그림은 커스텀 어노테이션의 사용과 실행 절차를 사과가 포장되는 과정에 비유하여 설명하고 있다. 판매가능한 사과에는 판매가능(@CanSale)라벨지를 달아서 포장과정시 이를 판별하여 제품을 포장한다고 가정해 본다면. 먼저, 타겟에 적합한 라벨지를 만들어야 한다. 라벨에는 이 라벨을 붙일 대상을 명시하고, 라벨은 언제까지만 타겟에 부착할 것인지 등을 적는다. 그리고 라벨에 이름을 적으면 라벨이 만들어진다. 사과의 상태에 따라 판매가능 라벨을 부착한다. 즉, 싱싱한 사과라는 타겟에 판매가능이라는 어노테이션을 부착한 것이다. 그럼 제품포장 과정에서는 이 라벨을 보고 판별하여 제품을 포장할 것이다. 이렇게 제품 포장 기능이 실행되어진다.

이와같이 어노테이션을 직접 정의해서 사용하기 위해서는 먼저 어노테이션을 정의한 후, 원하는 타겟에 적용한다. 그 후 어노테이션이 붙은 타겟을 어떻게 사용할 지 기능을 구현하면, 해당 기능이 실행될 때 타겟에 붙은 어노테이션에 따라서 타겟의 경로가 결정될 것이다.

용도

  • @Override 어노테이션처럼 컴파일러를 위한 정보를 제공하기 위한 용도
  • 스프링 프레임워크의 @Controller 어노테이션처럼 런타임에 리플렉션을 이용해서 특수 기능을 추가하기 위한 용도
  • 컴파일 과정에 어노테이션 정보로부터 코드를 생성하기 위한 용도


애너테이션

내장 애너테이션

자바에서 기본적으로 제공하는 어노테이션들이다.

  • @Override

해당 메소드가 부모 클래스에 있는 메소드를 재정의했다는 것을 명시적으로 선언한다.

  • @Deprecated

더 이상 사용되지 않는 클래스나 메소드 앞에 추가한다.

  • @SuppressWarnings

프로그램에는 문제가 없는데 간혹 컴파일러가 경고를 뿜을때가 있다.
이를 무시하라고 프로그래머에게 알려준다.

  • @safeVarargs

제너릭같은 가변인자 매개변수를 사용할 때 무시한다.(java 7 이상)

  • @FunctionalInterface

람다 함수 등을 위한 인터페이스를 지정한다.
메소드가 없거나 두개 이상이 되면 컴파일 오류가 난다.(java 8 이상)

메타 애너테이션

Meata Annotation을 활용해 Custom Annotation을 만들 수 있다.

  • @Retention

어떤 시점까지 어노테이션이 영향을 미치는지 결정한다.

  • @Documented

해당 어노테이션 정보가 JavaDocs(API) 문서에 포함한다.

  • @Target

어노테이션이 적용할 위치를 결정한다.

  • @Inherited

모든 자식 클래스가 부모 클래스의 어노테이션을 사용할 수 있다는 것을 선언한다.

  • @Repeatable

반복적으로 어노테이션을 선언할 수 있다.

java 7부터 추가 애너테이션이 언어에 추가되었다.[1]

  • @SafeVarargs
  • @FunctionalInterface
  • @Repeatable

각주

  1. 1.0 1.1 <자바 애너테이션>,<<위키백과>>
  2. <어노테이션(Annotation)>,<<빨간색 코딩>>
  3. <Java Annotation>,<<NEXTREE>>

참고자료

같이보기