본문 바로가기

개발유랑기/Java

어노테이션(Annotation) 에 대해서 알아보자 - 작성 중

여지껏 시라소니가 개발을 하면서 왜 쓰는지, 어떻게 쓰는지, 어떻게 동작하는지 1도 몰랐던 부분이다. 제대로 모르고 코딩하다보면 예상치 못한 이슈와 ㅎㅇ하는 경우가 있는데, 최근에도 그런 부분이 발생하여 내용을 한 번 정리하고자 한다.

 

개발을 하다보면 수십개의 어노테이션을 마주하게 된다. 어노테이션이라는 말을 모르더라도 골뱅이(@) 붙어있는 키워드 그거! 그게 어노테이션이다 :)

 

그래도 제대로 공부해보면 좋지 않겠는가? 레퍼런스를 뒤져보도록 하자.

서버 개발할 때 주로 사용하다보니 Spring에서 나오는 개념이라고 착각했는데, 사실은 Java에서 나오는 개념이다.  (ex. @Override)

 

https://docs.oracle.com/javase/tutorial/java/annotations/index.html

 

Lesson: Annotations (The Java™ Tutorials > Learning the Java Language)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

 

다음과 같이 설명하고 있다. (해석 퀄리티 주의)

 

어노테이션(Annotation) 이란? 프로그램에 대한 데이터를 제공하며 코드 수행에 직접적인 영향을 끼치지 않는다.

 

어노테이션은 다음과 같이 사용된다.

  1. 컴파일러를 위한 정보: 어노테이션은 에러 감지나 경고를 나타내기 위해 컴파일러에서 사용된다.
  2. 컴파일과 배포처리: 소프트웨어 도구는 코드, XML 파일 등을 생성하기 위해 어노테이션 정보를 사용한다.
  3. 실행처리: 일부 어노테이션은 런타임 시에 검사되도록 사용할 수 있다. -> 시라소니는 이 부분이 가장 알아두어야할 부분이라고 생각한다.

 

어노테이션 기초

 

1. 어노테이션의 형태

-> 골뱅이(@)는 컴파일러에게 뒤에 오는 것이 어노테이션임을 나타낸다.

 

2. 어노테이션은 어디에서 사용될 수 있는가

-> 클래스, 필드, 메서드, 기타 프로그램 요소의 선언에 적용할 수 있다.

더보기
  • Class instance creation expression:
        new @Interned MyObject();
    
  • Type cast:
        myString = (@NonNull String) str;
    
  • implements clause:
        class UnmodifiableList<T> implements
            @Readonly List<@Readonly T> { ... }
    
  • Thrown exception declaration:
        void monitorTemperature() throws
            @Critical TemperatureException { ... }​

 

공식문서에 이렇게 적혀있긴 하지만 저 친구들은 우리가 자주 마주하는 형태는 아닌 것 같다

 

3. 미리 선언된 어노테이션 타입

-> 이미 자바에서 선언되어 제공되는 어노테이션이 있다. 

  • @Deprecated: 더 이상 사용되지 않는 요소임을 표시
  • @Override: 슈퍼클래스에 선언된 메서드를 재정의한다는 것을 컴파일러에 알림
  • @SuppressWarnings: 생성할 특정 경고를 억제하도록 컴파일러에 지시
  • @SafeVarargs: 메서드 또는 생성자에 적용될 때 코드가 해당 varargs 매개변수에 대해 잠재적으로 안전하지 않은 작업을 수행하지 않는다고 주장
  • @FunctionalInterface: 기능적 인터페이스가 되도록 의도되었음을 나타낸다.

.... 라고 한다. 응 됐고 그래서 뭐 어떻게 쓰는데???