[인프런 워밍업클럽 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
어노테이션을 반복적으로 선언할 수 있게 하는 어노테이션