본문 바로가기
[JAVA]/JAVA 기본

[JAVA] 애너테이션(Annotation)

by 황원용 2022. 9. 15.
728x90

주석(Comment) & 애너테이션(Annotation)

  •  주석은 개발자의 입장에서 코드의 가독성을 높이고, 다른 개발자와의 협업에서 코드에 대한 설명을 제공하는 역할을 수행하지만, 애너테이션은 특정 코드를 사용하는 프로그램에게 정보를 전달한다. 쉽게 이야기하면 프로그램을 위한 주석이라고 할 수 있다.

 

애너테이션의 주요한 역할

  • 컴파일러에게 문법의 에러 여부를 체크하도록 정보를 제공한다.
  • 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있게 정보를 제공한다.
  • 런타임에 특정 기능을 실행하도록 정보를 제공한다.

 

 

애너테이션의 종류

표준 애너테이션 : 자바에서 기본으로 제공하는 애너테이션

표준 애너테이션 설명
@Override 컴파일러에게 메서드를 오버라이딩 하는 것이라고 알림
@Deprecated 기존의 필드나 메서드가 호환성 문제 등으로 삭제할 수 없어 남겨두고 새로운 것으로 대체된 경우, 기존의 것은 사용하지 않도록 알림
@FunctionalInterface 함수형 인터페이스의 선언이 바르게 선언되었는지 확인
@SuppressWarnings 컴파일러가 경고메세지를 나타내지 않게 함

 

@Override

class Parent {
    void abc() {}
}
class Child extends Parent{
    @Override // 오타로 인해 오버라이딩이 되지 않는 상황을 에러를 통해 사용자에게 알려줌
    void acb(){} 
}

 

@Deprecated

class Old {
    @Deprecated
    int Old1 = 1;

    @Deprecated
    int getOld1() {return Old1;};
}

 

@FunctionalInterface

@FunctionalInterface
public interface Main{
    public abstract void run(); // 단 하나의 추상 메서드만을 가져야 한다.
}

 

@SuppressWarnings

애너테이션 설명
@SuppressWarnings("all") 모든 경고를 억제
@SuppressWarnings("deprecation") Deprecated 메서드를 사용한 경우 나오는 경고 억제
@SuppressWarnings("fallthrough") switch문에서 break 구문이 없을 때 경고 억제
@SuppressWarnings("finally") finally 관련 경고 억제
@SuppressWarnings("null") null 관련 경고 억제
@SuppressWarnings("unchecked") 검증되지 않은 연산자 관련 경고 억제
@SuppressWarnings("unused") 사용하지 않는 코드 관련 경고 억제
@SuppressWarnings({"finally", "null", "unchecked"}) // 둘 이상의 경고를 한 번에 억제 가능

 

 

메타 애너테이션 : 애너테이션을 정의하기 위한 애너테이션

매타 애너테이션 설명
@Target 애너테이션을 정의할 때 적용 대상을 지정하는데 사용한다.
@Documented 애너테이션 정보를 javadoc으로 작성된 문서에 포함시킨다.
@Inherited 애너테이션이 하위 클래스에 상속되도록 한다.
@Retention 애너테이션이 유지되는 기간을 정하는데 사용한다.
@Repeatable 애너테이션을 반복해서 적용할 수 있게 한다.

 

@Target

대상 타입 적용 범위
ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입
TYPE_PARAMETER 타입 매개변수
TYPE_USE 타입이 사용되는 모든 대상

 

@Documented

 자바에서 제공하는 애너테이션 중 @Overridedhk @SuppressWarnings를 제외하고 모두 @Documeted가 적용되어 있다.

 

@Inherited

 @Inherited를 상위 클래스에 붙이면, 하위 클래스도 동일하게 적용된다.

 

@Retention

유지 정책 설명
SOURCE 소스 파일에 존재, 클래스 파일에 존재하지 않음
CLASS 클래스 파일에 존재, 실행 시에 사용불가, 기본값
RUNTIME 클래스 파일에 존재, 실행시에 사용가능

 

 

사용자 정의 애너테이션 : 사용자가 직접 정의하는 애너테이션

@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙여 애너테이션을 정의한다. 
	타입 요소명(); // 애너테이션 요소를 선언한다.
}
 애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속받을 수 없다.
728x90

'[JAVA] > JAVA 기본' 카테고리의 다른 글

[JAVA] 스트림(Stream)  (0) 2022.09.16
[Java] 람다식(Lambda Expression)  (0) 2022.09.15
[JAVA] 컬렉션 프레임워크  (0) 2022.09.14
[JAVA] 예외 처리 정리  (0) 2022.09.14
[JAVA] 제네릭 & 와일드 카드  (0) 2022.09.14