티스토리 뷰

VIEW/JSP&SERVLET

[JSP] 어노테이션(annotation)

찰떡쿠키부스트 2017. 12. 1. 16:01

 

#어노테이션


컴파일 시 에러를 발생시키거나 경고해주는 목적.
소스 코드에 메타데이터를 표현하는 목적.

* 만들어져있는 어노테이션
@Override - 메소드가 오버라이드 됐는지 검증.부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류.
@Deprecated - 메소드를 사용하지 말도록 유도. 만약 사용한다면 컴파일 경고.
@SuppressWarnings - 컴파일 경고를 무시.
@SafeVarargs - 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시.(자바7 이상)
@FunctionalInterface - 람다 함수등을 위한 인터페이스를 지정. 메소드가 없거나 두개 이상 되면 컴파일 오류.(자바 8이상)

* 메타 어노테이션(Meta Annotation)
 이 메타 어노테이션을 이용해 커스텀 어노테이션을 만들수 있다.

@Target - 어노테이션이 적용할 위치를 결정
        ElementType.PACKAGE, // 패키지 선언시
        ElementType.TYPE, // 타입(클래스,인터페이스,enum) 선언시
        ElementType.CONSTRUCTOR, // 생성자 선언시
        ElementType.FIELD, // 멤버 변수 선언시
        ElementType.METHOD, // 메소드 선언시
        ElementType.ANNOTATION_TYPE, // 어노테이션 타입 선언시
        ElementType.LOCAL_VARIABLE, // 지역 변수 선언시
        ElementType.PARAMETER, // 매개 변수 선언시
        ElementType.TYPE_PARAMETER, // 매개 변수 타입 선언시
        ElementType.TYPE_USE // 타입 사용시
@Retention - 어노테이션의 범위(?). 어떤 시점까지 어노테이션이 영향을 미치는지 결정
        RetentionPolicy.SOURCE --> 어노테이션 정보는 컴파일 이후 없어짐
        RetentionPolicy.CALSS --> 컴파일러가 클래스를 참조할 때까지 유효
        RetentionPolicy.RUNTIME --> 컴파일 이후에도 JVM에 의해서 참조가 가능
@Documented - 문서에도 어노테이션의 정보가 표현
@Inherited - 이 어노테이션을 선언하면 부모클래스에서 어노테이션을 상속 받을 수 있다.
@Repeatable - 반복적으로 어노테이션을 선언할 수 있게 한다.



* 어노테이션에는 메타데이터 저장을 위해 클래스처럼 메서드를 가질 수 있다~

~~ 자 이제 어노테이션 내맘대로 만들어보자(커스텀 어노테이션) ~~

ex)  천천히봐라 다안다.

import java.lang.annotation.*;
import java.lang.reflect.*;
//자 어노테이션 만든다
@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD)
@interface A{
 int a() default 200;   //어노테이션의 메서드(만들어준거다)
 String[] b() default {"ab"};   //어노테이션의 메서드(만들어준거다)
}
// 어노테이션 A만들었다
class B{
 @A // A만들때 Target이 METHOD니까 메서드위에 선언한다.
 void b(){
 System.out.println("aaa");
 }
 @A(a=300,b={"cd","ef"})  //어노테이션 A의 메서드 값 변경~해서 메서드위에 선언.
 void c(){
 System.out.println("bbb");
 }
}
//자 이제 호출해보자
class C{
 public static void main(String args[]) throws Exception{
 Class<B> bObj=B.class;
 Method m1=bObj.getDeclaredMethod("b");
 Method m2=bObj.getDeclaredMethod("c");

 A o1=m1.getAnnotation(A.class);
 A o2=m2.getAnnotation(A.class);
 System.out.println(o1.a());
 System.out.println(o1.b()[0]);
 System.out.println(o2.a());
 String[] array=o2.b();
 System.out.println(array[0]);
 System.out.println(array[1]);
 }
}
}



~~ 자 이제 만들어져있는 것도 써보자 ~~

ex)
import java.util.*;
class A{
 public static void main(String args[]){
 Date d=new Date();
 int y=d.getYear(); // Date클래스의 getYear는 Calendar클래스가 나오면서 구식이라서 잘안쓰도록 권장됨
     // 그래서 컴파일하면 오류는 안나지면 경고가 뜬다 내가 쓴다는데 감히??
 }
}


import java.util.*;
class A{
 public static void main(String args[]){
 Date d=new Date();
 @SuppressWarnings({"deprecation"})  // 그래서 경고 무시시키는 어노테이션 사용~
 int y=d.getYear();
 }
}

'VIEW > JSP&SERVLET' 카테고리의 다른 글

[JSP] 파일 업로드,답변형 게시판  (0) 2017.12.01
[JSP] sitemesh  (0) 2017.12.01
[JSP] 국제화태그,필터  (0) 2017.12.01
[JSP] JSTL  (0) 2017.12.01
[JSP] <jsp:useBean>,Cookie,EL  (0) 2017.12.01
댓글