본문 바로가기
공부/Kotlin

10장 애노테이션과 리플렉션

by JERO__ 2022. 7. 18.

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

  1. 자바에서 제공하는 java.lang.reflect 패키지
    • 자바 리플렉션 API가 필요한 이유는 코틀린 클래스는 일반 자바 바이트코드로 컴파일되기 때문
  2. 코틀린이 kotlin.reflect에서 제공하는 API

코틀린 리플렉션 API : KClass, KCallable, KFunction, KProperty

  1. KClass : 자바의 java.lang.Class에 해당하는 클래스
  2. val person = Person("Harry",27) val kClass = person.javaClass.kotlin println(kClass.simpleName)
  3. KCallable : 함수와 프로퍼티를 아우르는 공통 상위 인터페이스
    • 내부에는 call 메소드가 존재하며 이 call을 사용하면 함수나 프로퍼티의 게터를 호출할 수 있음
    fun foo(x:Int) = println(x)
    val kFunction = ::foo
    kFunction.call(42)
    
  4. KFunction : ::foo의 값 타입이 리플렉션 API에 존재하는 KFunction 클래스의 인스턴스
    • 파라미터의 개수나 타입에 따라 KFunctionN이 생성됨
  5. KProperty : call 메소드를 호출할 수 있고, get 메소드 또한 지원
  6. var counter = 0 val kProperty = ::counter kProperty.setter.call(21) println(kProperty.get())

 

kotlin in action 책을 통한 공부입니다.

댓글