inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Roel
0

[질문]

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

 

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

어노테이션이 가진 단점

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

 

 

@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 : 자바 패키지

TYPE_PARAMETER : 타입 매개 변수

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

MODULE : 모듈

RECORD_COMPONENT : Record 컴포넌트

 

◾ @documented

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

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

◾ @Inherited

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

◾ @Repeatable

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

백엔드 인프런워밍업클럽BE

답변 0