코틀린을 사용하다보면 아래와 같이 Pair
객체를 만들어주는 경우가 많다.
val monday: Pair<String, String> = "Monday" to "월요일"
그런데 to
가 키워드 하이라이팅되는 것을 보면, 그냥 쓰는 구문이 절대 아니고 어떤 동작을 하는 것이 분명하다. 내부 구현을 들여다보면, 아래와 같다.
package kotlin
public infix fun <A, B> A.to(that: B): kotlin.Pair<A, B> { /* compiled code */ }
제너릭으로 두 개 객체를 받고, A의 확장함수를 만들어 주고 A와 B를 엮어서 Pair
형태로 만들어 반환해주는 코드가 내장되어 있다.
이러한 구문을 사용하면 확실히 코드가 훨씬 간결해지고, 가독성이 향상되는 것을 확인할 수 있다. 코틀린에서 Map
을 만들때, 더욱 차이점을 명확히 느낄 수 있다.
val day1 = mapOf(Pair("Monday", "월요일"), Pair("Tuesday", "화요일"))
val day2 = mapOf("Monday" to "월요일", "Tuesday" to "화요일")
코틀린에서는 두 개의 객체 중간에 들어가게 되는 함수 형태를
Infix Function
이라고 부른다.
뭔지는 알았으니까, 한 번 직접 만들어보자. 생각보다 정말 간단하다!
Infix
함수는 위처럼 기본 내장 함수 뿐만 아니라 개발자가 직접 정의할 수도 있다.
직접 Infix 함수를 정의한다고 하면, 아래와 같은 형태를 유지하면 된다.
infix fun dispatcher.함수명(receiver): 리턴타입 { }
만약 아래 예제로 들면,
val monday: Pair<String, String> = "Monday" to "월요일"
"Monday" 가 dispatcher
이고 "월요일" 이 receiver
인 것이다.
아래와 같이 직접 add
라는 Infix 함수를 만들어보자. String
에 확장함수 형태로 달아줄 것이며, 결과적으로 왼쪽과 오른쪽 String
을 하나로 합쳐서 반환해주는 기능을 정의해보자.
infix fun String.add(other:String): String {
return this + other
}
눈치챘겠지만 this
키워드는 왼쪽 객체, 즉 dispatcher
를 지칭한다.
그런 뒤, 아래와 같이 사용해볼 수 있다.
infix fun String.add(other:String): String {
return this + other
}
fun main() {
println("월요일" add "싫어")
}
월요일싫어
아래와 같이 클래스 내부에 정의를 하게 되면
dispatcher
는 자기 자신일 것이므로 생략할 수 있다. 아래는String
을 누적할 수 있는 형태의 클래스와 메소드를 구현한 형태이다.
class StringAcc {
var data = ""
infix fun add(receiver: String) {
this.data += receiver
}
}
fun main() {
val stringAcc = StringAcc()
stringAcc add "월요일"
stringAcc add " 진짜"
stringAcc add " 싫다"
println(stringAcc.data)
}
월요일 진짜 싫다
Infix Function 은 용도에 맞게 잘 사용한다면 가독성을 크게 향상시킬 수 있는 수단이다.
https://kotlinlang.org/docs/functions.html#infix-notation
https://codechacha.com/ko/kotlin-infix-functions/