안드로이드 스튜디오에서 코틀린으로 앱을 개발하다보면 더블콜론 (::) 을 자주 접하게 된다.
더블콜론은 왜 쓰이고 그 의미가 무엇일까
그 전에 리플렉션에 대해 간단히 개념만 알고 가보자!
Reflection --> "반사"
런타임 (실행시점)에 프로그램의 클래스를 조사하기 위해서 사용되는 기술이다.
즉, 프로그램이 실행중일 때 객체의 내부 구조를 리플렉션을 통해 알 수 있다.
(ex: 어노테이션)
타입과 관계없이 객체를 다루거나, 객체가 제공하는 정보 (메소드 , 프로퍼티) 를 실행시점에만 알 수 있는 경우에 리플렉션을 사용한다.
더블콜론 (::) ?
더블콜론 연산자는 함수나 클래스를 참조하거나 호출할 때 사용된다.
리플렉션을 사용하여 클래스 또는 함수를 동적으로 찾아 더블콜론(::) 연산자를 통해 참조할 수 있다
우리는 안드로이드 프로그래밍 내에서 액티비티를 띄울 때 아래와 같은 코드를 많이 접한다.
val intent = Intent(this, TestClass::class.java)
startActivity(intent)
위 코드는 TestClass라는 액티비티 클래스의 정보를 가져오며,
이를 통해 액티비티로 이동하거나 정보를 전달할 수 있게 된다.
그럼 끝에 붙은 .java는 무엇일까?
자바에서는 클래스 정보를 가져올 때 'Class' 객체를 사용한다. (class객체 리턴)
하지만 코틀린에서는 더블콜론을 통해 클래스를 참조하면 'KClass'를 리턴하게 된다.
두 언어간에 클래스 정보를 표현하는 방식이 다르기 때문에 Kotlin에서 사용할 때 . java를 붙인 형태로
Class객체를 얻을 수 있게 되는 것이다.
사용
더블 콜론 연산자는 다음과 같이 여러 경우에서 사용될 수 있다.
val printMessage: (String) -> Unit = ::println
printMessage("funny","yammi)
val myClass = MyClass::class
fun add() { .. }
val addREf = ::add
data class Singer(val name: String, val songName: String, val age: Int)
val name = Person::name
val sName = Person::songName
val age = Person::age