java week 12


목차



Anotation


인터페이스를 기반으로 @를 사용하는 문법요소

주석과는 그 역활이다르지만 주석처럼 코드에 달아서 클래스에 특별한 의미를 부여하거나 기능을 주입한다.

소스코드에 메타데이터를 표현하기 위해서 사용

컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려준다.

쉽게 기능이 담긴 주석이라고 생각하면 편하다.

메타데이터

데이터를 위한 데이터, 한 데이터에 대한 설명을 의미하는 데이터 ex) 사진의 메타데이터 : 촬영한 시간, 장소, 플래쉬 사용 유무 등

자바에서 제공하는 애노테이션 (빌트 인 애노테이션)

  • @Override - 메소드가 오버라이드 됐는지 검증한다. 만약 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 난다.
  • @Deprecated - 메소드를 사용하지 말도록 유도한다. 만약 사용한다면 컴파일 경고를 일으킨다.
  • @SuppressWarnings - 컴파일 경고를 무시하도록 한다.
  • @SafeVarargs - 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시한다. (자바7 이상)
  • @FunctionalInterface - 람다 함수등을 위한 인터페이스를 지정합니다. 메소드가 없거나 두개 이상 되면 컴파일 오류가 난다. (자바 8이상)

메타 애노테이션

위에서 본 기본 애노테이션 외에도 메타 애노테이션 들이 있다. 이 메타 애노테이션을 이용해 커스텀 애노테이션을 만들 수 있다.

  • @Retention - 애노테이션의 범위라고 할수 있다. 어떤 시점까지 애노테이션이 영향을 미치는지 결정한다.
  • @Target - 애노테이션이 적용할 위치를 결정한다.
  • @Documented - 문서에도 애노테이션의 정보가 표현된다.
  • @Inherited - 이 애노테이션을 선언하면 부모클래스에서 애노테이션을 상속받을 수 있다.
  • @Repeatable - 반복적으로 애노테이션을 선언할 수 있게 한다.

애노테이션 정의하는 방법


@interface를 사용하여 정의한다.

public @interface myanotation{
    ~~~
}

어노테이션은 필드 요소를 가질 수 있다.

(실제로는 추상메서드이다.)

public @interface myanotation{
    //타입 이름() defualt xx;
    int id() default 10;    //int 값을 주지않으면 10이 넣어진다.
    String name();          //문자열
    String[] arr();         //배열
    Operation opration();   //Enum 타입
    Class cc();     //Class 타입
    Target t();     //Target 어노테이션
}
@myannotation(id =1, name = "salmon")

처럼 사용가능하다.


@target


어노태이션 적용 대상 설정하기

적용 대상은 java.lang.annotation.ElementType 열거 상수로 정의한다.

ElementType 열거상수내용
TYPE클래스, 인터페이스, 열거 타입
ANNOTATION_TYPE어노테이션
FIELD필드
CONSTRUCTOR생성자
METHOD메소드
LOCAL_VARIABLE지역 변수
PACKAGE패키지

어노테이션을 적용할 대상을 지정할 때는 @Target 어노테이션을 사용한다.

@target(ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface myanotation{
    //타입 이름() defualt xx;
    int id() default 10;    //int 값을 주지않으면 10이 넣어진다.
    String name();          //문자열
    String[] arr();         //배열
    Operation opration();   //Enum 타입
    Class cc();     //Class 타입
    Target t();     //Target 어노테이션
}
@myanotation
public class ClassName {
    @myanotation
    private String fieldName;
    
    //@myanotatione  @Target에 CONSTRUCTOR 가 없어 생성자는 적용할 수 없다. (컴파일 에러)
    public ClassName() { }
    
    @myanotation  
    public void methodName() { }
}

클래스, 필드, 메소드만 어노테이션을 적용할 수 있고, 생성자는 적용할 수 없다.


@rentation


어노테이션 유지 정책

사용 용도에 따라 @myannotation 을 어느 범위까지 유지할 것인지 지정해야 한다.

소스상에서만 유지할 것인지, 컴파일된 클래스까지 유지할 것인지, 런타임 시에도 유지할 것인지 결정해야 한다.

유지 정책은 java.lang.annotation.RetentionPolicy 열거 상수로 아래와 같이 정의 된다.

RetentionPolicy 열거 상수설명
SOURCE소스 상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할 때만 의미가 있고, 바이트 코드 파일에는 정보가 남지 않는다.(컴파일 후 사라진다.)
CLASSdefault, 바이트 코드 파일까지 어노테이션 정보를 유지한다. 리플렉션을 이용해서 이노테이션 정보를 얻을 수는 없다.(.class에는 존재하지만, 런타임에는 사라진다.)
RUNTIME바이트 코드 파일까지 어노테이션 정보를 유지하면서, 리플렉션을 이용해서 런타임 시에 어노테이션 정보를 얻을 수 있다.(언제나 존재)

리플렉션(Reflection) : 런타임 시에 클래스의 메타 정보를 얻는 기능

  • 클래스가 가진 필드, 생성자, 메소드, 적용된 어노테이션이 무엇인지 알아내는 것

  • 런타임 시에 어노테이션 정보 얻기 위해서는 유지 정책을 RUNTIME으로 설정해야 한다

@target(ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface myanotation{
    //타입 이름() defualt xx;
    int id() default 10;    //int 값을 주지않으면 10이 넣어진다.
    String name();          //문자열
    String[] arr();         //배열
    Operation opration();   //Enum 타입
    Class cc();     //Class 타입
    Target t();     //Target 어노테이션
}

@documented


  • 애노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
  • 자바에서 제공하는 기본 애노테이션 중 @Override, @SuppressWarnings를 제외하고는 모두 이 메타 애노테이션이 붙어 있다.
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface FunctionalInterface {}
    

    javadoc


    JavaDoc은 Java코드에서 API문서를 HTML 형식으로 생성해주는 도구이다. HTML 형식이기 때문에 다른 API를 하이퍼 링크를 통해 접근이 가능하다.

/**
 * javaDoc Test
 */
public class Annotation {

    /**
		 * 덧셈을 한다.
     * @param num1
     * @param num2
     * @return num1 + num2
     */
    public int sum(int num1, int num2) {
        return num1 + num2;
    }
}

javadoc 변환

javadoc 파일 그림

인텔리 제이에서 javaDoc이 생성될 디렉토리(Output directory)를 설정하면 해당 디렉토리에 위와 같은 html 파일이 생성된다.

documened 애노테이션을 사용한뒤 내가 java doc 문서 만들면 @documened가 붙은 애노테이션이 문서에 표기된다.

그림1


애노테이션 프로세서


annotation processor는 자바 컴파일러 플러그인의 일종으로, 애노테이션에 대한 코드베이스를 검사, 수정, 생성하는 역할이다.

애노테이션을 사용하기 위해서는 애노테이션 프로세서가 필요하다.

  • 애노테이션 프로세서를 사용한다는 것을 자바 컴파일러가 알고 있는 상태에서 컴파일을 수행한다.
  • 애노테이션 프로세서들이 각자의 역할에 맞게 구현되어 있는 상태에서 실행되지 않은 애노테이션 프로세서를 실행한다.
  • 애노테이션 프로세서 내부에서 애노테이션에 대한 처리를 한다.
  • 자바 컴파일러가 모든 애노테이션 프로세서가 실행 되었는지 검사하고, 모든 애노테이션 프로세서가 실행되지 않았다면 반복한다.

참고







© 2019.04. by salmon2

Powered by theorydb