안드로이드나 코틀린으로 개발하다보면 더블콜론 (::) 을 자주 접하게 된다. 더블콜론은 무엇을 의미할까
보통 더블콜론은 리플렉션을 위해 사용한다. 그럼 리플렉션이란 무엇인가? 간단하게 알아보고 넘어가보자
리플렉션은 실행 중에 프로그램의 구조를 검사하고 수정할 수 있는 기능을 말한다. 이는 객체나 클래스의 속성, 메소드 등의 정보를 런타임에 동적으로 조작할 수 있게 해준다. ( 런타임상 컴파일된 바이트코드에서 작성한 코드가 어느 곳에 위치하는지 모르기에 바이트코드를 이용해 참조하려는 값을 찾기위해 사용)
사용법은 다음과 같다.
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)
}
여기서 ::greet는 greet 함수를 가리키는 참조이다.
이것을 통해 람다를 직접 사용하지 않고도 함수를 다른 함수로 전달할 수 있다.
이것이 메소드 참조의 기본적인 방식이다.
'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 |