Java 어노테이션

어노테이션 (Annotation)

자바 어노테이션은 Java 컴파일러 및 JVM에서 사용할 수 있는 몇가지 정보를 나타내기 위한 메타데이터 입니다.

2가지 종류가 있는데 내장 주석 , 사용자 주석이 있습니다.

@Override (내장)

자바 오버라이딩할때 흔히 보는 주석입니다.
즉 하위 클래스 메서드가 상위 클래스 메서드를 재정의하게 되면 표시하는 어노테이션 입니다.

class Animal{
    void eat(){
        System.out.println(" 음식을 먹는중");
    }
}

class Dog extends Animal{

    private String name;

    Dog(String name){
       this.name=name;
    }

    @Override
    void eat() {
        System.out.print(name);
        super.eat();
    }
}
public class Main {

    public static void main(String[] args) {


        Dog d=new Dog("강이지");
        d.eat();

    }
}//강아지 음식을 먹는중

@SuppressWarnings (내장)

컴파일러에서 발생한 경고를 제외하는데 사용합니다.

내 생각에는 별로 좋지 않은 어노테이션인듯 하다.
왜냐하면 굳이 경고를 무시할 이유가 있을까? 라는 생각을 갖고 있고 그 경고가 정말 실마리같은 경고일수도 있기 때문에 별로 좋은 방법은 아닌 것 같다.

@Deprecated (내장)

이 어노테이션을 사용하면 해당 메서드는 더이상 사용되지 않음을 표시하고 만약 사용이 되었다면 컴파일러에게 경고를 보냅니다.


class A{
    void m(){
        System.out.println("hello m");
    }

    @Deprecated
    void n(){
        System.out.println("hello n");
    }
}

public class Main {
    public static void main(String[] args) {


        A a=new A();

        a.m();
        a.n();


    }
}


사용자 주석

사용자 주석을 사용할때 기억해야할 사항이 있습니다.

  1. 메서드에는 throw절이 없어야 합니다

  2. 메서드에는 매개변수가 없어야 합니다.

  3. 메서드는 데이터 유형,문자열,클래스,열거형 등등 이러한 데이터 유형의 배열 중 하나를 반환해야 합니다.


@Interface (사용자)

  1. 마커 주석
@interface MyAnnotaion{
}
  1. 단일 값 주석
@interface MyAnnotaion{

    int value();
}
  1. 다중 값 주석
@interface MyAnnotaion{

    int value();
    String value2();
    String value3();

}

@Target (사용자)

@Target 태그는 주석이 사용되는 유형을 지정하는데 사용합니다.

  • 클래스에 사용
@Target(ElementType.TYPE)
@interface MyAnno{
    int value();
    String value2();
}
  • 클래스 ,메소드 ,필드에 사용
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@interface MyAnno{
    int value();
    String value2();
}

@Retention (사용자)

이 어노테이션은 어노테이션에 라이플 사이클 -> 살아남는 시간을 의미합니다

RetentionPolicy유효성
RetentionPolicy.SOURCE소스파일에만 존제 -> 컴파일 후 어노테이션은 사라집니다.
RetentionPolicy.CLASS클래스에서 파일에서만 존재 -> ,런타임시 클래스를 메모리로 읽어오면 해당 정보는 삭제
RetentionPolicy.RUNTIME클래스 파일에 존재 , 실행시 사용가능 -> 컴파일러 , JVM에서 전부 작동합니다


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation{
    int value();
    String name();
}


//주석 적용
class Hello{

    @MyAnnotation(value = 20,name="hwan")
    public void sayHello(){
        System.out.println("안녕");
    }
}

public class Main {
    public static void main(String[] args) throws Exception {


        Hello h=new Hello();

        Method method=h.getClass().getMethod("sayHello");

        MyAnnotation m=method.getAnnotation(MyAnnotation.class);

        System.out.println("값:"+m.value());
        System.out.println("이름:"+m.name());
        


    }
}//값:20 이름:hwan

좋은 웹페이지 즐겨찾기