자바칩

[자바의 신] 17장. 어노테이션: 문제 풀이 본문

Study/Java

[자바의 신] 17장. 어노테이션: 문제 풀이

아기제이 2024. 5. 10. 17:28
728x90

1. @Override 어노테이션의 용도는 무엇인가요?

부모 클래스에서 선언된 메소드의 이름과 매개변수가 같은 메소드를 자식 클래스에 선언하는 것을 Overriding이라고 한다. 만약 자식 클래스에 선언된 메소드가 여러 개일 경우, 어떤 메소드가 Overriding된 메소드인지 찾기 어려울 수도 있기 때문에, 명시적으로 어노테이션을 선언해서 Overridng된 메소드를 쉽게 찾기 위한 용도이다. 또한, 자식 클래스에서 Overriding한 메소드를 선언할 때 혹시 잘못 코딩했을 수도 있으니 컴파일러한테 확인해 달라고 요청하는 용도이다.

*사용 예시
@Override
public void overridingMethod() {}

 

 

2. @SuppressWarnings 어노테이션의 용도는 무엇인가요?

컴파일할 때 경고 메시지가 뜰 것을 알지만 사용하는 데에는 아무 지장이 없으니까 컴파일러한테 경고 메시지를 띄워주지 말라고 요청하는 용도이다. 

*사용 예시
@SuppressWarnings("deprecation")
public class UseDeprecatedMethodClass {}

하지만 이 어노테이션을 너무 남용할 경우 Deprecated된 메소드를 사용해도 모르고 넘어갈 수도 있으니 주의해야 한다.

 

 

3. @Deprecated 어노테이션의 용도는 무엇인가요?

Deprecated된 클래스나 메소드를 만약 다른 개발자가 사용하려고 할 경우, 이 클래스나 메소드는 더 이상 사용 불가능하니까 경고 메시지를 띄워 달라고 컴파일러에게 요청하는 용도이다.

*사용 예시
@Deprecated
public void deprecatedMethod() {}

 

 

4. 어노테이션을 선언할 때 사용하는 어노테이션을 무엇이라고 부르나요?

메타 어노테이션
종류: @Target, @Retention, @Documented, @Inherited

*사용 예시
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
    public int number();
    public String text() default "This is first annotation";
}

 

 

5. 4번의 답에 있는 어노테이션들을 사용할 때 import 해야 하는 패키지는 무엇인가요?

java.lang.annotation

*사용 예시
import java.lang.annotation.Target
import java.lang.annotation.ElementType
import java.lang annotation.Retention
import java.lang.annotation.RetentionPolicy

 

 

6. @Target 어노테이션의 용도는 무엇인가요?

어노테이션의 적용 대상을 지정하는 용도이다.

*사용 예시
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
    public int number();
    public String text() default "This is first annotation";
}

이렇게 선언하면 메소드 선언 시 @UserAnnotation을 사용할 수 있다.

*적용 대상 목록
요소 타입 대상
CONSTRUCTOR 생성자 선언 시
FIELD enum 상수를 포함한 필드(field) 값 선언 시
LOCAL_VARIABLE 지역 변수 선언 시
METHOD 메소드 선언 시
PACKAGE 패키지 선언 시
PARAMETER 매개 변수 선언 시
TYPE 클래스, 인터페이스, enum 등 선언 시

 

 

7. @Retention 어노테이션의 용도는 무엇인가요?

어노테이션의 유지 정보를 지정하는 용도이다.

*사용 예시
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
    public int number();
    public String text() default "This is first annotation";
}

이렇게 선언하면 실행 시에 @UserAnnotation을 참조하게 된다.

*적용 대상 목록
요소 타입 대상
SOURCE 어노테이션 정보가 컴파일 시 사라짐
CLASS 클래스 파일에 있는 어노테이션 정보가 컴파일러에 의해서 참조 가능함. 하지만, 가상 머신에서는 사라짐
RUNTIME 실행 시 어노테이션 정보가 가상 머신에 의해서 참조 가능

 

 

8. @Inherited 어노테이션의 용도는 무엇인가요?

부모 클래스의 어노테이션을 모든 자식 클래스에서 사용 가능하게 만드는 용도이다.

 

 

9. 어노테이션을 선언할 때에는 class 대신 어떤 예약어를 사용해야 하나요?

@interface

*사용 예시
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAnnotation {
    public int number();
    public String text() default "This is first annotation";
}

이렇게 선언하면 개발자가 직접 선언한 @UserAnnotation (@클래스이름) 어노테이션을 사용 가능하다.

 

 

*어노테이션을 사용하는 이유
1. 제약사항 등을 선언하기 위해: @Deprecated, @Override, @NotNull
2. 용도를 나타내기 위해: @Entity, @TestCase, @WebService
3. 행위를 나타내기 위해: @Statefull, @Transaction
4. 처리를 나타내기 위해: @Column, @XmlElement