자바 소스 코드에서 @Override 처럼 @ 기호를 앞에 붙인 메타데이터 형태를 어노테이션(annotation) 이라고 하며 Java5 에서 추가되었다.

한글로 번역하면 comment 와 같은 '주석' 이 될 수 있지만 이 어노테이션은 단순한 주석이 아닌 메타 데이터의 일종으로 데이터의 데이터를 정의할 수 있다.

소스 코드에서 클래스, 메소드, 변수, 매개 변수, 패키지 등에 사용되어, 클래스가 컴파일되거나 실행될 때 어노테이션에 설정된 값에 따라 클래스의 방향이 결정된다.

컴파일러에 의해 생성된 클래스 파일의 어노테이션은 리플렉션(reflection) 을 통해 동작하게 된다.



자바 코드에 적용되는 내장 어노테이션


@Override - 메소드가 재정의(override) 된 것인지 확인한다. 부모 클래스나 구현된 인터페이스에 해당 메소드가 없으면 컴파일 오류가 발생한다.

@Deprecated - 앞으로 사용하지 않을 메소드임을 표시한다. 메소드가 사용되면 컴파일 경고가 발생한다.

@SuppressWarnings - 컴파일시 어노테이션 파라미터에 지정된 경고를 숨기도록 컴파일러에 지시한다.

@SafeVarargs - 제네릭스 가변인자(generics varargs) 파라미터를 사용한 메소드나 생성자의 모든 호출자에 대한 경고를 숨긴다. (Java7 이후)

@FunctionalInterface - 타입 선언이 함수형 인터페이스가 되도록 지정한다. (Java8 이후)



기타 어노테이션에 적용되는 어노테이션 (메타 어노테이션)


@Retention - 어노테이션의 저장 범주를 지정한다. (RUNTIME, CLASS, SOURCE)

@Documented - JavaDoc 에 현재 어노테이션을 표기하도록 지정한다.

@Target - 어노테이션이 적용될 Java 요소를 제한하기 위해 표시한다.

@Inherited - 어노테이션이 달린 클래스의 하위 클래스에 상속될 어노테이션을 표시한다. (기본적으로 어노테이션은 하위 클래스에 상속되지 않는다.)

@Repeatable - 어노테이션이 동일한 선언에 두 번 이상 적용될 수 있도록 지정한다. (Java8 이후)



아래는 @Override 어노테이션의 예제이다.


public class Animal {
    public void speak() {
    }
 
    public String getType() {
        return "Generic animal";
    }
}
 
public class Cat extends Animal {
    @Override
    public void speak() { // This is a good override.
        System.out.println("Meow.");
    }
 
    @Override
    public String gettype() { // Compile-time error due to mistyped name.
        return "Cat";
    }
}
cs


위 예에서 @Override 어노테이션은 해당 메소드가 상위 클래스에 있는 메소드인지 컴파일러가 검사하도록 지시한다.

이 경우, Cat 클래스의 gettype() 메소드가 사실상 Animal 클래스의 getType() 와 이름이 일치하지 않으므로 오류가 발생한다.

@Override 어노테이션이 없는 경우, Cat 클래스에 새로운 gettype() 메소드가 작성된다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,