Kotlin
[Kotlin] 12.1 어노테이션 선언과 적용
mygomii
2025. 5. 26. 09:00
반응형
12.1.1 어노테이션을 적용해 선언에 표지 남기기
- @Test
- 테스트 함수임을 표시하는 어노테이션
- 코틀린에서 JUnit 기반의 테스트를 실행할 때 사용
- 이 어노테이션이 붙은 함수는 테스트 프레임워크가 자동으로 실행
import org.junit.Test
import kotlin.test.assertEquals
class MyTests {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}
- JUnit4: org.junit.Test
- **JUnit5**에서는 @org.junit.jupiter.api.Test 사용
- 코틀린에서는 kotlin.test.Test도 제공됨 (멀티플랫폼에서 사용 가능)
- @Deprecated
- 더 이상 사용하지 말아야 할 선언에 붙이는 어노테이션
- 해당 API가 구식이거나 위험하므로 대체 API를 사용하라는 의도 전달
@Deprecated("이 함수는 사용하지 마세요. use newFunction() instead.", ReplaceWith("newFunction()"))
fun oldFunction() {
println("Old")
}
fun newFunction() {
println("New")
}
- ReplaceWith 사용
- ReplaceWith("newFunction()")을 지정하면, IDE가 자동으로 빠르게 치환 제안해 줌
@Deprecated일반적인 사용 중단 표시
@Deprecated(message, ReplaceWith(...)) | 대체 API 제안 포함 |
@Deprecated(level = DeprecationLevel.ERROR) | 아예 컴파일 오류로 막을 수도 있음 |
12.1.2 어노테이션이 참조할 수 있는 정확한 선언 지정: 어노테이션 타킷
- 어노테이션을 정의할 때, 어디에 사용할 수 있는지 명확히 지정할 수 있어야 함
- 이를 위해 코틀린은 @Target 어노테이션을 사용함.
@Target(AnnotationTarget.FUNCTION)
annotation class MyAnnotation
- 이렇게 하면 MyAnnotation은 함수에만 사용 가능하게 제한됨
타깃 종류설명
CLASS | 클래스 또는 객체 선언 |
ANNOTATION_CLASS | 어노테이션 클래스 |
TYPE_PARAMETER | 타입 파라미터 (예: <T>) |
PROPERTY | 프로퍼티 전체 |
FIELD | 자바 필드 (직렬화용 등) |
CONSTRUCTOR | 생성자 |
FUNCTION | 함수 |
VALUE_PARAMETER | 함수 파라미터 |
EXPRESSION | 식(expression) |
FILE | 파일 전체 |
TYPE | 타입 사용 위치 (예: 제네릭, 타입 캐스트 등) |
LOCAL_VARIABLE | 지역 변수 |
PROPERTY_GETTER / SETTER | 프로퍼티 접근자(get, set) |
12.1.3 어노테이션을 활용해 JSON 직렬화 제어
- JSON 직렬화/역직렬화 시 어떤 프로퍼티를 포함할지/무시할지, 어떤 이름으로 매핑할지를 어노테이션을 통해 제어할 수 있음.
- 코틀린에서는 @Serializable, @SerialName, @Transient 등을 통해 직렬화 동작을 정밀하게 설정할 수 있음.
12.1.4 어노테이션 선언
- 코틀린에서는 직접 어노테이션을 선언할 수 있음
- 자바 스타일과 유사하지만, 코틀린만의 선언 방식과 제한이 있음.
annotation class MyAnnotation
- class 앞에 annotation 키워드를 붙이면 어노테이션이 됨
- 어노테이션 클래스는 생성자 파라미터를 가질 수 있음
annotation class JsonName(val name: String)
@JsonName("user_name")
data class User(val name: String)
- @JsonName("user_name") → 어노테이션에 전달된 값은 런타임에 활용 가능
12.1.5 메타어노테션: 어노테이션을 처리하는 방법 제어
- 메타어노테이션 자체에도 어노테이션을 붙일 수 있음. 이를 메타어노테이션이라 함.
- 대표적으로 다음 3가지가 중요함
- @Target - 어노테이션을 어디에 적용할 수 있는지 정의
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class Example
- @Retention - 어노테이션 정보가 언제까지 유지되는지 정의
- 어노테이션 정보가 언제까지 유지되는지 정의
SOURCE컴파일 시까지만 존재. 바이트코드에는 없음@Retention(AnnotationRetention.RUNTIME) annotation class Example
BINARY 바이트코드엔 있으나 리플렉션 불가 RUNTIME 런타임에도 유지, 리플렉션으로 접근 가능 - @Repeatable - 어노테이션을 같은 선언에 여러 번 사용할 수 있게 허용
- @Repeatable @Target(AnnotationTarget.CLASS) annotation class Tag(val name: String) @Tag("A") @Tag("B") class MyClass
12.1.7 어노테이션 파라미터로 제네릭 클래스 받기
- 어노테이션은 파라미터로 클래스 타입을 받을 수 있음
- 하지만 자바 및 코틀린 어노테이션의 제약으로 인해, 제네릭 타입 인자를 직접 명시할 수는 없음
- 대신 Class<*> 형태로 원시 타입(Raw Type) 또는 구체화된 타입을 전달
반응형