Computer Science/Java

어노테이션

eunnnn 2023. 4. 10. 09:45

어노테이션의 정의

어노테이션은 사전적 의미로는 주석이라는 뜻이다. 자바에서 사용될 때의 어노테이션은 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터(meta data: 데이터를 위한 데이터)라고 볼 수 있다.

 

 어노테이션은 다음과 같은 용도로 사용된다.

  1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
  2. 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공 (SW 개발 툴에서 어노테이션의 정보를 통해 특정 코드를 자동으로 추가할 수 있)
  3. 실행시(런타임시) 특정 기능을 실행하도록 정보를 제공

그래서 요약하자면, 어노테이션은 작성한 코드에 대해 추가적인 정보를 제공하면서 컴파일 타임 혹은 런타임 시점에서 해당 코드에 필요한 추가적인 처리를 해 주는 역할을 한다.

 

이러한 어노테이션을 사용하는 순서는 다음과 같다.

  1. 어노테이션을 정의
  2. 클래스에 어노테이션을 배치
  3. 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하고, 기능 실시

+) 추가 정보 - Reflection이란?

자바에서 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩(Dynamic Loading)하여 생성자(Constructor), 멤버 필드(Member Variables) 그리고 멤버 메서드(Member Method) 등을 사용할 수 있는 기법.

클래스의 패키지 정보, 접근 지정자, 수퍼 클래스, 어노테이션(Annotation) 등을 얻을 수 있다.


어노테이션의 종류는 다음과 같이 세 가지로 나뉜다.

  • 표준(내장) 어노테이션 : 자바가 기본적으로 제공해주는 어노테이션
  • 메타 어노테이션 : 어노테이션을 위한 어노테이션
  • 사용자 정의 어노테이션 : 사용자가 직접 정의하는 어노테이션

 

표준 어노테이션

  • @Override : 오버라이딩을 올바르게 했는지 컴파일러가 체크한다. 메서드 이름을 잘못 적는 실수 등을 방지해준다.
  • @Deprecated : 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
  • @FunctionallInterface : 함수형 인터페이스에 붙이면, 함수형 인터페이스의 "하나의 추상메서드만 가져야 한다는 제약"을 확인해준다.
  • @SuppressWarnings : 컴파일러의 경고메세지가 나타나지 않게 한다.

 

메타 어노테이션

메타 어노테이션은 어노테이션을 위한 어노테이션이다.

  • @Target : 어노테이션을 정의할 때 적용 대상을 지정하는 데 사용된다.
  • @Retention. 어노테이션이 유지되는 기간을 지정하는 데 사용된다.
  • @Ingerited : 어노테이션을 자손 클래스에 상속하고자 할 때 사용된다.
  • @Repeatable : 반복해서 붙일 수 있는 어노테이션을 정의할 때 사용된다.

 

어노테이션 정의하기

어노테이션은 다음 코드와 같은 형태로 정의하면 된다.

@interface 이름{
	타입 요소 이름(); // 어노테이션의 요소를 선언
	    ...
}
@interface DateTime{
    String yymmdd();
    String hhmmss();
}

@interface TestInfo{
    int count() default 1;
    String testedBy();
    TestType testType();
    DateTime testDate();
}


@TestInfo{
    testedBy="Kim",
    testTools={"JUnit", "AutoTester"},
    testType=TestType.FIRST,
    testDate=@DateTime(yymmdd="210922", hhmmss="211311")
)// count를 생략했으므로 default인 "count=1"이 적용된다.
public class NewClass{...}

@interface를 사용해 어노테이션을 선언할 것임을 알고, 그 옆에 어노테이션의 이름을 적으면 된다.

어노테이션 선언 과정에서 지켜야 하는 규칙은 다음과 같다.

  • 요소의 타입은 기본형, String, enum, 어노테이션, Class만 허용된다.
  • 괄호()안에 매개변수를 선언할 수 없다.
  • 예외를 선언할 수 없다.
  • 요소의 타입을 매개변수로 정의할 수 없다.(<T>)

 

출처