hyeonga_code

Java의 신_Chapter 17_Annotation 본문

Java

Java의 신_Chapter 17_Annotation

hyeonga 2024. 3. 29. 07:59
반응형

 

2024.03.28

 

- 어노테이션_Annotation

-- 클래스나 메소드를 선언할 때에 @를 사용하는 것

-- 메타데이터라고도 한다

-- 컴파일러에게 정보를 알려주는 기능

-- 컴파일 할 때, 설치 시 작업을 지정

-- 실행할 때 별도의 처리가 필요한 경우 사용한다.

-- 어노테이션은 상속할 수 없다.

 

-- 이미 지정되어 있는 어노테이션

---- @Override

------ 해당 메소드가 부모 클래스의 메소드를 Override 했다는 것을 명시적으로 선언

---- @Deprecated

------ 더이상 사용하지 않음을 명시하고 누군가 사용하는 경우 경고를 해준다.

---- @SupressWarnings("//속성값을 지정할 수 있다.")

------ 경고를 무시할 수 있도록 한다.

 

-- 메타 어노테이션_Meta Annotation

---- 어노테이션을 직접 선언할 때 사용

---- @Target

------ 어노테이션을 어떤 것에 적용할 지 선언

@Target(ElementType.METHOD)
    /*
    	-- CONSTRUCTO0R : 생성자 선언 시
        -- FIELD : enum 상수를 포함한 필드 값 선언 시
        -- LOCAL_VARIABLE : 지역 변수 선언 시
        -- METHOD : 메소드 선언 시
        -- PACKAGE : 패키지 선언 시
        -- PARAMETER : 매개변수 선언 시
        -- TYPE : 클래스, 인터페이스, enum 등 선언 시
    */

 

---- @Retention

------ 어노테이션 정보의 유지 시간을 설정

@Retention(RetentionPolicy.RUNTIME)
    /*
    	-- SOURCE : 컴파일 시 사라짐
        -- CLASS : 클래스 어노테이션 정보가 컴파일러에 의해 참조 가능하지만 VM에서는 사라짐
        -- RUNTIME : 실행 시 VM에 의해 참조 가능
    */

 

---- @Documented

------ 해당 어노테이션에 대한 정보가 API 문서에 포함된다는 것을 선언

 

---- @Inherited

------ 모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 할 수 있다는 것을 선언

 

---- @Interface

------ 어노테이션을 선언할 때 사용

package annotation.base;

import java.lang.annotation.*;

@Target(ElementType.METHOD)		// 메소드에 사용하는 어노테이션임을 명시(두 개 이상 사용 가능)
@Retention(RetentionPolicy.RUNTIME)	// 실행 시 어노테이션을 참조한다.
public @Interface MyAnnotation {	// @MyAnnotation으로 사용할 수 있다.
	public int number();			// 해당 항목에 대한 타입으로 값을 지정할 수 있다.
    public String text() default "This is first annotation";	// 기본값을 설정할 수 있다.
} //end MyAnnotation

public class UseAnnorationSample {
    
    @MyAnnotation(number=0)
    public static void main(String[] args) {
    	UseAnnotationSample sample = new UseAnnotationSample();
    } //end main()
    
    @MyAnnotation(number=1)
    public void annotationSample1() { }
    
    @MyAnnotation(number=2, text="second")
    public void annotationSample2() { }

} //end class(UseAnnotationSample)

 

 

-- 어노테이션으로 지정한 값 확인하기

Class.Method

---- 자바의 리플렉션_Reflection API에서 제공하는 클래스

---- 메소드의 정보를 확인하는 데에 사용

더보기
Method[] methods = Class.getDeclaredMethods();
    // 해당 클래스에 선언되어 있는 메소드들의 목록을 배열로 리턴

for(Method method : methods) {
    MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
        // 해당 메소드에 선언되어 있는 매개 변수로 넘겨준 어노테이션 객체를 리턴한다.

    if( annotation != null ) {
        int number = annotation.number();
        String text = annotation.text();
    }
}

 

-- 어노테이션의 용도

    // 제약 사항 등을 선언하기 위해
@Deprecated
@Override
@NoNull

    // 용도를 나타내기 위해
@Entity
@TestCase
@WebService

    // 행위를 나타내기 위해
@Statefull
@Transaction

    // 처리를 나타내기 위해
@Column
@XmlElement
더보기

-- 어노테이션 이전에는 XML / properties 파일에 지정했다.

-- 어노테이션이 변환된 모습은 컴파일 단계에서 생성되므로 역컴파일하지 않는 이상 직접 확인할 수 없다.

반응형

'Java' 카테고리의 다른 글

Java의 신2_Chapter 3_Generic  (0) 2024.04.02
Java의 신2_Chapter 2_ java.lang 패키지  (0) 2024.04.02
Java의 신_Chapter 16_Nested Class  (0) 2024.03.29
Java의 신_Chapter 15_String  (0) 2024.03.29
Java의 신_Chapter 14_Exception  (0) 2024.03.28