주석을 통해 코드에 대한 정보를 전달하기 위한 목적으로 만들어진 문법요소임
에너테이션은 다른 프로그램에게 정보를 전달한다.
소스코드가 컴파일되거나 실행될 때 컴파일러 및 다른 프로그램에게 필요한 정보를 전달하는 문법요소
public interface ExampleInterface{
void example();
}
와 같이 interface를 먼저 지정해준 다음. 새로운 클래스를 만들어준다.
public class ExampleClass implements ExampleInterface {
}
그다음에 alt+insert를 누른 후 Implement Methods 를 클릭하고 메서드를 추가하면, 다음과 같이 자동으로 클래스에 interface 메서드가 추가된다.
public class ExampleClass implements ExampleInterface {
@Override
public void example() {
}
}
@Override 가 에너테이션임 클래스, 인터페이스, 필드, 메서드 등에 붙여서 사용할 수 있다.
example() 이 추상메서드를 구현하거나 상위클래스의 메서드를 오버라이딩 한 메서드라는 것을 컴파일러에게 알려주게 된다.
자바가 기본적으로 제공하는 에너테이션
규칙
class a {
public void example() {
System.out.println("example() of SuperClass");
}
}
class SubClass extends a {
public void exapmle() {
System.out.println("example() of SubClass");
}
}
위의 예를 보면 두가지 클래스가 이름이 같은 메서드를 쓰고있다. 여기서 SubClass의 example() 메서드에 애너테이션을 안붙여주면
두개의 example() 메서드가 생성되게된다.
규칙
public class Main{
public static void main(String[] args) {
OldClass oldClass = new OldClass();
System.out.println(oldClass.getOldField());
}
class OldClass{
@Deprecated
private int oldField;
@Deprecated
int getOldField(){
return oldField;
}
}
}
@Deprecated 가 붙일있으므로 oldClass.getOldField() 를 이용할 수 없다.
@SuppressWarnings({"deprecation", "unused", "null"})
다음과 같이 여러 경고유형을 나열함으로 써 여러개의 경고를 한번에 묵인 할 수 있게됨.
- Deprecated 메서드를 사용한 경우에 발생하는 경고를 억제
- unused : 사용하지 않는 코드와 관련된 경고를 억제
- null : null과 관련된 경고를 억제
@FunctionalInterface
public interface ExampleInterface {
public abstract void example(); // 단 하나의 추상 메서드
}
다음과 같이 example(); 단 하나의 추상 메서드만 가져야 함.
애너테이션을 정의하는 데에 사용되는 에너테이션
적용대상, 유지 기간을 지정하는데에 이용됨.
즉 애너테이션의 특성을 지정하는데에 사용되는 애너테이션
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{
}
위와 같이 @Override 애너테이션을 지정함에 있어서 다른 2가지 애너테이션(@Target, @Retention)이 이용됨을 알 수 있다.
import static java.lang.annotation.ElementType.*;
//import문을 이용하여 ElementType.TYPE 대신 TYPE과 같이 간단히 작성할 수 있습니다.
@Target({FIELD, TYPE, TYPE_USE}) // 적용대상이 FIELD, TYPE
public @interface CustomAnnotation { } // CustomAnnotation을 정의
===================================================================
@CustomAnnotation // 적용대상이 TYPE인 경우
class Main {
@CustomAnnotation // 적용대상이 FIELD인 경우
int i;
}
CustomAnnotation 애너테이션에 대해서 @Target 으로 미리 적용대상을 설정해주고 Mail class 에 적용시키는 것을 볼 수 있다.
추가로, 애너테이션을 정의할 때 다음과같이 정의하면,
@Target({FIELD, TYPE, TYPE_USE})
public @interface CustomAnnotation {
String value();
String comment() default "";
}
- @CustomAnnotation을 사용할때
- @CustomAnnotation(value = "값", comment = "값") 의형식으로 입력받을 수 있게됨. 즉, 메소드명이 애너테이션 괄호안에 넣을 변수명이 됨.
- value()의 경우 입력시 생략가능함. 또한 String comment() default ""; 에서 defalut 값을 ""로 지정해줬기때문에 입력을 따로 안해도됨
- @CustomAnnotation("값") 으로만 입력해도 된다!.
@Inherited
@interface SuperAnnotation{ }
@SuperAnnotation
class Super { }
class Sub extends Super{ }
Super 클래스를 상속받은 Sub 클래스는 동일하게 @SuperAnnotation 에 정의된 내용들을 적용받게 됨.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)

소스파일에서 컴파일을 통해 바이트 코드로 되고, 로드가되면서 런타임으로 넘어간다.