백기선 자바 라이브 스터디 13: Annotation

Hoyoung Jung·2021년 2월 6일
0

Java annotation

  • 주석과 비슷하지만 주석과 달리 런타임시 JVM에 유지 가능
  • 위키의 정의가 제일 유용한 것 같다.
  • 필요에 따라 런타임시 JVM에 유지할 수 있고, 리플렉션을 이용해서 읽고 추가적인 작업이 가능하다.
  • 발음이 어렵다. 미국사람들은 애(아에 살짝 가까운)너테이션, 영국사람들은 아노테이션으로 발음하는 것 같다.

In the Java computer programming language, an annotation is a form of syntactic metadata that can be added to Java source code. Classes, methods, variables, parameters and Java packages may be annotated. Like Javadoc tags, Java annotations can be read from source files. Unlike Javadoc tags, Java annotations can also be embedded in and read from Java class files generated by the Java compiler. This allows annotations to be retained by the Java virtual machine at run-time and read via reflection. It is possible to create meta-annotations out of the existing ones in Java.
(https://en.wikipedia.org/wiki/Java_annotation)

표준 애너테이션

annotationdescription
@Overide컴파일러에게 오버라이딩 메소드라고 알려줌
@Deprecated앞으로 사용하지 않는 대상
@SupressWarning컴파일러 경고 메시지 표시 안하기
@SafeVarags제네릭스 타입 가변인자 사용
@FunctionalInterface철자주의, 함수형 인터페이스라는 것을 알림
@Native네이티브 메소드에서 참조하는 상수
@Target*애너테이션 적용대상 지정에 사용
@Documented*애너테이션 정보가 자바독에 포함됨
@Retention*애니테이션의 유지범위 지정
@Repeatable*애너테이션을 반복 적용할 수 있게 함
  • *는 메타 애너테이션 (애너테이션을 위한 애너테이션) 이다.
  • 옛날에 책에서 봤을 때는 음 이게 뭐지? 였는데 인프런 백기선 자바 더 코드 바이트조작과 스프링 입문 강의를 들으면 이해가 팍 된다.
  • Repeatable은 뭔지 잘 기억이 안 났는데, 한 대상에 반복적용가능하게 하는 애너테이션이다. https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html
@Repeatable(ToDos.class)
@interface(TODO {
    String value();
}

@ToDo("Delete this")
@ToDo("I'm in hunger, Frostmore")
class DeathKnight {
//...
}

애너테이션 정의하기

@interface 애너테이션_이름 {
 	타입 요소_이름(); //추상메소드
}

예제

@interface Info {
  int count() default 1; //기본값 지정
  String value();
  DateTime date(); //어노테이션 포함 가능
}

@interface DateTime {
  String yymmdd();
  String hhmmsss();
}

@Info //Info(count=1)
class Foo {

	@Info("foo-bar") //value는 생략 가능
	void bar() {
    //pass...
    }
}
 

@retention

  • 애너테이션 유지되는 기간을 지정
SOURCE: 소스 파일에만 존재. 클래스에 존재하지 않음
CLASS: 컴파일된 클래스 파일에 존재. 런타임시 사용불가 기본값
RUNTIME: 실행시 사용가능

@target

  • 애너테이션을 붙일 수 있는 대상 지정
종류의미
ANNOTATION_TYPE애너테이션
CONSTRUCTOR생성자
FIELD필드 (멤버변수 및 이넘상수)
LOCAL_VARIABLE지역변수
METHOD메소드
PACKAGE패키지
PARAMETER매개변수
TYPE타입(클래스, 인터페이스, 이넘)
TYPE_PARAMETER타입 매개변수
TYPE_USE타입이 사용되는 모든 곳
  • 쓰다 보니 헷갈려서 다시 검색해봤는데 parameter는 매개변수, argument는 인자로 번역하는 경향이 있다. 인자보다는 인수가 어울린다라는 내용과 argument is actual parameter 라는 문구도 나쁘지 않은 듯.

@documented

  • 자바독으로 작성한 문서에 포함시키고 싶을 때 사용한다.

애노테이션 프로세서

  • 구글링으로 찾아서 공부했는데, 이전에 공부했었구나만 기억난다.
  • TODO: 스터디 끝나고 다시 공부하고 정리하기.
package com.example;

@SupportedSourceVersion(SourceVersion.latestSupported())
@SupportedAnnotationTypes({
   // Set of full qullified annotation type names
 })
public class MyProcessor extends AbstractProcessor {

	@Override
	public synchronized void init(ProcessingEnvironment env){ }

	@Override
	public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { }
}

팩토리 패턴 예제

profile
주짓수를 좋아하는 개발자

0개의 댓글