Study 12. 애노테이션

정지은·2023년 2월 13일
0

JAVA를 잡아~

목록 보기
12/15
post-thumbnail

Today's Study


  1. 애노테이션이란?
  2. 애노테이션 정의하는 방법
  3. 표준 애노테이션
  4. @retention
  5. @target
  6. @documented
  7. 애노테이션 프로세서


0. 애노테이션이란?

애노테이션은 주석이라는 뜻을 가지고 있다. 주석처럼 프로그래밍 언어에는 영향을 미치지 않고 다른 프로그램에게 유용한 정보를 제공한다는 점은 같지만 우리가 알고 있는 // 또는 /* */랑은 다르다. 클래스나 메소드 등의 선언할 때 @를 사용하는 것으로 메타데이터라고도 불린다.

애노테이션은 다음의 경우에 사용하고 클래스, 메소드, 변수 등 모든 요소에 선언할 수 있다.

  • 컴파일러에게 정보를 알려줄때
  • 컴파일할 때와 설치시의 작업을 지정할때
  • 실행시 별도의 처리가 필요할때


1. 애노테이션 정의하는 방법


public @interface myannotation{
	String myname()
    int myAge();
}

애노테이션은 다음과 같이 public @interface [어노테이션이름]으로 정의할 수 있다. 또한 애노테이션은 멤버로 Element를 가지고 타입과 이름으로 구성되며 default값을 가질 수 있다.

이렇게 정의한 애노테이션은 myannotation(myName = "Jieun", myAge = 23)처럼 사용할 수 있다.

이러한 애노테이션에는 표준 애노테이션, 메타 애노테이션, 사용자정의 애노테이션이 있다.



2. 표준 애노테이션


표준 애노테이션은 java.lang.annotation 패키지에 포함된 것으로 @Override, @Deprecated, @SuppressWarnings등이 있다.

1) @Override

컴파일러에게 해당 메소드가 오버라이딩한 메소드라는 것을 알린다.

오버라이딩을 할 때 다음과 같이 메소드의 이름을 잘못 적었을 때 컴파일 에러로 실수를 방지해준다.

class Parent{
	void parentMethod(){}
}
class Child extends Parent{
	@Override
    void parentMEthod(){}	//컴파일 에러
}

2) @Deprecated

앞으로 사용하지 않을 것을 권장하는 필드나 메소드에 사용한다.


자바의 Date클래스의 getDate()이다. 이를 보면 @Deprecated로 정의되어있는 것을 확인할 수 있는데 Calender.set을 권장한다고 적혀있는 것을 확인할 수 있다.

🤔 그냥 필드나 메소드를 없애면 안될까?
자바는 하위호환을 중요하게 생각하기에 이전에 이러한 메소드로 개발을 진행한 경우가 있기 때문에 유지를 하고 새로운 권장사항을 기입하는 것이다.


3) @FunctionalInterface

함수형 인터페이스에 붙여 컴파일러가 올바르게 작성했는지 체크한다.

함수형 인터페이스는 추상 메소드가 하나만 존재하는 인터페이스이며 람다식은 이러한 함수형 인터페이스로만 작성이 될 수 있다. @FunctionalInterface는 해당 인터페이스가 함수형 인터페이스에 부합하는지 확인해주는 역할을 한다.


4) @SuppressWarnings

컴파일러의 경고메시지가 나타나지 않게한다.

@SupressWarnings("unchecked")

이렇게 사용하면 unchecked라는 경고가 뜨는 경우를 억제하게 된다. 보통 경고가 많은 경우 확인된 경고를 @SuppressWarnings를 통해 처리하고 모든 경고를 잘 알아보기 위해 사용한다.

매타 애노테이션에는 @retention, @target, @documented, @Inherited, @Repeatable이 있다.

3. @retention

애노테이션이 유지되는 기간을 지정하는데 사용한다.

Retention(RetentionPolicy.SOURCE)

다음과 같이 사용하고 SOURCE, CLASS, RUNTIME 중 하나를 선택할 수 있다.

  • RetentionPolicy.SOURCE : 소스코드인 구간에만 유지되고 클래스 파일이 되는 컴파일 과정에서 애노테이션 정보는 사라진다.
  • RetentionPolicy.CLASS : 클래스 파일까지만 유지되고 .class 파일에 기록되고 런타임에 버려진다. 자바에서의 기본 retention이다.
  • RetentionPolicy.RUNTIME : 런타임 동안에 유지되고 런타임 동안에 프로그램에서 접근도 가능하다.


4. @target

@Target은 애노테이션이 적용될 위치를 지정해준다.

ElementType.PACKAGE패키지선언
ElementType.TYPE타입선언
ElementType.ANNOTATION_TYPE어노테이션 타입 선언
ElementType.CONSRTUCTOR생성자 선언
ElementType.FIELD멤버변수 선언
ElementType.LOCAL_VARIABLE지역 변수 선언
ElementType.METHOD메서드 선언
ElementType.PARAMETER전달인자 선언
ElementType.TYPE_PARAMETER전달인자 타입 선언
ElementType.TYPE_USE타입 선언
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface CustomAnnotation{

}

애노테이션이 적용될 위치가 하나이면 다음과 같이 작성하고 여러개라면 {}를 사용한다.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE,
		 ElementType.PACKAGE})
public @interface CustomAnnotation{

}


5. @documented

javadoc에 해당 애노테이션을 표기할지에 대한 여부를 지정해 준다.

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface CustomAnnotation {
	String testDocument();
}


6. 애노테이션 프로세서

애노테이션 프로세서는 자바 컴파일러 플러그인의 일종으로 애노테이션에 대한 코드베이스를 검사/수정/생성하는 역할을 한다. 애노테이션을 사용하기 위해서는 이 애노테이션 프로세서가 필요하다.

애노테이션 프로세서는 컴파일 도중에 애노테이션을 만나 특정한 동작을 하도록 만들어진 코드이다.
대표적으로 Lombok이 있다. Lombok은 애노테이션을 이용해 보일러 플레이트 코드를 생산해주는 라이브러리이다.

애노테이션의 동작과정은 다음과 같다.
1. 애노테이션 클래스를 생성한다.
2. 애노테이션 파서 클래스(컴파일 시에만 사용)를 생성한다.
3. 애노테이션을 사용한다.
4. 컴파일 시 애노테이션 파서가 애노테이션을 처리한다.
5. 자동 생성된 클래스가 빌드 폴더에 추가된다.

public class Book{
	private String title;
    private String author;
    
    public String getTitle(){
    	return title;
    }
    public void setTitle(string title){
    	this.title = title;
    }
    public String getAutor(){
    	return author;
    }
    public void setAuthor(String author){
    	this.author = author;
    }
}

다음과 같은 코드를 Lombok을 이용해 작성해보자.

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class Book{
	private String title;
    private String author;
}

이렇게 작성하면 getter, setter가 컴파일 단계에서 자동으로 생성되게 되고 애노테이션 프로세서가 동작한 결과이다.



Reference


본 스터디는 2020 백기선님의 자바스터디의 커리큘럼을 참고하여 진행하고 있습니다.

0개의 댓글