본문 바로가기

Spring&IntelliJ

사용자 정의 어노테이션을 만들때 아래와 같은 방식으로 만드는 것으로 알고 있어. 그런데 궁금한게 왜 어노테이션이름이 @interface야? 어노테이션을 새로 정의한다면 그 이름을 @annotation으로 하는 게 적절한거 아니야?

사용자 정의 어노테이션을 만들때 아래와 같은 방식으로 만드는 것으로 알고 있어. 그런데 궁금한게 왜 어노테이션이름이 @interface야? 어노테이션을 새로 정의한다면 그 이름을 @annotation으로 하는 게 적절한거 아니야? @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyIncludeComponent { }

좋은 질문입니다.
사실 이것은:

“왜 Java는 어노테이션을 인터페이스 문법 기반으로 만들었는가?”

에 대한 질문에 가깝습니다.

결론부터 말하면:

✅ Java에서 어노테이션(annotation)은 내부적으로 인터페이스 기반으로 설계되었기 때문입니다.

그래서 문법도:

 
@interface
 

가 된 것입니다.


1️⃣ 먼저 중요한 사실

Java에서:

 
public @interface MyAnnotation {
}
 

는 사실상:

 
public interface MyAnnotation extends Annotation {
}
 

와 매우 비슷한 개념입니다.


즉:

어노테이션은 Java 내부적으로 특수한 인터페이스 타입

입니다.


2️⃣ 실제로 당신이 본 정보에도 있었음

예를 들어 @Repository 설명 보면:

 
public @interface Repository
extends java.lang.annotation.Annotation
 

즉:

모든 어노테이션은 Annotation 인터페이스 계열
 

입니다.


3️⃣ 왜 인터페이스 기반으로 만들었나?

Java 개발팀이 생각한 개념은:

어노테이션은 “행동(code)”이 아니라 “메타정보(metadata)”를 정의하는 선언적 구조

라는 것


즉:

객체처럼 동작하는 클래스
 

가 아니라

특정 정보를 기술하는 명세(specification)
 

에 가까움


그래서:

“계약(contract)” 역할을 하는 인터페이스 개념
 

을 기반으로 만든 것


4️⃣ 실제로 어노테이션 내부 문법도 인터페이스 느낌

예:

 
public @interface MyAnnotation {

    String value();

    int count() default 0;
}
 

이건 거의:

 
interface
 

의 메서드 선언과 비슷함


실제로:

 
String value();
 

는:

어노테이션 속성(attribute)
 

정의


사용 시:

 
@MyAnnotation(value = "hello", count = 3)
 

처럼 사용


5️⃣ 왜 @annotation 이 아니냐?

당신 말처럼:

 
@annotation
 

이 직관적으로 보일 수도 있음


하지만 Java 설계자들은:

“이건 완전히 새로운 타입 시스템이 아니라 인터페이스를 확장한 특수 타입이다”

라고 본 것


즉:

annotation = special interface
 

관점


그래서:

 
@interface
 

문법 채택


6️⃣ 실제 Java 내부 구조

컴파일 후 어노테이션도:

인터페이스 형태의 바이트코드
 

로 처리됨


그리고 런타임에는:

Proxy 객체
 

로 동작하는 경우 많음


7️⃣ 흥미로운 점

어노테이션 내부에서는:

❌ 일반 메서드 구현 불가능

 
void test() {
}
 

불가능


오직:

 
String value();
 

같은 선언만 가능


왜냐면:

메타데이터 명세 역할
 

이기 때문


8️⃣ 실제 Annotation 인터페이스

모든 어노테이션은 결국:

 
java.lang.annotation.Annotation
 

을 기반으로 함


예:

 
public interface Override extends Annotation
 

비슷한 개념


9️⃣ 쉽게 비유하면

클래스

실제 동작하는 객체
 

인터페이스

규약/설명
 

어노테이션

추가 메타정보 설명
 

즉:

Java 설계자들은 어노테이션을 “설명용 계약 구조”로 봤기 때문에 인터페이스 기반으로 설계한 것


🔟 한 줄 정리

Java에서 어노테이션을 @interface 문법으로 정의하는 이유는, 어노테이션이 내부적으로 Annotation 인터페이스를 기반으로 한 특수한 인터페이스 타입으로 설계되었기 때문이다.