Kotlin-2@에서 일반적으로 사용되는 주석

이 기사에서는 주석을 사용자 정의하는 방법을 배웁니다.

커스텀 어노테이션을 직접 사용하는 방법을 주로 소개합니다.


참고로 지난 글에서 코틀린의 어노테이션 소개와 종류에 대해 알아보았습니다.

Kotlin-1@에서 일반적으로 사용되는 주석

Kotlin에서 일반적으로 사용되는 주석에 대해 알아보세요. 주석은 방해가 되지 않는 방식으로 코드에 메타데이터(추가 기능)를 추가하는 방법입니다.

Kotlin의 주석 유형 Kotlin에서

android-developer.


리플렉션을 사용한 사용자 지정 주석

Kotlin에서 주석을 맞춤설정하는 방법에는 두 가지가 있습니다.

  1. 맞춤 반사
  2. 코드 생성을 사용하여 사용자 지정

먼저 반사가 무엇인지 간단히 설명하겠습니다.

리플렉션은 런타임에 프로그램 구조(객체, 함수, 속성)를 분석하는 기술입니다.

즉, 프로그램이 실행 중일 때 예제 및 기타 방법을 통해 개체의 내부 구조를 파악할 수 있습니다.

하지만 이렇게 매번 확인하기 때문에 애플리케이션 성능 저하로 이어집니다.

Kotlin에서 리플렉션을 사용하려면 KClass를 사용해야 합니다.

코틀린 반영이에 대한 정보는 여기에서 확인할 수 있습니다.

Android Kotlin Reflection의 기본 정의

Kotlin의 리플렉션은 런타임에 프로그램 클래스를 검사하는 기술입니다.

즉, 프로그램이 실행 중일 때 예제 및 기타 방법을 통해 개체의 내부 구조를 파악할 수 있습니다.

android-developer.

Kotlin에서 KClass를 사용하려면 다음 라이브러리를 추가해야 합니다.

implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

아래와 같이 Annotation을 지정하여 주석 클래스를 생성해 보겠습니다.

@Target(AnnotationTarget.PROPERTY)
annotation class StringConstraint(
    val minLength: Int,
    val maxLength: Int
)

위에 생성 문자열 제약 주석이 달린 클래스는 문자열 변수의 최소 및 최대 길이 정의 이것은 당신이 만든 주석 클래스입니다.

속성 값이 있는 사용자 지정 주석 데이터 클래스적용하다.

data class Data(
    // set field value with custom annotation
    @StringConstraint(10, 50)
    val title: String,
    @StringConstraint(100, 500)
    val contents: String
)

이제 이 두 검사를 사용하여 유효성을 검사하는 코드를 작성합니다.

object FieldValidator {
    data class ValidationResult(
        var isValid: Boolean = true,
        val invalidFieldNames: MutableList<String> = mutableListOf()
    )

    fun validate(data: Data): ValidationResult {
        val result = ValidationResult()

        // get property information with reflection
        data::class.declaredMemberProperties.forEach {
            val field = it
            val annotation = it.findAnnotation<StringConstraint>()

            if (annotation !
= null && field.getter.visibility == KVisibility.PUBLIC) { val fieldValue = field.getter.call(data) as String // set validation with annotation field value if (fieldValue.length !
in annotation.minLength..annotation.maxLength) { result.isValid = false result.invalidFieldNames.add(field.name) } } } return result } }

그리고 다음 코드를 작성하고 실행합니다.

fun main() {
    val data = Data(
        "극도의 투명함",
        "투명함은 단순히 결과가 잘 공유되는 것 이상을 의미합니다.

우리는 결과뿐 아니라 의도와 맥락, 과정까지도 알 수 있을 만큼 공유하는 것을 투명하다고 합니다.

우리가 추구하는 극도의 솔직함은 투명함이 전제되어야만 발현된다고 믿습니다.

" ) val validationResult = FieldValidator.validate(data) // Validation: false / not validated Field: (title) println("Validation: ${validationResult.isValid} / not validated Field: ${validationResult.invalidFieldNames}") }


정리하다

이렇게 커스텀 Annotation과 Kotlin Reflection을 사용하는 방법을 배웠습니다.

참고로 모든 코드는 다음과 같습니다.

import kotlin.reflect.KVisibility
import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.full.findAnnotation

@Target(AnnotationTarget.PROPERTY)
annotation class StringConstraint(
    val minLength: Int,
    val maxLength: Int
)

data class Data(
    // set field value with custom annotation
    @StringConstraint(10, 50)
    val title: String,
    @StringConstraint(100, 500)
    val contents: String
)

object FieldValidator {
    data class ValidationResult(
        var isValid: Boolean = true,
        val invalidFieldNames: MutableList<String> = mutableListOf()
    )

    fun validate(data: Data): ValidationResult {
        val result = ValidationResult()

        // get property information with reflection
        data::class.declaredMemberProperties.forEach {
            val field = it
            val annotation = it.findAnnotation<StringConstraint>()

            if (annotation !
= null && field.getter.visibility == KVisibility.PUBLIC) { val fieldValue = field.getter.call(data) as String // set validation with annotation field value if (fieldValue.length !
in annotation.minLength..annotation.maxLength) { result.isValid = false result.invalidFieldNames.add(field.name) } } } return result } } fun main() { val data = Data( "극도의 투명함", "투명함은 단순히 결과가 잘 공유되는 것 이상을 의미합니다.

우리는 결과뿐 아니라 의도와 맥락, 과정까지도 알 수 있을 만큼 공유하는 것을 투명하다고 합니다.

우리가 추구하는 극도의 솔직함은 투명함이 전제되어야만 발현된다고 믿습니다.

" ) val validationResult = FieldValidator.validate(data) // Validation: false / not validated Field: (title) println("Validation: ${validationResult.isValid} / not validated Field: ${validationResult.invalidFieldNames}") }

다음 글에서는 두 번째 Annotation 커스텀 방법,

코드 생성을 사용하여 컴파일 타임에 주석에 논리 삽입

알아 보자!

인용하다: https://blog.gangnamunni.com/post/kotlin-annotation/