Infix 함수는 두개의 변수 가운데 오는 함수를 말합니다.
코틀린에서 기본적으로 정의된 Infix 함수들 중에 Pair를 만드는 to
가 있습니다.
아래 코드를 보시면, white
와 0xffffff
객체 중간에 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 함수의 사용은 코드를 간결하게 만들고 가독성을 높혀준다는 장점이 있습니다.
참고
Recommended Posts:
- Kotlin - Collections와 Sequences의 차이점
- Kotlin - Reified를 사용하는 이유?
- Kotlin - Sealed class 구현 방법 및 예제
- Kotlin - inline functions 이해하기
- Kotlin - Destructuring Declaration
- KotlinTest로 Unit Test 작성하는 방법
- Kotlin - Collections 소개 및 사용법 정리 (List, Map, Set)
- Kotlin - Data class 이해 및 구현 방법
- Kotlin에서 자주 사용하는 annotation 정리
- Kotlin - Generics 클래스, 함수를 정의하는 방법
- Kotlin - lateinit과 Delegates.notNull의 차이점
- Kotlin - Delegates로 프로퍼티를 Observerable로 만들기
- Kotlin - Null을 안전하게 처리하는 방법 (Null safety, 널 안정성)