loop-study
개발 공부할래?
loop-study
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 목표 및 회고 (25)
    • 세미나 & 워크샵 (1)
    • 교육 및 인강 (67)
      • TDD, Clean Code with Java (5)
      • ATDD, 클린 코드 with Spring (6)
      • DDD 세레나데 (3)
      • 인프라 공방 (6)
      • 이규원의 현실 세상의 TDD (19)
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (18)
      • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 (8)
      • 코딩으로 학습하는 GoF의 디자인 패턴 (1)
      • 스프링 시큐리티 완전정복 6.x (1)
    • 서적 (62)
      • 객체지향의 사실과 오해 (1)
      • 객체지향과 디자인패턴 (7)
      • 만들면서 배우는 클린 아키텍처 (3)
      • 테스트 주도 개발로 배우는 객체 지향 설계와 실천 (1)
      • 오브젝트: 코드로 이해하는 객체지향 설계 (17)
      • 리팩토링 : 코드 구조를 체계적으로 개선하여 효율적인 리팩터링 구현하기 (0)
      • 토비의 스프링 (3)
      • 엔터프라이즈 애플리케이션 아키텍처 패턴 (9)
      • 개발자의 글쓰기 (1)
      • 소프트웨어 장인 (17)
      • Real MySQL 8.0 (2)
      • JVM 밑바닥까지 파헤치기 (0)
    • 개발 & 방법론 (29)
      • Java (13)
      • TDD (5)
      • ATDD (3)
      • DDD (6)
      • 인프라 (2)
      • SQL (0)
    • 개인이야기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 백엔드 로드맵

인기 글

태그

  • 스프링
  • TDD
  • 객체지향
  • java
  • 테스트 주도 개발
  • 김영한
  • 조영호
  • 소프트웨어 장인
  • 스터디
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • Test Driven Development
  • 장인정신
  • 인프런
  • 인프라공방
  • 이규원
  • 추상화
  • Patterns of Enterprise Application Architecture
  • 현실세상의 TDD
  • nextstep
  • ATDD
  • 자바
  • study
  • DDD 세레나데
  • JUnit
  • 넥스트스탭
  • 엔터프라이즈 애플리케이션 아키텍처 패턴
  • 마틴 파울러
  • 오브젝트
  • fastcampus
  • 백기선

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
loop-study

개발 공부할래?

12주차 : 애노테이션
개발 & 방법론/Java

12주차 : 애노테이션

2021. 2. 25. 16:30

애노테이션에 대해 알아보자

 

12주차 과제: 애노테이션 · Issue #12 · whiteship/live-study

목표 자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수) 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 마감일시 2021년 2월 6일 토요일 오후 1시까지.

github.com

목표

자바의 애노테이션에 대해 학습하세요.

학습할 것 (필수)

  • 애노테이션 정의하는 방법
  • @retention
  • @target
  • @documented
  • 애노테이션 프로세서

Annotation 이란?

개발을 하다보면 클래스, 메서드, 변수 앞에 붙은 @ 표시를 많이 보았을 것이다

어노테이션이라 부르며, 자바5부터 추가된 요소다

사전적 의미는 "주석"이며 의미대로 자바 코드에 달아 특수한 의미를 부여한다.

이 특별한 의미는 컴파일 타임 또는 런타임에 해석될 수 있다.

 

Annotation 사용방법은 크게 문서화, 컴파일러 체크, 코드 분석을 위한 용도로 사용된다.

문법적으론 @기호가 붙은 심볼을 사용하며 패키지, 클래스, 메소드, 프로퍼티, 변수에 명시할 수 있다.

컴파일 타임에 에러를 발생시켜 위험요소를 경고하거나 확인해주는 목적으로 사용된다.

가장 큰 비중을 갖는 방법은 코드 분석 또는 "메타데이터" 용도다. 메타데이터란 데이터를 위한 데이터, 즉 데이터에 대해 설명하는 데이터를 의미한다. 메타데이터로 annotation의 효용을 가장 잘 느낄 수 있는 부분이 JEE 설정과 유효성 검사부분이다.

 

annotation 은 클래스처럼 멤버를 가질 수 있다. 이 멤버의 개수에 따라 다음과 같이 분류된다

  • Marker annotaion : 멤버 변수가 없으며, 단순 표식으로 사용된다. 컴파일러에게 어떤 의미를 전달한다
  • Single-value annotation : 멤버로 단일변수만 갖는다. 단일변수 밖에 없기에 값만을 명시하여 데이터를 전달한다
  • Full annotaion : 멤버를 둘 이상 갖는다. 데이터를 key=value 의 형태로 전달한다

 

