Apple is Apple
Published 2024. 5. 9. 21:23
더블 콜론 참조(::) Language/Kotlin

안드로이드나 코틀린으로 개발하다보면 더블콜론 (::) 을 자주 접하게 된다. 더블콜론은 무엇을 의미할까

 

보통 더블콜론은 리플렉션을 위해 사용한다. 그럼 리플렉션이란 무엇인가? 간단하게 알아보고 넘어가보자

 

리플렉션은 실행 중에 프로그램의 구조를 검사하고 수정할 수 있는 기능을 말한다. 이는 객체나 클래스의 속성, 메소드 등의 정보를 런타임에 동적으로 조작할 수 있게 해준다. ( 런타임상 컴파일된 바이트코드에서 작성한 코드가 어느 곳에 위치하는지 모르기에 바이트코드를 이용해 참조하려는 값을 찾기위해 사용)

 

사용법은 다음과 같다.

 

JAVA

AClass.class

Kotlin

AClass::class

 

하지만 우리가 안드로이드 프로그래밍을 할 땐 

AClass::class.java

// ex
Intent(this, SomeActivity::class.java)

뒤에 .java를 붙여 사용하는 경우가 많다. 

 

이는 자바에서 사용되는 클래스와 코틀린에서 사용되는 클래스가 다르기 때문이다.

자바에서는 Class를 리턴하지만 코틀린에서 ::class를 하면 코틀린에 선언된 KClass라는 타입을 리턴하기 때문이다.

그렇기 떄문에 리플렉션을 사용하기 위해 Class를 리턴할 필요가 있어 KClass -> Class로의 변환이 필요한데, KClass 내부에 java 라는 프로퍼티에 접근해서 Class 타입을 가져올 수 있으므로 .java를 붙이게 된다.

 

이러한 방식으로 더블콜론을 통해 클래스 참조를 할 수있다.

 

또 다른 사용법으로는 함수 참조도 가능하다.

 

예를 들어, 다음과 같이 함수를 선언하고 있다고 해보자

fun greet(name: String) {
    println("Hello, $name!")
}

 

이제 이 함수를 다른 함수에 인자로 전달하려면, 일반적으로는 람다를 사용할 수 있다.

fun main() {
    val greetingFunction: (String) -> Unit = { name -> greet(name) }
    greetSomeone("John", greetingFunction)
}

fun greetSomeone(name: String, greeting: (String) -> Unit) {
    greeting(name)
}

 

여기서 greetingFunction은 greet 함수를 호출하는 람다이다.

이것을 더 간결하게 만들기 위해 메소드 참조를 사용할 수 있다. 

다음과 같이 사용 할 수 있다.

fun main() {
    val greetingFunction = ::greet
    greetSomeone("John", greetingFunction)
}

여기서 ::greetgreet 함수를 가리키는 참조이다.

이것을 통해 람다를 직접 사용하지 않고도 함수를 다른 함수로 전달할 수 있다.

이것이 메소드 참조의 기본적인 방식이다.

'Language > Kotlin' 카테고리의 다른 글

URL Encoding  (0) 2024.04.02
[Kotlin] Coroutine  (2) 2024.03.07
Sealed Class  (0) 2023.09.15
[Kotlin] Scope function  (0) 2023.07.31
profile

Apple is Apple

@mjjjjjj