본문 바로가기
Work/Java

[Java] Annotation 어노테이션 - 총정리

1. 어노테이션이란?

 

자바 어노테이션(Java Annotation)

에노테이션은 주석이라는 의미를 가진다.

자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용하는데,  JDK 1.5 버전 이상에서 사용 가능하다.

 

어노테이션의 용도

  1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
  2. 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
  3. 실행시(런타임시)특정 기능을 실행하도록 정보를 제공

 

내장 애너테이션

7개의 표준 어노테이션 중에 3개가 java.lang의 일부이며,

나머지 4개는 java.lang.annotation으로부터 가져온다.

 

 

 

2. 어노테이션 종류

 

자바 코드에 적용되는 내장 어노테이션

@Override

  • 선언한 메서드가 오버라이드 되었다는 것을 나타냅니다.
  • 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킵니다

@Deprecated

  • 해당 메서드가 더 이상 사용되지 않음을 표시합니다.
  • 만약 사용할 경우 컴파일 경고를 발생 키십니다.

@SuppressWarnings

  • 선언한 곳의 컴파일 경고를 무시하도록 합니다.

@SafeVarargs

  • Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시합니다.

@FunctionalInterface

  • Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션입니다.
  • 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생 시킵니다.

 

 

기타 어노테이션에 적용되는 어노테이션 (메타 애터네이션)

@Retention

  • 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정합니다.
  • 종류는 다음과 같습니다.
    • RetentionPolicy.SOURCE : 컴파일 전까지만 유효. (컴파일 이후에는 사라짐)
    • RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
    • RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)

@Documented

  • 해당 어노테이션을 Javadoc에 포함시킵니다.

@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 : 타입 선언

@Inherited

  • 어노테이션의 상속을 가능하게 합니다.

@Repeatable

  • Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 해줍니다.

 

 

 

3. 사용예제

 

@override 예제

다음은 @override 어노테이션의 예제이다.

public class Animal {
    public void speak() {
    }

    public String getType() {
        return "Generic animal";
    }
}

public class Cat extends Animal {
    @Override
    public void speak() { // This is a good override.
        System.out.println("Meow.");
    }

    @Override
    public String gettype() { // Compile-time error due to mistyped name.
        return "Cat";
    }
}

 

 

 

 

4. 커스텀 어노테이션

  • 커스텀 어노테이션을 이용하는 방법
    1. 어노테이션을 정의한다.
    2. 어노테이션을 클래스에서 사용한다. (타겟에 적용)
    3. 어노테이션을 이용하는 코드를 수행한다.
// 어노테이션 생성
	import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;

    @Retention(RetentionPolicy.RUNTIME)	// 런타임중에도 유효한 어노테이션임을 기술
    public @interface Count100 {	// 어노테이션은 @interface 인터페이스명으로 정의
	
    }
// 커스텀 어노테이션을 메소드에 적용
	public class MyHello {
        @Count100
        public void hello(){
            System.out.println("hello");
        }
    }
// 어노테이션이 적용된  부분인지 체크하여 코드내에서 사용

    import java.lang.reflect.Method;

    public class MyHelloExam {
        public static void main(String[] args) {
            MyHello hello = new MyHello();

            try{
                Method method = hello.getClass().getDeclaredMethod("hello");
            if(method.isAnnotationPresent(Count100.class)){
                    for(int i = 0; i < 100; i++){
                        hello.hello();
                    }
                }else{
                    hello.hello();
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }       
        }
    }

이런식으로 커스템 어노테이션을 만들어 

클래스안에서 타겟에 적용하고,

호출부에서 어노테이션이 존재하는지를 확인하면서 흐름을 제어해갈수 있다.

 

아래는 우아한 형제들에서 사용하는 커스텀 어노테이션 예제이다.

 

이를 통해 볼때,

어노테이션을 활용해, 비회원의 인증을 회피시키거나,

특정기능을 특정사용자에게만 노출시키거나 하는등에 프로그래밍에 활용한 사례를 엿볼 수 있다.

https://techblog.woowahan.com/2684/

 

시의적절한 커스텀 어노테이션 | 우아한형제들 기술블로그

{{item.name}} layout: post title: "시의적절한 커스텀 어노테이션" description: "custom annotation으로 간결하고 의도가 명확한 코드 작성하기" author: allen.song date: 2020-06-26 15:50:00 +0900 categories: experience published: t

techblog.woowahan.com

 

 

차암조오

https://elfinlas.github.io/2017/12/14/java-annotation/

http://www.devkuma.com/books/pages/460