[Java] 어노테이션
어노테이션은 클래스나 메서드, 변수 선언 등의 앞에 붙어서 추가적인 정보를 기술하거나 동작을 수행하도록 하는 기능이다.
@Override 어노테이션처럼 추가적인 문법적 확인을 수행할 때도 사용하고,
@SuppressWarnings 처럼 경고메세지를 씹을때 사용할 수도 있다.
이외에도 javadoc으로 문서화를 할때 마킹용으로도 사용하며...
스프링 프레임웍 등에선 아주 적극적으로 사용해서, 어노테이션으로 별별 묘기를 다 부린다.
일단 어노테이션은 @interface라는 키워드로 정의된다.
@interface 어노테이션명
{
** 타입 필드1();**
** 타입 필드2();**
** ...**
}
아래 코드는 어노테이션을 간단하게 하나 정의한 것이다.

String 필드 2개를 갖는다.
그럼 이런식으로 사용할 수 있다.
필드 foo와 bar는 반드시 값이 들어와야 한다.


만약 하나라도 값이 전달되지 않으면, 에러를 던진다.


default 절
근데 매번 저렇게 값을 전달하는건 상당히 불편한 일이다. 꼭 뭘 전달해야 할까? 의미상 기본값만으로 잘 동작할 경우도 있을 수 있다.
값이 전달되지 않아도 동작하게 하려면, default 키워드와 함께 기본값을 설정해야한다.


Target 어노테이션
이건 어노테이션 정의에만 사용하는 어노테이션이다.
그냥 정의한 어노테이션은 메서드든, 클래스의 정의든 가리지 않고 잘 붙는다.
이 어노테이션은 정의한 어노테이션의 영역을 한정할 때 사용한다.
가령 이렇게 METHOD로 속성값을 지정하고 클래스에 사용을 시도한다면

에러를 던진다.

메서드에 쓰면 당연히 잘 돌고.
그리고 어노테이션의 값을 확인하고 추가적인 동작을 수행하려면, 리플렉션을 이용한 다소 복잡한 접근이 필요하다.
이에 대한 것은 리플렉션에 대한 것을 먼저 정리하고, 다시 언급하도록 하겠다.