-
인프런 워밍업 클럽/ 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 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 함
'인프런 워밍업 클럽' 카테고리의 다른 글
인프런 워밍업 클럽/ BE 6일차 과제 : 스프링 컨테이너의 사용 (0) 2024.05.13 인프런 워밍업 클럽/ BE 5일차 과제 : 클린 코드 (0) 2024.05.09 인프런 워밍업 클럽/ BE 4일차 과제 : API 추가 (0) 2024.05.07 인프런 워밍업 클럽/ BE 3일차 과제 : 익명 클래스와 람다식 (0) 2024.05.01 인프런 워밍업 클럽/ BE 2일차 과제 : API (0) 2024.04.30