개발놀이터

어노테이션 본문

Java

어노테이션

마늘냄새폴폴 2022. 7. 20. 15:06

어노테이션의 정의

애노테이션은 인터페이스를 기반으로 한 문법으로 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있다.

 

어노테이션의 종류

어노테이션에도 종류가 있다.

 

  • 내장 어노테이션 : 자바가 기본적으로 제공해주는 어노테이션
  • 메타 어노테이션 : 어노테이션을 위한 어노테이션
  • 사용자 정의 어노테이션 : 사용자가 직접 정의하는 어노테이션

 

내장 어노테이션

메타 어노테이션을 제외한 내장 어노테이션의 종류는 다음과 같다.

 

  1. @Override
  2. @Deprecated
  3. @FunctionalInterface
  4. @SuppressWarnings

이제 하나씩 살펴보자

 

@Override

오버라이딩을 올바르게 했는지 컴파일러가 체크해준다. Override 어노테이션은 오버라이딩 할 때, 메서드의 이름을 잘못 적는 실수를 방지해준다.

 

@Deprecated

앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다. 사용하지 않을거면 없애버리면 되는데 굳이 @Deprecated를 붙이는 이유는 뭘까?

 

자바는 하위 호환성을 굉장히 중요하게 여기는 언어 중 하나이다. 이전에 해당 메소드로 개발을 진행한 프로젝트들이 있기 때문에 유지는 하되, 권장하지는 않는다.

 

@FunctionalInterface

함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지를 체크한다. 해당 어노테이션은 함수형 인터페이스의 "하나의 추상메서드만 가져야 한다는 제약"을 확인해준다. 또한, 함수형 인터페이스라는 것을 알려주는 역할도 한다.

 

@SuppressWarnings

컴파일러의 경고 메시지가 나타나지 않게 해준다. 이 어노테이션은 보통 경고가 많을 때, 확인된 경고는 해당 어노테이션을 붙여서 새로운 경고를 알아보지 못하는 것을 방지하기 위해 사용한다. 

 

 

메타 어노테이션

메타 어노테이션은 어노테이션을 위한 어노테이션이다. 종류는 다음과 같다. 

 

  1. @Target
  2. @Retention
  3. @Documented
  4. @Inherited
  5. @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