어노테이션 (Annotation)
- 클래스나 메소드등의 선언 시 @를 사용하는 것으로 메타데이터라고 불리기도 한다.
- 어노테이션 사용 용도
- 컴파일러에게 정보를 알려줄 때
- 컴파일할 때 설치(deployment) 시의 작업을 지정할 때
- 실행할 때 별도의 처리가 필요할 때
- 클래스, 메소드, 변수 등 모든 요소에 선언할 수 있다.
- 자바에는 사용하기 위해 정해져있는 어노테이션 3개, 선언을 위해 존재하는 메타 어노테이션 4개가 있다.
- 어노테이션 선언 시 미리 만들어 놓은 어노테이션을 확장하는 것이 불가능하다. (상속 x)
- extends 예약어 사용 불가
- 용도 별 어노테이션 종류
- 제약사항 등을 선언하기 위해: @Deprecated, @Override, @NotNull
- 용도를 나타내기 위해: @Entity, @TestCase, @WebService
- 행위를 나타내기 위해: @Statefull, @Transaction
- 처리를 나타내기 위해: @Column, @XmlElement
- 어노테이션이 만들어지기 전에는 모든 자바 애플리케이션 설정을 XML이나 properties라는 파일에 지정했다.
- 애노테이션으로 인해 각 설정이 필요한 위치에 관련 설정이 존재하면서 코드에 대한 가독성이 좋아졌다.
일반적으로 사용 가능한 어노테이션
- @Override
- 해당 메소드가 부모 클래스에 있는 메소드를 Override 했다는 것을 명시적으로 선언한다.
- Override 시 부모 클래스에 있는 메소드 명, 매개 변수들을 동일하게 가져가야 하는데 @Override 어노테이션을 명시하면 컴파일러에게 "내가 잘못 코딩했으면 알려줘야한다"라고 말해주는 것
- @Override를 사용한 메소드가 부모 클래스에 존재하지 않으면 컴파일 에러가 발생한다.
- 어떤 메소드가 부모 클래스에 있는 것을 Override 했는지 알아보기 힘든 경우 @Override 어노테이션을 추가 시 쉽게 확인이 가능하다.
- @Deprecated
- 미리 만들어져있는 클래스나 메소드가 더 이상 사용되지 않은 경우에 사용되는 어노테이션
- 사용 시 컴파일러에게 "얘는 더 이상 사용하지 않으니 사용 시 경고 해주고 알고 있어"라고 말해주는 것과 같다.
- deprecated 된 클래스나 메소드 사용 시 컴파일 결과에 에러가 아닌 경고 문구가 출력되며 컴파일이 완료되며 클래스 파일은 생성된다.
- @SupressWarnings
- 코딩을 하다보면 프로그램에는 문제가 없는데 경고가 나타나는 경우가 있는데 컴파일 경고를 사용하지 않도록 설정하는 어노테이션 (컴파일 경고 제외)
- 컴파일러에게 "얘는 일부로 이렇게 코딩한거니 경고해줄 필요 없어" 라고 말해주는 것과 같다.
- 매개 변수로 문자열을 넘겨 해당 경고 메시지를 제외할 수 있다.
메타 어노테이션 (Meta Annotation)
- 선언할 때 사용하는 어노테이션을 메타 어노테이션이라고 한다.
- 어노테이션 관련 클래스들은 java.lang.annotation 패키지에 선언되어 있다.
- @Target
- 어노테이션을 어떤 것에 적용할지 선언할 때 사용한다.
- 괄호 안에 적용 대상을 지정한다.
- 대상 목록
- CONSTRUCTOR(생성자 선언시)
- FIELD(enum 상수를 포함한 필드 값 선언 시)
- LOCAL_VARIABLE(지역 변수 선언 시)
- METHOD(메소드 선언시)
- PACKAGE(패키지 선언시)
- PARAMETER(매개 변수 선언시)
- TYPE(클래스, 인터페이스, enum 등 선언시)
- 대상 목록
@Target(ElementType.METHOD)
- @Retention
- 얼마나 오래 어노테이션 정보가 유지되는지를 선언한다.
- 괄호 안에 적용 대상
- SOURCE : 컴파일 시 어노테이션 정보가 사라진다.
- CLASS : 클래스 파일에 있는 어노테이션 정보가 컴파일러에 의해 참조 가능, 가상머신(JVM)에서는 사라진다.
- RUNTIME : 실행 시 어노테이션 정보가 가상 머신에 의해서 참조 가능
@Retention(RetentionPolicy.RUNTIME)
- @Documented
- 해당 어노테이션에 대한 정보가 Javadocs(API) 문서에 포함된다는 것을 선언한다.
- @Inherited
- 모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 가능하다는 것을 선언한다.
- @interface
- 어노테이션을 선언할 때 사용하는 어노테이션
- 클래스 / 인터페이스 선언 처럼 @interface로 선언하면 해당 어노테이션이 사용 가능해진다.
- default 예약어는 default 뒤에 있는 값이 해당 어노테이션 사용 시 기본 값이 된다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
// 어노테이션 선언 시 메소드 선언
public int number();
public String text() default "first annotation";
}
- 이 경우 UserAnnotation은 메소드에만 사용할 수 있으며 실행 시 어노테이션을 참조하게 된다.
- 메소드 선언 시 직접 만든 어노테이션을 사용 가능
- 어노테이션 선언 클래스에 지정해놓은 각 메소드의 이름에 해당하는 값을 소괄호 안에 넣어줘야한다.
- ex) @UserAnnotation(number=1, text="second")
- text의 경우 default 값을 별도로 지정해줬기에 따로 지정해주지 않아도 컴파일 시 문제가 없다.
- @Target()에서 지정한 범위를 넘어가면 컴파일 에러 발생
- 두 개 이상의 어노테이션을 선언할 때 중괄호를 한 후 ,로 구분해준다.
- ex) Target({ElementType.METHOD, ElementType.TYPE})
- 리플렉션 API 사용 시 직접 선언하여 사용하는 어노테이션에 대한 정보를 확인할 수 있다.
롬복 (Lombok)
- 개발자가 필요한 작업을 어노테이션 선언만으로 편하게 처리할 수 있도록 도와주는 것.
- 롬복을 사용하기 위해서는 관련 라이브러리가 필요하다.
- 롬복을 사용하면 간단한 선언만으로도 getter 메소드와 setter 메소드 등 생성이 가능하다.
@Getter
@Setter
private boolean employed = true;
- 어노테이션이 변환된 모습은 컴파일 단계에서 생성되므로 역 컴파일을 하지 않는 이상 직접 볼 수 없다.
간단 내용 정리
1. @Override 어노테이션의 용도는 무엇인가요?
ㅡ> 해당 메소드가 부모 클래스에 있는 메소드를 Override 했다는 것을 명시적으로 선언함으로 어떤 메소드가 Override 한 메소드인지 쉽게 확인 가능하고, @Override를 사용한 메소드가 부모 클래스에 존재하지 않으면 에러가 발생한다.
2. @SupressWarnings 어노테이션의 용도는 무엇인가요?
ㅡ> 컴파일 경고를 제외하도록 하는 용도
3. @Deprecated 어노테이션의 용도는 무엇인가요?
ㅡ> 미리 만들어져있는 클래스나 메소드가 더 이상 사용되지 않은 경우에 사용되는 어노테이션
4. 어노테이션을 선언할 때 사용하는 어노테이션을 무엇이라고 부르나요?
ㅡ> 메타 어노테이션
5. 4번 문제의 답에 있는 어노테이션들을 사용할 때 import 해야 하는 패키지는 무엇인가요?
ㅡ> java.lang.annotation 패키지
6. @Target 어노테이션의 용도는 무엇인가요?
ㅡ> 어노테이션을 어떤 대상에 적용할지 지정하는 용도
7. @Retention 어노테이션의 용도는 무엇인가요?
ㅡ> 얼마나 오래 어노테이션 정보가 유지되는지 범위를 지정하는 용도
8. @Inherited 어노테이션의 용도는 무엇인가요?
ㅡ> 모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 가능하다는 것을 선언하는 용도
9. 어노테이션을 선언할 때에는 class 대신 어떤 예약어를 사용해야 하나요?
ㅡ> @interface
출처: 이상민, <자바의 신 VOL.1> 로드북
'Java > 자바의 신 VOL.1' 카테고리의 다른 글
중간 점검 및 실습 문제 풀이 (0) | 2024.06.26 |
---|---|
18. 이제 기본 문법은 거의 다 배웠으니 정리해봅시다 (1) | 2024.06.26 |
16. 클래스 안에 클래스가 들어갈 수도 있구나 (0) | 2024.06.25 |
15. String (0) | 2024.06.25 |
14. 다 배운 것 같지만, 예외라는 중요한 것이 있어요 (0) | 2024.06.24 |