제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁

자바 정리를 위한 포스팅입니다.
해당 포스팅은 어노테이션 정리입니다.

 

등장 배경

과거에는 소스파일은 java파일 설정 값을 XML파일에 명시하여 관리했습니다. 변경될 수 있는 데이터들을 코드가 아닌 외부 설정 파일(XML)에 분리하기 때문에, 재컴파일 없이도 쉽게 변경사항을 저장할 수 있었습니다.

하지만, 프로그램 작성을 위해 매번 많은 설정을 해야하며, 수 많은 설정파일들을 관리해야 했습니다.

 

그에 따라서 설정파일을 업데이트를 하지 않아 코드의 실행동작과 같은 부분들이 달라지거나 개발에 대해서 불편함이 많았습니다.

source code + 설정 파일

이렇듯 하나의 파일 내에서 코드와 설정을 관리할 수 있는 어노테이션이 등장했는데

 

자바 어노테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종으로. @기호를 앞에 붙여서 사용하고, JDK 1.5 버전 이상에서 사용 가능합니다. 

 

어노테이션의 역할로는 컴파일러에게 코드 작성 문법 에러 체크하도록 정보제공, 런타임에 특정 기능을 실행하도록 정보 제공 등 하고 있습니다.

 

어노테이션 종류

어노테이션의 종류로는 세가지가 있는데,

  1. 표준 어노테이션
  2. 메타 어노테이션
  3. 사용자 정의 어노테이션

이 존재합니다

표준 어노테이션

표준 어노테이션은 자바가 기본적으로 제공해주는 어노테이션을 의미하는 것으로,

@Override, @Deprecated, @SuppressWarning, @FunctionIInterface 네 가지 어노테이션이 가장 많이 사용됩니다.

/**
 * {@code @Override} 어노테이션은 자식 클래스에서 부모 클래스의 메서드를 오버라이드할 때 사용됩니다.
 * 부모 클래스의 메서드와 일치하지 않으면 컴파일 에러가 발생합니다.
 */
class Parent {
    void run() {}
}

class Child extends Parent {
    @Override // 컴파일 에러! 잘못된 오버라이드
    void wrongOverride() {}
}


/**
 * {@code @Deprecated} 어노테이션은 해당 메서드, 클래스, 또는 필드가 더 이상 사용되지 않음을 나타냅니다.
 * 이 어노테이션이 붙은 요소는 향후 버전에서 제거될 수 있으므로, 사용을 피해야 합니다.
 */
@Deprecated
public int getInt() {
    return 1;
}

 

오버라이드 어노테이션은 잘못된 오버라이딩을 검사해주어 컴파일 에러를 야기하는 어노테이션이고, 

Deprecated 어노테이션은 개발자에게 사용하지 않는 것을 권장하는 필드나 메서드를 알리는 데에 사용하는 어노테이션입니다. 

메타 어노테이션

어노테이션을 위한 어노테이션으로 어노테이션을 정의할 때 사용 그 예시로 Target, Retention, Documented등이 있습니다.

 

Target은 어노테이션을 정의할 때 적용대상을 지정하는데 사용하는 어노테이션이며 Retention은 어노테이션이 유지되는 기간을 지정하는데 사용하는 어노테이션입니다.

/**
 * {@code @CustomAnnotation}은 메타 어노테이션 {@code @Retention}과 {@code @Target}을 사용한 예제입니다.
 * 이 어노테이션은 클래스에만 적용될 수 있으며, 런타임 동안 유지됩니다.
 */
@Retention(RetentionPolicy.RUNTIME)  // 이 어노테이션은 런타임까지 유지됩니다.
@Target(ElementType.TYPE)           // 이 어노테이션은 클래스, 인터페이스 또는 열거형에만 적용됩니다.
@interface CustomAnnotation {
    String value() default "Default Value";
}

@CustomAnnotation(value = "Hello, Metaannotations!")  // CustomAnnotation을 클래스에 적용
public class MetaAnnotation {
    public void display() {
        System.out.println("Sample class method.");
    }
}

Source는 소스파일에만 존재하는것. Runtime은 클래스파일에만 존재하는것. 실행시에 사용가능하고 Inherited는 어노테이션의 상속에 필요한 어노테이션입니다.

사용자 정의 어노테이션

어노테이션은 커스텀하여 사용할 수도 있는데, 다음과 같이 어노테이션을 생성하고, 사용하면됩니다

만약에 다른 폴더에 존재하는 파일이면 어노테이션을 import 하면 됩니다.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * {@code @LogExecutionTime} 어노테이션은 메서드의 실행 시간을 측정하고 로그로 출력하는 데 사용됩니다.
 * 이 어노테이션은 메서드에만 적용됩니다.
 */
@Retention(RetentionPolicy.RUNTIME)  // 이 어노테이션은 런타임 동안 유지됩니다.
@Target(ElementType.METHOD)         // 이 어노테이션은 메서드에만 적용됩니다.
public @interface LogExecutionTime {
}


// 다른 폴더
public class Sample {

    /**
     * 이 메서드는 실행 시간을 측정할 대상입니다.
     * {@code @LogExecutionTime} 어노테이션을 통해 실행 시간을 로깅합니다.
     */
    @LogExecutionTime
    public void performTask() {
        try {
            // 임의의 작업 (2초 지연)
            Thread.sleep(2000);
            System.out.println("Task performed.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

특징

  • 적용시 값을 지정하지 않으면, 사용될 수 있는 기본값을 지정할 수 있다.
  • 요소가 하나이고 이름이 value일 때는 요소의 이름 생략가능하다.
  • 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다.

규칙

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

코드

+ Recent posts