더블콜론(::)

권민주·2025년 7월 1일

코틀린

목록 보기
7/12
post-thumbnail

관련 개념인 리플렉션에 대해 간단히 설명 후 더블 콜론에 대해 설명하겠습니다


1. 리플렉션(reflection)

1)개념

  • 프로그램을 실행할 때 프로그램의 특정 구조를 분석하는 기법

2)KClass

  • 실행 시간 시점에 사용되는 자신의 구조와 행위 조회 가능
  • 패키지 이름이나 메서드, 필드, 구현된 인터페이스, 각종 검사 변수 등의 원본 클래스의 메타데이터가 포함
  • 클래스::class의 형태, KClass<*> 타입

3)KFunction

  • 코틀린에서 제공하는 리플렉션 API 중 하나
  • 함수에 대한 메타데이터와 동작을 표현하는 인터페이스
  • 함수 자체를 값으로 다루고, 함수의 구조 및 정보를 확인하거나 호출
  • 함수 참조(::)로 생성된 참조가 내부적으로 KFunction 타입으로 취급
  • 인자의 수나 타입을 알 수 없을 때는 call(), 타입이 고정된 경우에는 invoke() 사용
  • KFunctionNN개의 매개변수를 받는 함수 의미

4)KProperty

  • 프로퍼티(속성)를 추상적으로 표현하는 인터페이스
  • 프로퍼티를 참조하고 메타데이터를 가져오거나 값을 읽을 수 있도록 도움
  • val 프로퍼티는 KProperty<T>, var 프로퍼티는 KMutableProperty<T>로 표현
  • call()은 내부적으로 프로퍼티의 getter를 호출하지만 타입 안정성이 떨어지므로 get() 추천
  • KPropertyN에서 N은 값을 가져오기 위해 넘겨야 하는 수신 객체의 수를 의미

2. 더블록(::)

1)개념

  • 대상의 참조를 생성하는 연산자. 메타데이터 접근 및 실행이 가능
  • 클래스,함수, 프로퍼티 등에 사용 가능
  • 참조 생성 후 리플렉션에 접근하고 이를 통해 동적 호출 가능

2)함수 호출 시 인자 생략

  • 소괄호와 인자 없이 참조 형태로 고차 함수의 인자로 전달
  • 함수 참조로 특정 함수의 포인터를 고차 함수에 넘겨줌
  • 고차 함수 내부에서 해당 함수 호출되고 내부적으로 invoke()호출
fun sum(x:Int, y:Int):Int=x+y
fun funcParam(a:Int, b:Int, c:(Int,Int)->Int):Int{return c(a,b)}
funcParam(3,2, ::sum)// 함수 참조로 전달

3)프로퍼티 참조

  • 프로퍼티 값에 접근하거나 수정
  • 내부적으로 KProperty 타입으로 관리. 이로 프로퍼티의 이름, 타입, 값에 접근 가능
  • .get().set() 메서드를 사용하여 값을 읽거나 쓰기 가능
val message: String = "Hello, Kotlin!"

fun main() {
    val propertyRef = ::message // KProperty<String>
    println(propertyRef.name) // 출력: message
    println(propertyRef.get()) // 출력: Hello, Kotlin!
}

4)메서드 참조

  • 기존 정의된 함수나 메서드 참조 생성에 사용
  • 내부적으로 KFunction 또는 KFunctionN 객체로 관리. 이로 메타데이터 확인과 호출 가능
  • 함수 이름만으로 참조를 생성. call 또는 invoke를 통해 참조된 메서드를 실행
fun greet(name: String): String = "Hello, $name!"

fun main() {
    val functionRef = ::greet // KFunction<String>
    println(functionRef.name) // 출력: greet
    println(functionRef.call("Kotlin")) // 출력: Hello, Kotlin!
}

5)클래스 참조

  • ::class를 사용하여 클래스에 대한 KClass 참조 생성
  • KClass는 코틀린 리플렉션의 핵심 타입, 클래스의 메타데이터(이름, 멤버, 생성자 등)접근
  • 컴파일 타임에 클래스의 메타데이터를 바이트코드로 저장. 런타임에 이를 사용해 클래스 정보에 접근하거나 리플렉션 기반 작업을 수행
class Person(val name: String, val age: Int)

fun main() {
    val kClass = Person::class // KClass<Person>
    println(kClass.simpleName) // 출력: Person
    println(kClass.constructors) // 생성자 정보 출력
}

6)공통원리

  • 컴파일 시 메타데이터 생성: 참조 대상(함수, 메서드, 프로퍼티, 클래스)의 메타데이터가 컴파일 타임에 생성되고 바이트코드에 저장
  • 리플렉션 객체로 변환: 참조를 생성하면 해당 참조는 코틀린 리플렉션 타입(KProperty, KFunction, KClass 등)으로 감싸짐
  • 리플렉션을 통한 동적 작업: 생성된 참조를 사용해 호출(call), 값 읽기/쓰기(get, set), 클래스 정보 접근 등의 작업을 수행

3. a::b vs a.b()(메서드참조vs메서드호출)

특징a::b (함수 참조)a.b() (함수 호출)
동작함수나 메서드의 참조를 생성함수나 메서드를 즉시 실행
사용 시점나중에 실행하기 위해 참조를 전달하거나 저장할 때즉시 결과를 얻고자 할 때
사용 위치고차 함수, 지연 실행, 콜백 전달 등일반적인 함수나 메서드 호출
결과KFunction 타입의 참조 반환함수의 반환 값 반환
예제a::ba.b()
profile
안드로이드 개발자:D

0개의 댓글