개발놀이터
어노테이션 본문
어노테이션의 정의
애노테이션은 인터페이스를 기반으로 한 문법으로 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있다.
어노테이션의 종류
어노테이션에도 종류가 있다.
- 내장 어노테이션 : 자바가 기본적으로 제공해주는 어노테이션
- 메타 어노테이션 : 어노테이션을 위한 어노테이션
- 사용자 정의 어노테이션 : 사용자가 직접 정의하는 어노테이션
내장 어노테이션
메타 어노테이션을 제외한 내장 어노테이션의 종류는 다음과 같다.
- @Override
- @Deprecated
- @FunctionalInterface
- @SuppressWarnings
이제 하나씩 살펴보자
@Override
오버라이딩을 올바르게 했는지 컴파일러가 체크해준다. Override 어노테이션은 오버라이딩 할 때, 메서드의 이름을 잘못 적는 실수를 방지해준다.
@Deprecated
앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다. 사용하지 않을거면 없애버리면 되는데 굳이 @Deprecated를 붙이는 이유는 뭘까?
자바는 하위 호환성을 굉장히 중요하게 여기는 언어 중 하나이다. 이전에 해당 메소드로 개발을 진행한 프로젝트들이 있기 때문에 유지는 하되, 권장하지는 않는다.
@FunctionalInterface
함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지를 체크한다. 해당 어노테이션은 함수형 인터페이스의 "하나의 추상메서드만 가져야 한다는 제약"을 확인해준다. 또한, 함수형 인터페이스라는 것을 알려주는 역할도 한다.
@SuppressWarnings
컴파일러의 경고 메시지가 나타나지 않게 해준다. 이 어노테이션은 보통 경고가 많을 때, 확인된 경고는 해당 어노테이션을 붙여서 새로운 경고를 알아보지 못하는 것을 방지하기 위해 사용한다.
메타 어노테이션
메타 어노테이션은 어노테이션을 위한 어노테이션이다. 종류는 다음과 같다.
- @Target
- @Retention
- @Documented
- @Inherited
- @Repeatable
@Target
어노테이션이 적용할 위치를 선택한다. 종류는 다음과 같다.
- ElementType.PACKAGE : 패키지 선언
- ElementType.TYPE : 타입 선언
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
- ElementType.CONSTRUCTOR : 생성자 선언
- ElementType.FIELD : 멤버 변수 선언
- ElementType.LOCAL_VARIABLE : 지역 변수 선언
- ElementType.METHOD : 메서드 선언
- ElementType.PARAMETER : 전달인자 선언
- ElementType.TYPE_PARAMETER : 전달 인자 타입 선언
- ElementType.TYPE_USE : 타입 선언
@Retention
자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정한다. 종류는 다음과 같다.
- RetentionPolicy.SOURCE : 컴파일 전까지만 유효 (컴파일 이후에는 사라짐)
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
- RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)
@Documented
해당 어노테이션을 Javadoc에 포함시킨다.
@Inherited
어노테이션의 상속을 가능하게 한다.
@Repeatable
jdk 1.8부터 지우너 가능하며, 연속적으로 어노테이션을 선언할 수 있게 해준다.
사용자 정의 어노테이션
메타 어노테이션을 이용해 만든 어노테이션으로 대부분 스프링이 제공하는 어노테이션은 전부 사용자 정의 어노테이션이다. 간단한 예시만 알아보고 끝내자
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TimeCheck {
String value();
}
@TimeCheck
public Long save(Member member) {
memberRepository.save(member);
return member.getId();
}
'Java' 카테고리의 다른 글
정적 (static) (0) | 2022.07.28 |
---|---|
면접 준비 : 클래스와 객체 (0) | 2022.07.28 |
제네릭 (0) | 2022.07.17 |
컬렉션 프레임워크 (Collection Framework) (0) | 2022.07.15 |
GC (Garbage Collection)의 알고리즘 (0) | 2022.07.14 |