[인프런 워밍업클럽 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 forthRuntime 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경고를 제거하는 어노테이션으로 개발자가 의도를 가지고 설계를 했는데 컴파일은 이를 알지 못하고 컴파일 경고를 띄울 수 있기 때문에 이를 제거하는 목적이다. ◾ SafeVarargsJava 7이상에서 사용가능하고 가변인자 매개변수 사용시 경고를 무시한다 ◾ FunctionalInterfaceJava 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에 생긴 recordFIELD : 필드 값(프로퍼티), 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어노테이션을 반복적으로 선언할 수 있게 하는 어노테이션