HOME > kotlin > basic

Kotlin - Infix functions 알아보기

By JS | 07 Jun 2019

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 함수의 사용은 코드를 간결하게 만들고 가독성을 높혀준다는 장점이 있습니다.

참고