-
10 장 - 애노테이션과 리플랙션Kotlin/코틀린인액션요약 2022. 9. 22. 00:01728x90
10장에서 다루는 내용
애노테이션 적용과 정의
리플렉션을 사용해 실행 시점에 객체 내부 관찰
코틀린 실전 프로젝트 예제
어떤 함수를 호출하려면 그 함수가 정의된 클래스의 이름과 함수 이름, 파라미터 이름등을 알아야 했습니다.
하지만 애노테이션과 리플랙션을 이용하면 그런 제약을 벗어나서 미리 알지 못하는 임의의 클래스를 다룰 수 있습니다.
애너테이션 선언과 적용
코틀린에서는 자바와 같은 방법으로 애노테이션을 사용할 수 있습니다.
예를 들어 JUnit 프레임워크를 사용한다면 테스트 메서드 앞에 @Test 애노테이션을 붙이면 됩니다.
흥미로운 예제로는 @Deprecated 애노테이션입니다.
의미론적으로는 자바와 동일하지만 코틀린에서는 replaceWith 파라미터를 통해 옛버전을 대신할 수 있는 패턴을 제시합니다.
@JvmName, @JvmStatic, @JvmOverloads, @JvmField등 자바와 상호운영을 하기위한 애노테이션으로 자바 API를 제어할 수 있습니다.
애너테이션을 활용한 JSON 직렬화 제어
data class Person(val name: String, val age: Int) val person = Person("Alice", 29) println(serialize(person)) //결과 {"age" : 29, "name" : "Alice"} val json = """{"name": "Alice", "age" : 29} """ println(deserialize<Person>(json)) //출력 Person(name= Alice, age = 29)
기본적으로 코틀린의 제이키드 라이브러리는 모든 프로퍼티를 직렬화하며 프로퍼티 이름을 키로 사용합니다.
이때 @JsonExclude와 @JsonName 어노테이션을 통해 프로퍼티를 무시하거나 이름을 변경하여 적용할 수 있습니다.
data class Perons( @JsonName("alias") val firstName: String, @JsonExclude val age: Int? = null )
애너테이션 선언
//파라미터가 없는 애노테이션 annotation class JsonExclude //파라미터가 있는 애노테이션 annotation class JsonName(val name: String)
메타애노테이션
애노테이션 클래스에서 어노태이션을 적용할 수 있습니다.
이를 메타애노테이션이라고 부릅니다.
메타애노테이션들은 컴파일러가 애노테이션을 처리하는 방법을 제어합니다.
@Target 애노테이션
@Target(AnnotationTarget.PROPERTY) annotation class JsonExclude
애너테이션을 적용할 수 있는 요소의 유형을 지정합니다.
리플랙션
실행 시점에 객체의 프로퍼티와 메서드에 접근할 수 있게 해주는 방법입니다.
직렬화 라이브러리는 어떤 객체든 JSON으로 변환할 수 있어야 하고, 실행 시점에 되기 전까지는 라이브러리가 직렬화할 프로퍼티나 클래스에 대한 정보를 알 수 없습니다.
java.lang.reflect 와 kotlin.reflect 패키지를 사용합니다.
두가지를 혼용해서 사용하는 이유는 kotlin.reflect는 아직 자바 리플랙션 API를 대체할 수 있는 복잡한 기능을 제공하지 않습니다.
하지만 자바에는 없는 프로퍼티나 널이 될 수 있는 타입과 같은 코틀린 고유 개념에 대한 리플렉션을 제공합니다.
KClass
java.lang.Class에 해당하는 KClass를 사용하면 클래스 안에 있는 모든 선언을 열거하고 각 선언에 접근하거나 클래스의 상위 클래스를 얻는 등의 작업이 가능합니다.
리플랙션을 사용한 객체 직렬화 구현
private fun StringBuilder.serializeObject(obj : Any){ val kClass = obj.javaClass.kotlin //객체의 kClass를 얻기 val properties = kClass.memberProperties //클래스의 모든 프로퍼티 얻기 properties.joinToStringBuilder( this, prefix = "{", postfix ="}") {prop -> serializeString(prop.name) append(": ") serializerPropertyValue(prop.get(ojb)) } ) }
728x90'Kotlin > 코틀린인액션요약' 카테고리의 다른 글
11장 - DSL 만들기 (0) 2022.09.23 9장 -제네릭스 (1) 2022.09.20 8장 - 고차 함수 : 파라미터와 반환 값으로 람다 사용 (0) 2022.09.19 7장 - 연산자 오버로딩과 기타 관례 (1) 2022.09.17 6장 - 코틀린 타입 시스템 (0) 2022.09.16