본문 바로가기
Kotlin

Kotlin - Infix 함수

by 서퍼리노 2023. 2. 20.
728x90

코틀린에는 코드를 사용하다 보면 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

앞에서 넣어줬던 문장들이 더해져서 나오는 것을 확인할 수 있습니다.

 

https://kotlinlang.org/docs/functions.html

728x90

'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