ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인프런 워밍업 클럽/ BE 1일차 과제 : 어노테이션
    인프런 워밍업 클럽 2024. 4. 29. 23:18

    어노테이션을 사용하는 이유는 무엇일까?

    우선 어노테이션이란, 사전적의미로 주석이라는 뜻으로 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다. 메타 데이터란 애플리케이션이 처리해야할 데이터가 아니라 컴파일 과정에서 코드를 어떻게 처리해야하는지를 알려주기 위한 추가 정보이다.

    즉, 우리가 주석을 사용해서 다른 사람에게 추가적인 설명을 하는 것 처럼 코드에 어노테이션을 써서 프로그램에게 간결하고 쉽게 정보를 전달하게 된다.

     

    그렇다면 왜 어노테이션의 역할은 무엇일까?

    • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.
    • 소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
    • 실행시 특정 기능을 실행하도록 정보를 제공한다.

    예를 들어 롬복의 @Getter를 사용하게 되면 변수 하나하나 get메서드를 만들어주지 않아도 된다.

    위와 같은 어노테이션의 역할로 코드의 가독성과 개발 생산성을 높일 수 있기 때문에 어노테이션을 사용한다고 할 수 있다.

     

    나만의 어노테이션은 어떻게 만들 수 있을까?

    커스텀 어노테이션은 메타 어노테이션을 사용하여 다음과 같은 구조를 가진다.

    @Target({ElementType.[적용대상]})
    @Retention(RetentionPolicy.[정보유지되는 대상])
    public @interface [어노테이션명]{
    	public 타입 elementName() [default 값]
        ...
    }

    메타 어노테이션이란 커스텀 어노테이션을 구성할 때 시점과 위치등을 지정하기 위한 어노테이션을 말한다.
    ex) @Target, @Retention ... 

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface myAnnotation {
        String mention() default "헬로우";
    }

    위의 코드처럼 만들게 되면, Runtime시 적용되고 메서드에 붙일 수 있는 커스텀 어노테이션 myAnnotation이 만들어졌다.

    @myAnnotation
    public static void method1() {
    }
    
    @myAnnotation(mention = "안녕하세요")
    public static void method2() {
    }

    위와 같이 사용할 수 있으며, 위에 정의한대로 기본값으로는 "헬로우를 찍어주고", mention설정시 설정한 값("안녕하세요")를 찍어주게 된다.

     

    메타 어노테이션의 종류

    @Retention : 컴파일러가 어노테이션을 어느 시점까지 영향을 미칠지를 결정

    • RetentionPolicy.SOURCE : 컴파일 전까지만 유효
    • RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
    • RetentionPolicy.RUNTIME : 컴파일 이후 런타임 시기에도 JVM에 의해 참조가 가능(리플렉션)
      리플렉션 : 컴파일 시간이 아닌 실행시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법

     

    @Target : 어노테이션을 적용할 위치를 선택

    • ElementType.PACKAGE : 패키지 선언
    • ElementType.TYPE : 타입 선언
    • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
    • ElementType.CONSTRUCTOR : 생성자 선언
    • ElementType.FIELD : 멤버 변수 선언
    • ElementType.LOCAL_VARIABLE : 지역 변수 선언
    • ElementType.METHOD : 메서드 선언
    • ElementType.PARAMETER : 전달인자 선언
    • ElementType.TYPE_PARAMETER : 전달인자 타입 선언
    • ElementType.TYPE_USE : 타입 선언

     

    @Documented : 해당 어노테이션을 Javadoc에 포함시킴

     

    @Inherited : 어노테이션의 상속을 가능하게 함

     

    @Repeatable : Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 함

Designed by Tistory.