
코틀린에는 코드를 사용하다 보면 Map을 사용한다던가 Pair를 사용한다거나
하나의 객체로 만들어주는 경우들이 종종 있습니다.
val chicken: Pair<String, String> = "Chicken" to "치킨"
그렇다면
저 'to'는 어떻게 "Chicken"과 "치킨"을 객체로 만들어 줄까요?
package kotlin
public infix fun <A, B> A.to(that: B): kotlin.Pair<A, B> { /* compiled code */ }
to의 내부 구현 코드를 본다면 제네릭으로 두 개의 객체를 받고,
A의 확장 함수로 만들어서 A와 B로 Pair 형태로 반환해 주는 코드가 내장되어 있습니다.
val food1 = mapOf(Pair("Chicken", "치킨"), Pair("Pizza", "피자"))
val food2 = mapOf("Chicken" to "치킨", "Pizza" to "피자")
위의 코드를 본다면 조금 더 이해가 될 두 있습니다.
food1과 food2를 to와 같은 구문을 이용하면 코드가 간결하고, 가독성이 향상된 것을 확인할 수 있습니다.
Infix이라는 단어가 조금 어색할 수 있습니다.
그전에 Prefix나 Postfix라는 단어를 보자면 prefix는 앞에 어떤 행위가 오고,
postfix는 뒤에 어떤 행위가 온다는 것입니다.
Infix는 두 개의 값 사이에 중간에 특정한 표현식을 넣는 것입니다.
코틀린에서는 이를 접목시켜서 특별한 함수식을 만들어낼 수 있습니다.
Infix 사용하기
infix 키워드는 함수 앞에 사용하여 선언할 수 있습니다.
infix fun dispatcher. 함수 이름(receiver): 리턴 타입 { 구현부 }로 선언할 수 있습니다.
여기서
dispatcher는 infix 함수 전에 오는 객체,
reciver는 infix 함수 다음에 오는 객체를 의미합니다.
infix fun String.add(str: String): String = this + str
이런식으로 함수를 구현한다면
val result: String "hello " add "world!!"
println("result = $result") // hello world!!
위와 같이 그냥 +를 사용하는 식으로 프로그래밍을 하는 것보다는 덜 직관적이지만,
사용하는 방법에 따라서 코드를 간결하면서 가독성 있도록 작성할 수 있습니다.
Class에 사용하기
Infix를 이용하여 클래스를 만들고 변수를 이용하여 사용할 수 있습니다.
class StringSum {
var str = ""
infix fun add(data: String) {
this.str = this.str + data
}
}
위와 같이 문자열을 계속 더하는 함수를 만들어주고
아래 처럼 값을 넣어주고 출력하면
val result = StringSum()
result add "kotlin "
result add "is "
result add "good"
println(result.str) // kotlin is good
앞에서 넣어줬던 문장들이 더해져서 나오는 것을 확인할 수 있습니다.
'Kotlin' 카테고리의 다른 글
::class.java는 무엇일까 (0) | 2023.02.07 |
---|---|
Kotlin에서 더블 콜론(::)은 무엇일까 (0) | 2023.02.07 |
[Kotlin] - map함수 (리스트 값 변경하기) (0) | 2023.02.02 |
[Kotlin] - filter사용하기 (0) | 2023.01.30 |
[Kotlin] lateinit, by lazy (0) | 2023.01.27 |