빌트인(Built-in) 어노테이션

자바에서 기본적으로 제공하는 annotation 이 존재하는데 이를 빌트인(Built-in) 어노테이션이라 한다

  • @Override : 메소드가 오버라이드 됐는지 검증한다. 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 발생한다.
  • @Deprecated : 메소드 사용을 비권장한다. 만약 사용하면 컴파일 경고를 일으킨다.
public class SampleService {

    @Deprecated
    public void walkingLunge() {
        System.out.println("워킹런지하면 후폭풍 엄청납니다");
    }
}

public class AnnotationMain {

    public static void main(String[] args) {
        SampleService service = new SampleService();
        service.walkingLunge();
    }
}

컴파일 경고 발생

  • @Supresswarning : 컴파일 경고를 무시한다
  • @SafeVarargs : 제너릭 같은 가변인자 매개변수 사용 경고를 무시한다 (자바7 이상)
  • @FuntionalInterface : 람다 함수등을 위한 인터페이스 지정, 메소드가 없거나 2개 이상되면 컴파일 에러 발생 (자바 8이상)

 

메타 어노테이션

어노테이션에 적용하는 어노테이션이다

커스텀 어노테이션을 만들 때 주로 사용한다

 

 

@Retention

어노테이션의 라이프 타임을 설정한다

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}
  • SOURCE : 컴파일 전까지만 유효하고 컴파일 이후엔 사라진다, @Override 같이 주석처럼 사용된다
  • CLASS : 디폴트값이며, 컴파일러가 클래스를 참조할 때까지만 유효한다.
  • RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능하다. 

 

 

@Target

어노테이션이 적용할 위치를 정한다

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE,

    /**
     * Module declaration.
     *
     * @since 9
     */
    MODULE
}
  • TYPE : 타입 선언
  • FIELD : 멤버변수 선언
  • METHOD : 메소드 선언
  • PARAMETER : 매개변수 선언
  • CONSTRUCTOR : 생성자 선언
  • LOCAL_VARIABLE : 지역변수 선언
  • ANNOTAION_TYPE : 어노테이션 타입 선언
  • PACKAGE : 패키지 선언
  • TYPE_PARAMETER : 전달인자 타입 선언
  • TYPE_USE : 타입 선언
  • MODULE : 모듈 선언

 

@Documented

어노테이션 정보를 javadoc 문서에 포함시키는 메타 어노테이션이다.

 

 

@Inherited

부모를 상속받은 자식 클래스까지 어노테이션 상속이 되게 해준다

 

 

@Repeatable

어노테이션을 반복적으로 선언할 수 있게 해준다

 

 

Annotation 정의하는 방법

custom annotation 을 사용하고 싶으면 다음과 같이 선언하여 사용한다

public @interface MyName {}

@interface 를 이용하여 선언한다.

 

 

어노테이션 프로세서

자바 컴파일러 플러그인의 일종이며, 어노테이션에 대한 코드베이스를 검사, 수정, 생성하는 기능이다

컴파일 시점에 조작하기 때문에 런타임 비용은 제로지만

기존 클래스 코드를 변경할 때는 약간의 hack이 필요하다

 

 

 

 

 

 

참고자료

https://hiddenviewer.tistory.com/88
https://jktech.tistory.com/28
https://jdm.kr/blog/216
www.inflearn.com/course/the-java-code-manipulation/dashboard

 

 

'개발 & 방법론 > Java' 카테고리의 다른 글

11주차 과제 : enum  (0) 2021.02.18
10주차 과제 : 멀티쓰레드 프로그래밍  (0) 2021.02.18
9주차 : 예외처리  (0) 2021.02.14
자바 8주차 : 인터페이스  (0) 2021.02.13
7주차 : 패키지  (0) 2021.01.01
    '개발 & 방법론/Java' 카테고리의 다른 글
    • 11주차 과제 : enum
    • 10주차 과제 : 멀티쓰레드 프로그래밍
    • 9주차 : 예외처리
    • 자바 8주차 : 인터페이스
    loop-study
    loop-study
    오늘도 공부하자

    티스토리툴바