개발소설

[JAVA] 애너테이션 (Annotation) 본문

자바

[JAVA] 애너테이션 (Annotation)

ChaeHing 2023. 3. 8. 15:22

애너테이션 (Annotation)

  • 소스 코드가 컴파일 되거나 실행될 때에 컴파 일러 및 다른 포르그램에게 필요한 정보를 전달해주는 문법 요소
  • 주석과 같이 정보 전달을 위한 목적으로 만들어짐
    • 주석은 개발자, 사람에게
    • 애너테이션은 다른프로그램에게 정보를 전달
// @로 시작, 클래스, 인터페이스, 필드, 메서드등에 붙여서 사용 가능

public interface ExampleInterface{
    void example();
}

public class ExampleCalss implements ExampleInterface{
    @Override  // 애너테이션
    public void example() {
        
    }
}

애너테이션의 종류

  • 표준 애너테이션 : JDK에 내장되어 있는 일반적인 애너테이션    -  @Override
  • 메타 애너테이션 : 다른 애너테이션을 정의할 때 사용하는 애너테이션 
  • 사용자 정의 애너테이션 : 사용자가 직접 정의하여 사용하는 애너테이션

표준 애너테이션

  • @Override : 선언한 메서드가 상위 클래스의 메서드를 오버라이딩하거나 추상 메서드를 구현하는 메서드
  • @Deprecated : 사용하던 코드가 다른 코드로 대체되어 더이상 사용 하지 않도록 유도하는 경우
  • @SuppressWarnings : 컴파일 경고 메시지가 나타나지 않도록 사용, 경고를 예상하지만 묵인
    • @SuppressWarnings("all") : 모든 경고 억제
    • @SuppressWarnings("all") 
  • @FunctionalIterface : 함수형 인터페이스의 선인이 제대로 되어있는지 확인 하는 경우 사용, 아니라면 에러 발생
package Annotation;

public class StandardEx {
    public static void main(String[] args) {

        OldClass oldClass = new OldClass();

        oldClass.getOldField(); // 인텔리제이에서 경고 발생
                                // 더이상 사용하지 않는 코드

    }

}


class SuperClass {
    public void example(){
        System.out.println("example() of SuperClass.");
    }
}

class SubClass extends SuperClass{
    @Override // 오버라이드 확인
    public void example() {
        super.example();
    }
}

class OldClass{
    @Deprecated // 더 이상 사용하지 않는 코드
    private int oldField;

    @Deprecated // 더 이상 사용하지 않는 코드
    void getOldField(){}
}

@FunctionalInterface // 인터페이스 확인
interface InterEx{
    public abstract void example();
}

메타 애너테이션

  • @interface로 메타 애너테이션 생성 가능
@interface MetaAnno {
}
  • @Target : 애너테이션을 적용할 대상을 지정
    • java.lang.annotation.ElementType이라는 열거형에 정의 되어 있다.
    • @Target({FIELD, TYPE, METHOD})  - 여러개를 지정 할 수 있다.
대상 타입  적용범위
ANNOTATION_TYPE 애너테이션
CONSTRUCTOR  생성자
FIELD 필드 필드(멤버변수, 열거형 상수)
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER  매개변수
TYPE 타입 타입(클래스, 인터페이스, 열거형)
TYPE_PARAMETER 타입 매개변수
TYPE_USE 타입이 사용되는 모든 대상
  • @Documented : javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정
  • @Inherited : 하위 클래스가 애너테이션을 상속 받도록 한다.
  • @Retention : 애너테이션의 지속 시간을 결정
유지 정책 설명
SOURCE 소스 파일에 존재, 클래스파일에는 존재하지 않음
CLASS 클래스 파일에 존재, 실행시에 사용불가, 기본값
RUNTIME 클래스 파일에 존재, 실행시에 사용가능
  • @Repeatable : 애너테이션을 여러번 붙일 수 있도록 허용
// 애너테이션 생성
package Annotation;

import java.lang.annotation.*;

@Retention(RetentionPolicy.SOURCE) // 컴파일시에만 확인하고 사라진다.
@Inherited // 해당 애너테이션을 상위 클래스가 사용한다면 하위클래스에도 동일 하게 적용
@Documented // javadoc로 작성한 문서에 포함
@Target({ElementType.METHOD, ElementType.TYPE}) // 메서드와 타입(클래스, 인터페이스, 열거형)에 사용가능
@interface MetaAnno {
    String value();
}

// 애너테이션 생성

package Annotation;

import java.lang.annotation.*;

@interface Works {  // 여러개의 Work애너테이션을 담을 컨테이너 애너테이션 Works
    Work[] value();
}

@Repeatable(Works.class) // 컨테이너 애너테이션 지정
@interface Work {
    String value();
}


// 적용

package Annotation;

import java.lang.annotation.Repeatable;

@MetaAnno("class annotation")
@Work("first annotation") // @Repeatble에 의해 두개
@Work("Second annotation") // @Repeatable에 의해 두개
public class MetaEx {
    @MetaAnno("method annotation")
    public static void main(String[] args) {

    }

}

@MetaAnno("super")
class Super {}

class Sub extends Super{}  // @Inherited에 의해 @MetaAnno("super") 애너테이션이 붙은것으로 인식

사용자 정의 애너테이션

  • 사용자가 직접 애너테이션을 정의
@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다. 
	타입 요소명(); // 애너테이션 요소를 선언
}
  • 애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속 받을 수 없다

'자바' 카테고리의 다른 글

[JAVA] 파일 입출력(I/O)  (0) 2023.03.09
[JAVA] 람다 (Lambda)  (0) 2023.03.08
[JAVA] 컬렉션 프레임 워크 (Collection Framework)  (0) 2023.03.08
[JAVA] 예외 처리(Exception Handling)  (0) 2023.03.07
[JAVA] 제네릭 (Generic)  (0) 2023.03.07
Comments