[인프런 워밍업클럽 BE] 1일차: 어노테이션

[질문]

  • 어노테이션을 사용하는 이유 (효과) 는 무엇일까?

     

  • Information for the compiler - Annotations can be used by the compiler to detect erros or suppress warnings.

  • Compile-time and deployment-time processing - Software tools can process annotation information to generate code, XML files, and so forth

  • Runtime processing - Some annotations are available to be examined at runtime

컴파일러에 대한 정보 - 컴파일러는 주석을 사용하여 오류를 감지하거나 경고를 억제할 수 있습니다.
컴파일 시간 및 배포 시간 처리 - 소프트웨어 도구는 주석 정보를 처리하여 코드, XML 파일 등을 생성할 수 있습니다.
런타임 처리 - 런타임 시 일부 주석을 검사할 수 있습니다.

 

어노테이션이 가진 가장 큰 장점은 간결함이다.
- 로직 흐름에 대한 컨텍스트가 응축돼 있어 적재적소에 사용된다면 불필요한 반복코드가 줄고 개발자는 비지니스 로직에 더 집중 할 수 있도록 만들어준다.

어노테이션이 가진 단점

- 어노테이션의 의도가 숨어있기 때문에 내부적으로 어떤 동작을 하게 되는지 명확하지 않다면 로직 플로우를 이해하기 어렵게 되고,
코드정리가 덜 되어 현재 사용 되지 않고 있는 어노테이션들이 있더라도 쉽사리 누군가가 손을 대기 어렵다.
하물며 ‘커스텀’ 어노테이션은 그 부담을 가중시킨다. 무분별한 어노테이션 추가가 당장의 작업 속도를 끌어올릴 순 있지만, 긴 관점에서 시의적절한 것인지를 공감할 수 있어야 한다.

 

 

  • 나만의 어노테이션은 어떻게 만들 수 있을까?

     

  • 정의: @interface키워드를 사용하여 정의

@Retention(RetentionPolicy.RUNTIME) // 어노테이션 유지되는 기간을 설정
@Target(ElementType.METHOD) // 어노테이션 적용가능한 대상(동작 대상을 지정)
public @interface CheckRoel {

}
  • 사용

public class Roel {
    @CheckRoel(value = "Custom Annotation", priority = 1)
    public void sayHello() {
        // 메소드 내용
    }
}

 

 

빌트인(built-in) 어노테이션

Java에 내장되어 있는 어노테이션으로 컴파일러를 위한 어노테이션

Override

현재 메서드가 슈퍼 클래스의 메서드를 오버라이딩(overriding)한 것임을 컴파일러에게 명시해준다.

메서드가 슈퍼클래스에 없다면 에러를 발생시기 때문에 오타와 같은 실수도 잡을 수 있다.

Deprecated

마커 어노테이션으로 다음 버전에 지원되지 않을 수도 있기 때문에 앞으로 사용하지 말라고 경고를 알린다.

IDE에 취소선으로 표시됨

SuppressWarning

경고를 제거하는 어노테이션으로 개발자가 의도를 가지고 설계를 했는데 컴파일은 이를 알지 못하고 컴파일 경고를 띄울 수 있기 때문에 이를 제거하는 목적이다.

SafeVarargs

Java 7이상에서 사용가능하고 가변인자 매개변수 사용시 경고를 무시한다

FunctionalInterface

Java 8이상에서 사용가능하고 컴파일러에게 함수형 인터페이스라는 것을 알리는 어노테이션이다.

메타 어노테이션

어노테이션에 사용되는 어노테이션으로 어노테이션을 정의(설명)하기 위해 사용된다.

 

메타 어노테이션

어노테이션에 사용되는 어노테이션으로 어노테이션을 정의하기 위해 사용

@Retention

어노테이션이 유지되는 기간(Life Time)을 설정하는 어노테이션

public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }

SOURCE : 소스파일에만 존재하고, 클래스파일에는 존재x, 컴파일러에 의해 버려진다.

CLASS : 클래스파일에는 존재하지만 런타임 시에 유지할 필요 없다는 것을 알리고 이 값이 default이다.

RUNTIME : 클래스파일에도 존재하고 런타임애 VM에 의해 유지되어 리플랙션을 통해 클래스 파일의 정보를 읽어 처리 가능하다.

@Target

어노테이션이 적용가능한 대상(동작 대상)을 지정한다.

만약 다른 타입이 온다면 컴파일 에러를 띄운다.

java.lang.annotation.ElementType 이라는 enum 타입이 정의 되어야 한다.

이 타입은 어노테이션이 어느 곳에 적용할지 그 대상을 제한하는데 사용한다.

  • 기존

TYPE : Class, Interface(어노테이션 타입 포함), enum, jdk14에 생긴 record

FIELD : 필드 값(프로퍼티), enum 상수값

METHOD : 메서드

PARAMETER : 메서드 파라미터 (매개 변수)

CONSTRUCTOR : 생성자

LOCAL_VARIABLE : 지역 변수

ANNOTATION_TYPE : 어노테이션

PACKAGE : 자바 패키지

  • jdk 1.8 이후 추가

TYPE_PARAMETER : 타입 매개 변수

TYPE_USE : 타입 사용 //jdk 9 이후

MODULE : 모듈

  • jdk 14이후 추가

RECORD_COMPONENT : Record 컴포넌트

 

@documented

어노테이션의 정보가 javadoc의 문서에 포함되도록 하는 어노테이션

javadoc은 현재 프로젝트에 대한 api를 html 형식으로 생성해주는 도구

@Inherited

자식 클래스에게도 어노테이션이 상속되도록 하는 어노테이션

@Repeatable

어노테이션을 반복적으로 선언할 수 있게 하는 어노테이션

채널톡 아이콘