코틀린 언어 정리 6-6

Annotations

Annotation을 적용할 수 있는 대상들

선언한 애노테이션을 적용할 수 있는 대상은 다음과 같습니다.

- class, interface, object, parameter, function, typealias, property, constructor, expression(표현식), function literal(함수 구문)

각 대상별 적용 문법 예시

annotation은 


annotation class TA


로 선언 되어 있다고 가정합니다.


적용할 수 있는 대상의 종류는 많지만 모두 위치 기반 지정 방식(애노테이션을 지정할 대상 앞에 선언한 애노테이션 명시)을 사용합니다.

class

@TA class ClassA

interface

@TA interface InterfaceA

object

@TA object ObjectA

parameter

fun funcA ( @TA param1: Int, param2: Long ): String { return "AAA" }

function

@TA fun funcA () {}

typealias

@Target으로 TYPEALIAS를 지정해 주어야 사용 가능합니다.


@Target(AnnotationTarget.TYPEALIAS) annotation class TA

@TA typealias AAA = ClassA

property

전역 및 클래스 프로퍼티, 지역 변수 등에 모두 사용 가능합니다.

@TA var name: String = "TopLevel variable"

constructor

constructor 키워드 앞에 annotation을 추가하면 됩니다.

주 생성자 및 보조 생성자에 모두 사용 가능합니다.


class ClassC @TA constructor () {

    var name: String = "ClassC::name"


    @TA constructor ( name: String ): this() {

        this.name = name

    }

}

expression ( 표현식 )

사용하려면 @Retention에 SOURCE, @Target 에 EXPRESSION 을 지정해 주어야 합니다.

return value를 별도로 취급하는 것처럼 설명한 곳도 있으나 표현식과 동일하게 처리됩니다.


@Retention(AnnotationRetention.SOURCE)

@Target(AnnotationTarget.EXPRESSION)

annotation class TA_expression

var name1: String = @TA_expression "annotation for expression"


return @TA_expression "return value"

function literal ( 함수 구문 )

일반 함수 선언의 함수 리터럴 앞에는 추가할 수 없으며 lambda 구문에만 사용할 수 있습니다.


var lambda = @TA { if ( num > 10 ) 100 else 0 }

var func3: (Int)-> Int = @TA { num-> num }

전체 예제

annotation class TA

// annotation 적용 가능 대상


// class

@TA class ClassA


// interface

@TA interface InterfaceA


// object

@TA object ObjectA


// parameter

fun funcA ( @TA param1: Int, param2: Long ): String {

   return "funcA ( param1, param2 ) return " + (param1 + param2)

}


// function

@TA fun funcA () {

}


// typaalias

@Target(AnnotationTarget.TYPEALIAS)

annotation class TA_typealias

@TA_typealias typealias AAA = ClassA


// property

class ClassB {

   @TA var name: String = "ClassB::name"

}

@TA var name: String = "TopLevel variable"



// constructor: 주 생성자 및 보조 생성자

class ClassC @TA constructor () {

   var name: String = "ClassC::name"


   @TA constructor ( name: String ): this() {

       this.name = name

   }

}


// 표현식 1

@Retention(AnnotationRetention.SOURCE)

@Target(AnnotationTarget.EXPRESSION)

annotation class TA_expression

var name1: String = @TA_expression "annotation for expression"


// 반환값: 표현식과 동일함. 별도로 구분할 필요 없음

fun func1 (): String {

   return (@TA_expression "func1")

}


// 함수 리터럴 1 ( 컴파일 에러 )

/*fun func2 (): String @TA {

   return "func2"

}*/


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

fun test () {

   // property

   @TA var name: String = "TopLevel variable"


   // 표현식 2

   var num: Int = 0

   @TA_expression num = 15 + 20

   num = @TA_expression 15 + 20


   // 함수 리터럴 2

   var lambda = @TA { if ( num > 10 ) 100 else 0 }

   var func3: (Int)-> Int = @TA { num-> num }

   //var func3_1 = fun ( num: Int ): Int @TA { return num } // 컴파일 에러

}



+ Recent posts