프로그래밍-학습기록/Java

Annotation(애너테이션, 어노테이션)

leesche 2020. 12. 25. 00:26
  • 책 <자바의 정석>을 참고해 작성했습니다.

Annotation

자바를 개발한 사람들은 소스코드에 대한 문서를 따로 만들기보다 소스코드와 문서를 하나의 파일로 관리하는 것이 낫다고 생각했다. 그래서 소스코드의 주석 /** ~ */ 에 소스코드에 대한 정보를 저장하고, 소스코드의 주석으로부터 HTML 문서를 생성해내는 프로그램(javadoc.exe)을 만들어서 사용했다.

주석 안에 소스코드에 대한 설명들이 있고, 그 안에 '@'이 붙은 태그들, 이 미리 정의된 태그들을 이용해서 주석 안에 정보를 저장하고, javadoc.exe 라는 프로그램이 이 정보를 읽어서 문서를 작성하는데 사용한다.

이 기능을 응용하여, 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 바로 애너테이션이다. 애너테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있다는 장점이 있다.

표준 애너테이션

  • @Override → 조상의 메서드를 오버라이딩하는 것이라는 것을 컴파일러에게 알려주는 역할
  • @Deprecated → 더 이상 사용되지 않는 필드나 메서드에 붙인다. 이 에너테이션이 붙은 대상은 다른 것으로 대체되었으니 더 이상 사용하지 않을 것을 권한다는 의미.
  • @FunctionalInterface → '함수형 인터페이스'를 선언할 때, 이 애너테이션을 붙이면 컴파일러가 '함수형 인터페이스'를 올바르게 선언했는지 확인하고, 잘못된 경우 에러를 발생시킨다. 필수는 아니지만, 붙이면 실수를 방지할 수 있다.
  • @SuppressWarnings → 컴파일러가 보여주는 경고메시지가 나타나지 않게 억제해준다. 억제하려는 경고 메시지를 애너테이션 뒤에 괄호 안에 문자열로 지정하면 된다. 둘 이상의 경고를 동시에 억제하려면 중괄호로 문자열들을 감싸준다.
  • @SafeVarargs → 메서드에 선언된 가변인자의 타입이 non-reifiable타입일 경우, 해당 메서드를 선언하는 부분과 호출하는 부분에서 "unchecked" 경고가 발생한다. 해당 코드에 문제가 없다면 이 경고를 억제하기 위해 @SafeVarargs 를 사용해야 한다. 이 애너테이션은 생성자, static, final이 붙은 메서드에만 붙일 수 있다. 즉, 오버라이드될 수 있는 메서드에는 사용할 수 없다.
    • 컴파일 후에도 제거되지 않는 타입은 reifiable 타입이라고 한다. 제거되는 타입을 non-reifiable 타입이라 한다.

메타 애너테이션

애너테이션을 위한 애너테이션, 즉 애너테이션에 붙이는 애너테이션으로 애너테이션을 정의할 때 애너테이션의 적용대상이나 유지기간 등을 지정하는데 사용된다.

  • @Target → 애너테이션이 적용가능한 대상을 지정하는데 사용된다.
  • @Retention → 애너테이션이 유지되는 기간을 지정하는데 사용된다. 애너테이션의 유지 정책의 종류는 다음과 같다.
    • SOURCE → 소스 파일에만 존재. 클래스파일에는 존재하지 않음.
    • CLASS → 클래스 파일에 존재. 실행시에 사용불가. 기본값
      • 컴파일러가 애너테이션의 정보를 클래스 파일에 저장할 수 있게는 하지만, 클래스 파일이 JVM에 로딩될 때는 애너테이션의 정보가 무시되어 실행 시에 애너테이션에 대한 정보를 얻을 수 없다.
    • RUNTIME → 클래스 파일에 존재. 실행시에 사용가능.
      • 실행 시에 리플렉션(reflection)을 통해 클래스 파일에 저장된 애너테이션의 정보를 읽어서 처리할 수 있다.
  • @Documented → 애너테이션에 대한 정보가 javadoc으로 작성된 문서에 포함되도록 한다. 자바에서 제공하는 기본 애너테이션 중에 @Override와 @SuppressWarnings를 제어하고 모두 이 메타 애너테이션이 붙어 있다.
  • @Inherited → 애너테이션이 자손 클래스에 상속되도록 한다. 이 애너테이션이 붙은 조상 클래스는, 자손 클래스도 이 애너테이션이 붙은 것과 같이 인식된다.
  • @Repeatable → 보통은 하나의 대상에 한 종류의 애너테이션을 붙이는데, 이 애너테이션이 붙은 애너테이션은 여러 번 붙일 수 있다.
  • @Native → 네이티브 메서드에 의해 참조되는 상수 필드에 붙이는 애너테이션이다.
    • 네이티브 메서드는 JVM이 설치된 OS의 메서드를 말한다. 네이티브 메서드는 보통 C언어로 작성되어 있는데, 자바에서는 메서드의 선언부만 정의하고 구현은 하지 않는다. 그래서 추상 메서드처럼 선언부만 몸통이 없다.
    • 모든 클래스의 조상인 Object 클래스의 메서드들은 대부분 네이티브 메서드이다. 네이티브 메서드는 자바로 정의되어 있기 때문에 호출하는 방법은 자바의 일반 메서드와 다르지 않지만 실제로 호출되는 것은 OS의 메서드이다.
    • 아무런 내용도 없는 네이티브 메서드를 선언해 놓고 호출한다고 되는 것은 아니고, 자바에 정의된 네이티브 메서드와 OS의 메서드를 연결해주는 작업이 추가로 필요하다.

'프로그래밍-학습기록 > Java' 카테고리의 다른 글

package, import, static import  (0) 2020.12.17
BufferedReader / BufferedWriter  (0) 2020.07.10