[Kotlin] Infix Function 이 뭐게?

H43RO·2021년 10월 22일
6

Kotlin 과 친해지기

목록 보기
16/18
post-thumbnail

Infix Function

코틀린을 사용하다보면 아래와 같이 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/

profile
어려울수록 기본에 미치고 열광하라

0개의 댓글