Roel Notebook

[Java] 12주차 과제: 애노테이션

by Roel Downey
728x90
반응형

 

스터디 링크 : 링크 

 

애노테이션

애노테이션은 코드에 넣는 주석이다. 완전히 주석같지 않지만, 주석과 비슷한 류의 장치다.

 

주석이기 때문에, 실행되는 코드라고 생각하면 안된다.

마치 애노테이션은 기능을 가지고 있는 것이라 생각할 수 있으나, 애노테이션은 마크, 표시 해놓는 주석이다.

 

애노테이션에 다이나믹하게 실행되는 코드는 들어가지 않는다.

즉, 런타임중에 알아내야 하는 값은 못들어 간다.

  • 컴파일러 수준에서 해석이 되거나,
  • 완전히 정적이어야 한다.
  • 동적으로 런타임중에 바뀌어야 하는 것들은 애노테이션에 사용할 수 없다.

 

애노테이션을 정의하는 방법

public @interface CheckRoel {

}

애노테이션도 인터페이스나 enum 과 같이 class 파일을 만든다. 

 

 

빌트인(built-in) 애노테이션

Java에 내장되어 있는 애노테이션으로 컴파일러를 위한 애노테이션

 

◾ Override

현재 메서드가 슈퍼 클래스의 메서드를 오버라이딩(overriding)한 것임을 컴파일러에게 명시해준다.

메서드가 슈퍼클래스에 없다면 에러를 발생시기 때문에 오타와 같은 실수도 잡을 수 있다.

 

◾ Deprecated

마커 애노테이션으로 다음 버전에 지원되지 않을 수도 있기 때문에 앞으로 사용하지 말라고 경고를 알린다.

IDE에 취소선으로 표시됨

 

◾ SuppressWarning

경고를 제거하는 애노테이션으로 개발자가 의도를 가지고 설계를 했는데 컴파일은 이를 알지 못하고 컴파일 경고를 띄울 수 있기 때문에 이를 제거하는 목적이다.

 

◾ SafeVarargs

Java 7이상에서 사용가능하고 가변인자 매개변수 사용시 경고를 무시한다

 

◾ FunctionalInterface

Java 8이상에서 사용가능하고 컴파일러에게 함수형 인터페이스라는 것을 알리는 애노테이션이다.



메타 애노테이션

애노테이션에 사용되는 애노테이션으로 애노테이션을 정의(설명)하기 위해 사용된다.

 

◾ @Retention

애노테이션이 유지되는 기간(Life Time)을 설정하는 애노테이션

public enum RetentionPolicy { SOURCE, CLASS, RUNTIME }

  • SOURCE : 소스파일에만 존재하고, 클래스파일에는 존재x, 컴파일러에 의해 버려진다.
  • CLASS : 클래스파일에는 존재하지만 런타임 시에 유지할 필요 없다는 것을 알리고 이 값이 default이다.
  • RUNTIME : 클래스파일에도 존재하고 런타임애 VM에 의해 유지되어 리플랙션을 통해 클래스 파일의 정보를 읽어 처리 가능하다.

 

◾ @Target

애노테이션이 적용가능한 대상(동작 대상)을 지정한다.

만약 다른 타입이 온다면 컴파일 에러를 띄운다.

java.lang.annotation.ElementType 이라는 enum 타입이 정의 되어야 한다.

이 타입은 애노테이션이 어느 곳에 적용할지 그 대상을 제한하는데 사용한다.

 

  • 기존
    • TYPE : Class, Interface(애노테이션 타입 포함), enum, jdk14에 생긴 record
    • FIELD : 필드 값(프로퍼티), enum 상수값
    • METHOD : 메서드
    • PARAMETER : 메서드 파라미터 (매개 변수)
    • CONSTRUCTOR : 생성자
    • LOCAL_VARIABLE : 지역 변수
    • ANNOTATION_TYPE : 애노테이션
    • PACKAGE : 자바 패키지
  • jdk 1.8 이후 추가
    • TYPE_PARAMETER : 타입 매개 변수
    • TYPE_USE : 타입 사용 //jdk 9 이후
    • MODULE : 모듈
  • jdk 14이후 추가
    • RECORD_COMPONENT : Record 컴포넌트



◾ @documented

애노테이션의 정보가 javadoc의 문서에 포함되도록 하는 애노테이션

javadoc은 현재 프로젝트에 대한 api를 html 형식으로 생성해주는 도구

 

◾ @Inherited

자식 클래스에게도 애노테이션이 상속되도록 하는 애노테이션

 

◾ @Repeatable

애노테이션을 반복적으로 선언할 수 있게 하는 애노테이션



커스텀 애노테이션

IntelliJ의 새로만들기에서 Annotation으로 지정하여 새로 만들수 있다.

 

애노테이션 프로세서

런타임시에 리플랙션을 사용하는 애노테이션과는 달리 컴파일 타임에 이루어진다.

컴파일 타임에 애노테이션들을 프로세싱하는 javac에 속한 빌드 툴로 애노테이션의 소스코드를 분석하고 처리하기 위해 사용되는 훅이다.

보일러플레이트 코드를 제거하는데 도움이 된다.
( AbstractProcessor를 implements하여 구현체를 만들 수 있으며 Lombok의 @Getter, @Setter와 같은 애노테이션을 이용하는 것만으로도 컴파일 타임에 알아서 getter/setter를 만들어주는 방식으로 보일러플레이트 코드 제거 )



 

리플렉션

 

리플렉션은 구체적인 클래스 타입을 몰라도 그 클래스의 메소드, 변수 등에 접근해서 사용할 수 있도록 해주는 것이라고 정의 되어있는데 잘 와닿지 않음.

내가 이해 한대로 작성하면 .class 라는 저장된 파일을 .java 소스에서 읽어서 그 클래스 파일에 메소드나 변수는 무엇이 있는지 등의 정보에 접근해서 사용할 수 있다고 할 수 있다. 

 

리플렉션은 Class라는 클래스로 사용 할 수 있다. 

 

 

 

728x90
반응형

'Java' 카테고리의 다른 글

[Java] AtomicLong 사용 방법  (0) 2021.12.15
[Java] 13주차 과제: I/O  (0) 2021.02.17
[Java] 11주차 과제: Enum  (0) 2021.02.04
[Java] 10주차 과제: 멀티쓰레드 프로그래밍  (0) 2021.01.23
[Java] 9주차 과제: 예외 처리  (0) 2021.01.18

블로그의 정보

What doing?

Roel Downey

활동하기