1. 애노테이션
1.1 애노테이션 적용
애노테이션의 인자
- 원시 타입의 값
- 문자열
- enum
- 클래스 참조
- @MyAnnotation(MyClass::class)처럼 ::class를 클래스 이름 뒤에 뒤에 넣어야 함
- 다른 애노테이션 클래스 : @를 넣지 않음
- 지금까지의 요소들로 이뤄진 배열
- @RequestMapping(path = arrayOf("/foo", "/bar"))처럼 arrayOf 함수를 사용
1.2 애노테이션 대상
프로퍼티의 getter에 해당 애노테이션을 붙이고 싶은 경우
사용 시점 대상을 지정할 때 지원하는 목록
- property : 프로퍼티 전체
- field : 프로퍼티에 필드
- get : 프로퍼티 게터
- set : 프로퍼티 세터
- receiver : 확장 함수나 프로퍼티의 수신 객체 파라미터
- param : 생성자 파라미터
- setparam : 세터 파라미터
- delegate : 위임 프로퍼티의 위임 인스턴스를 담아둔 필드
- file : 파일 안에 선언된 최상위 함수와 프로퍼티를 담아두는 클래스
1.3 애노테이션 선언
- 자바 : @interface
- 코틀린 : annotation
annotation class MyAnnotation(val name: String)
단, 모든 파라미터에 val를 반드시 붙여준다.
1.4 메타어노테이션
메타어노테이션 : 애노테이션 클래스에 적용할 수 있는 애노테이션 (@Target 등)
2. 리플렉션
리플렉션은 실행 시점에 객체의 프로퍼티와 메소드에 접근할 수 있게 해주는 방법
언제 사용되는가? JSON 직렬화 라이브러리
타입과 관계 없이 객체를 다뤄야 하거나 객체가 제공하는 메소드나 프로퍼티 이름을 오직 실행 시점에만 알 수 있는 경우가 존재한다. → JSON 직렬화 라이브러리
사용방법 - 2개의 API
- 자바에서 제공하는 java.lang.reflect 패키지
- 자바 리플렉션 API가 필요한 이유는 코틀린 클래스는 일반 자바 바이트코드로 컴파일되기 때문
- 코틀린이 kotlin.reflect에서 제공하는 API
코틀린 리플렉션 API : KClass, KCallable, KFunction, KProperty
- KClass : 자바의 java.lang.Class에 해당하는 클래스
- val person = Person("Harry",27) val kClass = person.javaClass.kotlin println(kClass.simpleName)
- KCallable : 함수와 프로퍼티를 아우르는 공통 상위 인터페이스
- 내부에는 call 메소드가 존재하며 이 call을 사용하면 함수나 프로퍼티의 게터를 호출할 수 있음
fun foo(x:Int) = println(x) val kFunction = ::foo kFunction.call(42)
- KFunction : ::foo의 값 타입이 리플렉션 API에 존재하는 KFunction 클래스의 인스턴스
- 파라미터의 개수나 타입에 따라 KFunctionN이 생성됨
- KProperty : call 메소드를 호출할 수 있고, get 메소드 또한 지원
- var counter = 0 val kProperty = ::counter kProperty.setter.call(21) println(kProperty.get())
kotlin in action 책을 통한 공부입니다.
'공부 > Kotlin' 카테고리의 다른 글
Kotest의 테스트스타일 10가지 (0) | 2022.07.26 |
---|---|
11장 DSL 만들기 (0) | 2022.07.18 |
9장 제네릭스 (0) | 2022.07.02 |
[Kotlin] 파라미터와 반환 값으로 람다 사용해보기 (0) | 2022.07.02 |
[Kotlin] 연산자 오버로딩과 기타 관례 사용해보기 (0) | 2022.06.20 |
댓글