코틀린 언어 정리 6-7

Annotations

Use-site Targets

용도

  • 지금까지 언급한, 애노테이션을(annotation) 특정 대상에 적용한 문법들은 모두 위치 기반 적용 방법을 사용한 것입니다.(대상 앞에 "@TA"와 같이 추가하는 방법) 하지만 위치 기반 적용 방법으로 애노테이션 지정 대상을 특정할 수 없는 경우, 적절한 용어의 키워드를 이용해 구체적으로 지정할 수 있는 방법을 제공합니다.

  • 코틀린의 소스 코드에는 없었지만(눈에 보이지 않았지만) 이 코드(코틀린 소스 코드)를 자바 코드로 변환 시 나타나는 대상에 대해 애노테이션을 지정할 수 있는 방법을 제공합니다.


정리해 보면 크게 두 가지 분류로 생각해 볼 수 있습니다.

기존 보다 더 세분화 하여 대상을 지정하는 방법과 눈에 보이지 않는 대상을 지정하는 방법으로 나누어 볼 수 있습니다.

@file

파일 전체에 대해 annotation을 적용합니다.

@property

Kotlin에서 일반적으로 사용하는 property 선언에는 field, getter, setter 선언이 내포되어 있는데, property를 이용하면 각각을 별도로 지정할 수 있습니다.. Java에서는 보이지 않는 annotation입니다.

@field

Kotlin에서 일반적으로 사용하는 property 선언에는 field, getter, setter 선언이 내포되어 있는데, property 선언 앞에서 field를 사용하면 property가 포함하는 요소 중 field에만 annotation을 적용할 수 있습니다.

@get

Kotlin에서 일반적으로 사용하는 property 선언에는 field, getter, setter 선언이 내포되어 있는데, property 선언 앞에서 get을 사용하면 property가 포함하는 요소 중 get(getter)에만 annotation을 적용할 수 있습니다.

@set

Kotlin에서 일반적으로 사용하는 property 선언에는 field, getter, setter 선언이 내포되어 있는데, property 선언 앞에서 set을 사용하면 property가 포함하는 요소 중 set(setter)에만 annotation을 적용할 수 있습니다.

@receiver

annotation을 확장 함수, 확장 프로퍼티 선언에 포함되어 있는 receiver에 적용합니다.

@param

annotation을 생성자의 매개변수에 적용합니다.

@setparam

annotation을 property의 setter 의 매개변수에 적용합니다.

@delegate

delegate instance를 저장하는 필드에 적용합니다.


Use-site Targets 전체 예제

// Use-site Target 간단 예제


//@file:JvmName("AppKta" ) // 생성되는 클래스 파일 이름 지정

annotation class TA ()

annotation class TA1()


class ClassA (

   @field:TA val first: String,

   @get:TA val second: String, // property getter

   @set:TA var second1: String, // property setter

   @field:TA val third: Int,

   @property:TA val fourth: Long, // are not visible to Java

   @param:TA val fifth: String, // constructor의 parameter

   @setparam:TA var sixth: String, // setter의 parameter...set ( value )

   @property:[TA TA1] val seventh: String, // 다수의 Use-site Target annotation 적용 방법1

   @property:TA @property:TA1 val eighth: String // 다수의 Use-site Target annotation 적용 방법2


) {}


// Extension function / property 에서 receiver인 ClassA

fun @receiver:TA ClassA.funcExt1() {

   println("ClassA.funcExt1()")

}


//fun main (args: Array<String> ) {

fun test () {

}




+ Recent posts