Annotation 애노테이션_1

구름코딩·2020년 10월 10일
0

java8 _ 더 자바

목록 보기
19/23

Annotation 이름

기본적인 구성 : @Entity
@ : Annotation(애노테이션)이라고 지칭한다
Entity : 해당 애노테이션의 이름이다

Annotation 요소 (Element)

자바 애노테이션은 값을 세팅할 수 있는 요소들을 가질수 있는데 속성이나 매개변수 정도라고 볼수 있다

@Entity(tableName = "vehicles")은 tableName이라는 이름의 요소를 하나 가지고 있다는 뜻으로 값은 "vehicle"이다

요소를 하나만 가질경우 @tableName("vehicles")로 줄여쓸수 있다

여러개의 요소를 가질 경우
Entity(tableName = "vehicles", primaryKey = "id")로 나타낼 수 있다

Annotation 선언 위치(Placement)

애노테이션은 클래스, 인터페이스, 메소드, 메서드 매개변수, 필드, 지역변수 위에 위치할 수 있다

클래스 위에 선언된 경우

@Entity
public class Vehicle {
}

사용 예시

@Entity
public class Vehicle {

    @Persistent
    protected String vehicleName = null;

    @Getter
    public String getVehicleName() {
        return this.vehicleName;
    }

    public void setVehicleName(@Optional vehicleName) {
        this.vehicleName = vehicleName;
    }

    public List addVehicleNameToList(List names) {
        @Optional
        List localNames = names;

        if(localNames == null)
            localNames = new ArrayList();
        localNames.add(getVehicleName());

        return localNames;
    }
}

자바에서 기본적으로 제공하는 애노테이션

  • @Deprecated
  • @Override
  • @SuppressWarnings

@Deprecated

이 애노테이션이 달린 해당 클래스/메소드 등은 더이상 지원하지 않거나, 좋지 않거나, 더 나은 방법이 있으니 사용하지 말라는 의미이다
만약, 이 애노테이션이 달린 객체를 사용할 경우 자바 컴파일러는 경고를 출력한다

@Override

super클래스에 대해서 오버라이드 되어있다는것을 명시적으로 알려준다. 따라서, 만약 메서드가 super클래스와 매칭되지 않았다면 에러를 출력한다

예시

public class MySuperClass { 
    public void doTheThing() { 
        System.out.println("Do the thing");
    }
} 

public class MySubClass extends MySuperClass{
    @Override
    public void doTheThing() { 		
        System.out.println("Do it differently");
    }
}

@Override를 사용하는 것이 강제는 아니지만, 사용하는 것을 지향한다
메소드 오버라이드를 하고 있는지 모른체 super클래스가 변경될때 컴파일러가 알려주므로 변경점을 체크하기 쉽다

@SuppressWarnings

해당 메소드에 대해서 compiler suppress warnings(컴파일러 경고 억제)를 만들어 낸다. 해당 코드에서 출력하는 경고메시지를 무시할수 있게 해준다

@SuppressWarnings
    public void methodWithWaring(){
}

개인용 애노테이션 만들기

개인적으로 사용할 애노테이션을 만드는 것이 가능하며 애노테이션은 클래스나 인터페이스처럼 자신의 파일에 정의된다

예시

@interface MyAnnotation {
    String value();
    String name();
    int age();
    String[] newNames();
}

위 애노테이션은 4개의 요소를 가지고 있으며 이름은 Annotation이다

@interface 키워드는 자바 컴파일러에게 해당 코드가 애노테이션 정의라는 것을 명시해준다

요소들은 인터페이스에서의 메소드 정의와 유사하다

사용

@MyAnnotation(
    value="123",
    name="woonsik",
    age=26,
    newNames={"woonsik", "byeori"}
)
public class myClass{
}

위의 사용 예시 처럼 각각의 요소에 원하는 값을 지정해서 사용할 수 있다

요소 Default값

  • 요소에 기본값을 설정할 수 있다
  • 디폴트 값을 설정하면 해당 요소에 값을 넣지 않아도 된다
@interface MyAnnotation{
    String value() default"";
    
    String name();
    int age();
    String[] newNames();
}

@MyAnnotation(
    name="woonsik",
    age=26,
    newNames={"woonsik","byeori"}
)
public class MyClass{
}

@Retention

  • 얼마나 오랫동안 애노테이션 정보가 유지되는지 설정할 수 있는 키워드

    SOURCE : 애노테이션 정보가 컴파일시 사라짐, 바이트 코드에서는 존재하지 않는다
    ex) @Override, @SuppressWarnings
    CLASS : 클래스 파일에 존재하고 컴파일러에 의해 사용가능하다, 런타임에서는 사라진다
    RUNTIME : 실행시 애노테이션 정보가 JVM에 의해 참조 가능하다. 자바리플렉션에 의해 사용된다

예시

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "";
}

@Target

  • 자신이 만든 애노테이션이 사용되게될 자바 요소를 지정할 수 있다

기존 @Target 목록

ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
ElementType.FIELD
ElementType.LOCAL_VARIABLE
ElementType.METHOD
ElementType.PACKAGE
ElementType.PARAMETER
ElementType.TYPE

자바8에서 추가된 @Target

ElementType.TYPE_PARAMETER
ElementType.TYPE_USE;

TYPE이란?

  • TYPE이라는 것은 제네릭한 것(class)을 만들때의 타입 변수 <\T, R>

사용

import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Target(ElementType.TYPE_PARAMETER)
public @interface MyAnnotation {
    String value() default "";
}

@Inherited

@Inherited 애노테이션을 사용한 슈퍼클래스를 상속한 서브(자식)클래스에서도 해당 애노테이션을 갖도록 한다

java.lang.annotation.Inherited

@Inherited
public @interface MyAnnotation {
}

@MyAnnotation
public class MySuperClass{
}

public calss MySubClass extends MySuperClass {
}
여기서 MySubClass클래스는 @MyAnnotation을 상속받는다

@Documented

@Documented 애노테이션이 지정된 대상의 JavaDoc에 이 애노테이션의 존재를 표기하도록 지정한다

java.lang.annotation.Documented

@Documented
public @interface MyAnnotation {
}

@MyAnnotation
public class MySubClass{
}
MySubClass클래스는 JavaDoc에서 @Documented를 표시하게 된다
profile
내꿈은 숲속의잠자는공주

0개의 댓글