[Java]어노테이션

정석용·2023년 4월 13일
0

Java

목록 보기
12/15
post-thumbnail

어노테이션

사전적 의미로는 주석이라는 뜻을 가지고 있다. 자바에서는 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다.

자바의 어노테이션은 보통 골뱅이(@) 기호를 앞에 붙여서 사용한다. JDK 1.5 버전 이상에서부터 사용가능하며, 자바 어노테이션은 클래스 파일에 임베드되어 컴파일러에 의해 생성된 이후 JVM에 포함되어 동작한다.

어노테이션을 이용시

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

자바 빌트인 어노테이션

@Override
메소드를 오버라이드 하겠다는 의미로 메소드의 선언 앞에 붙여준다. 만약 상속 받은 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드가 없다면 컴파일 오류가 발생.

@Deprecated
메소드를 Deprecated 시킨다. 이 메소드를 사용하는 애플리케이션을 컴파일 할 경우 컴파일 경고가 발생한다. 하위호환을 위해서 메소드 자체를 없애지는 못하지만 사용하지 말 것을 사용자에게 알리고 싶을 때 붙여준다.

@SuppressWarnings
컴파일러 경고를 출력하지 않도록 설정한다. 경고 상황을 개발자가 알고 있는 경우에는 컴파일 로그가 지저분해지고 진짜 잡아야하는 경고들이 잘 보이지 않을 수 있기 때문에 어노테이션을 사용한다.

@SafeVarargs
제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시

@FunctionalInterface
자바에서 람다 함수를 위한 인터페이스를 지정한다. 함수형 인터페이스에 사용하기 적합하지 않은 경우에는 컴파일 오류가 발생한다.

메타 어노테이션

@Retention
어노테이션의 리텐션 기간을 명명한다.

.class

  • 바이트 코드 파일까지 어노테이션 정보를 유지한다.
  • 리플렉션을 이용해서 어노테이션 정보를 얻을 수는 없다.

.Runtime

  • 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해 런타임에 어노테이션 정보를 가져올 수 있다.

.Source

  • Compile 이후에는 삭제된다.

@Documented
자바 문서에도 어노테이션 정보가 표현된다.

@Target
생성할 어노테이션이 적용될 수 있는 위치를 나열한다.

.TYPE

  • 클래스, 인터페이스, 열거 타입

.ANNOTAION_TYPE

  • 어노테이션

.FILED, .CONSTRUCTOR, .METHOD, .LOCAL_VARIABLE, .PACKAGE

  • 필드, 생성자, 메소드, 로컬변수, 패키지

@Inherited
자식 클래스가 어노테이션을 상속 받을 수 있다.

@Repeatable
반복적으로 어노테이션을 선언할 수 있다.

어노테이션 프로세서

어노테이션 프로세서란?
컴파일 타임에 어노테이션을 스캔하고 처리하기 위해 javac에서 확장해서 사용하는 도구라고 볼수 있다. 그리고 개발자들은 특정 어노테이션을 위한 개발자만의 어노테이션 프로세서를 등록할 수 있다.

컴파일 단계에서 실핼되기 때문에, 빌드 단계에서 에러를 출력하게 할 수 있고, 소스코드 및 바이트 코드를 생성할 수도 있다.

Lombok이란?

@Getter, @Setter, @builder 등의 어노테이션과 프로세서를 제공하여 표준적으로 작성해야 할 코드를 개발자 대신 생성해주는 라이브러리 이다.

롬복 미사용

public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getImageUrl() {
        return imageUrl;
    }

롬복 사용시

	private Long id;            
    private String imageUrl;    

이와같이 롬복 사용시 간결하게 코드 표현이 가능하다.

래퍼런스
https://hbase.tistory.com/169
https://roadj.tistory.com/9
https://zzang9ha.tistory.com/349

profile
오늘도 성장중

0개의 댓글