반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 서버
- 플러터
- 스나이퍼팩토리
- Coroutine
- SwiftUI
- 설치
- php개발
- node
- ios
- 스터디
- 정보처리기사
- node.js
- php변수
- 코틀린
- java
- express
- Kotlin
- 그림으로 배우는 서버구조
- php
- Eclipse
- 변수
- Flutter
- android
- 조건문
- jquery
- script
- 이클립스
- kotlininaction
- Flow
- kotlin2.0
Archives
- Today
- Total
mygomii
[Kotlin] 12.1 어노테이션 선언과 적용 본문
반응형
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) 또는 구체화된 타입을 전달
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin] 12.2 리플렉션: 실행 시점에 코틀린 객체 내부 관찰 (0) | 2025.05.27 |
---|---|
Android’s Kotlin Multiplatform announcements at Google I/O and KotlinConf 25 (KMP관련 요약) (1) | 2025.05.26 |
[Kotlin] 11.3 변성은 인자를 함수에 넘겨도 안전한지 판단하게 해준다 (0) | 2025.05.25 |
[Kotlin] 11.2 실행 시점 제네릭스 동작: 소거된 타입 파라미터와 실체화된 타입 파라미터 (0) | 2025.05.23 |
[Kotlin] 11.1 타입 인자를 받는 타입 만들기: 제네릭 타입 파라미터 (0) | 2025.05.22 |