Kotlin - Infix functions 알아보기

Infix 함수는 두개의 변수 가운데 오는 함수를 말합니다. 코틀린에서 기본적으로 정의된 Infix 함수들 중에 Pair를 만드는 to가 있습니다.

아래 코드를 보시면, white0xffffff 객체 중간에 to가 Infix 함수입니다. to는 양 옆의 객체들로 Pair 객체를 만들어줍니다.

val pair : Pair<String, String> = "White" to "0xffffff"

아래 코드는 코틀린에서 Map을 만들 때 자주 사용하는 패턴입니다. 하나는 Pair를 이용하였고, 하나는 Infix 함수를 이용하였습니다.

val map1 = mapOf(Pair("key1", "value1"), Pair("key2", "value2"))
val map2 = mapOf("key1" to "value1", "key2" to "value2")

Infix 함수인 to를 사용한 코드를 보면 key가 value에 매핑된다는 것을 명확히 알 수 있습니다. 또한 코드라기보다 언어에 가깝게 느껴집니다. 그리고 코드 양도 적어지기 때문에 Pair를 사용한 것보다 간결합니다.

Infix 함수 정의

Infix 함수는 직접 정의할 수도 있습니다. infix fun dispatcher.함수이름(receiver): 리턴타입 { 구현부 }과 같은 형식으로 정의할 수 있습니다. 여기서 dispatcher는 Infix 함수 전에 오는 객체를 말하며, receiver는 Infix 함수 뒤에 오는 객체를 말합니다.

아래와 같이 add라는 infix함수를 정의하였습니다.

infix fun String.add(other:String): String {
    return this + other
}

위의 코드 "Hello" add "World"에서 문자열 "Hello"는 dispatcher이고, 문자열 "World"는 receiver입니다. 구현부에서 사용한 this는 dispatcher 객체를 의미합니다.

아래 코드를 실행시키면 두개의 객체(dispatcher, receiver)가 합쳐져 HelloWorld가 출력됩니다.

val string = "Hello" add "World"
System.out.println(string)
// 결과
// HelloWorld

클래스 내에 Infix 함수 정의

아래 코드는 클래스 내에 Infix 함수를 정의한 예제입니다. 클래스 내에 정의하면 dispatcher가 클래스 자신이기 때문에 생략할 수 있습니다.

class MyString {
    var string = ""
    infix fun add(other: String) {
        this.string = this.string + other
    }
}

위의 클래스는 아래처럼 쓸 수 있습니다. add할 때마다 클래스 내부에 문자열이 더해집니다.

val myString = MyString()
myString add "Hello"
myString add "World"
myString add "Kotlin"
System.out.println(myString.string)

// 결과
// HelloWorldKotlin

만약 Infix 함수를 사용하지 않으면?

Infix 함수를 사용하지 않고 위의 클래스를 구현하면 아래처럼 될 것입니다. 매번 문자열을 더할 때마다 myString.add()를 사용하여 함수를 호출해야 합니다.

class MyString {
    var string = ""
    fun add(other: String) {
        this.string = this.string + other
    }
}

fun main() {
    val myString = MyString()
    myString.add("Hello")
    myString.add("World")
    myString.add("Kotlin")
    System.out.println(myString.string)
}

정리

Infix 함수에 대해서 알아보았습니다. 적절한 Infix 함수의 사용은 코드를 간결하게 만들고 가독성을 높혀준다는 장점이 있습니다.

참고

Loading script...
codechachaCopyright ©2019 codechacha