본문 바로가기
프로그래밍/kotlin

[kotlin] 코틀린 차곡차곡 - 14. 중위 표기법 함수 (infix notation function)

by 사바라다 2021. 10. 23.

안녕하세요. 오늘은 코틀린에 대해서 알아보는 14번째 시간입니다. 오늘은 여러분과 infix function에 대해서 알아보는 시간을 가져보도록 하겠습니다.

infix function 이란

infix function은 어떤걸까요? 먼저 infix function에 대해서 알아보기 전에 infix 라는 단어가 어색하실 수 있을것 같습니다. 그렇다면 preifx, postifx는 좀 익숙하실까요? prefix는 앞에 어떤 행위가 온다는 것이고 postfix는 뒤에 어떤 행위가 온다는 것입니다.

간단한 예를 들어보면 표기법(expression)을 들 수 있을것 같습니다. 표기법은 연산자를 어디에 두냐에 따라 전위(prefix), 후위(postfix), 그리고 중위(infix)로 나뉘게 됩니다. 즉, infix라는 것은 두개의 값 사이에 중간에 특정한 표현식을 넣는다는 의미입니다.

코틀린에서는 이를 접목 시켜서 특별한 함수식을 만들어낼 수 있습니다. infix function이란 호출자인 점(.)과 파라미터 괄호()를 생략하고 함수명 만으로 호출할 수 있는 코틀린에서 제공해주는 표현식입니다.

아래 예제는 코틀린의 mockk라는 테스트 프레임워크에서 나오는 표현식입니다. 아래의 2개의 표현식은 완전동일합니다. 2번째 라인의 방식이 infix function을 이용한 방식입니다. 훨씬 가독성 측면에서 좋은것을 확인할 수 있습니다.

every { service.get() }.returns(5) // 일반 함수 호출 방법
every { service.get() } returns 5 // infix 함수 호출 방법

사용방법

이번에는 infix function을 만드는 방법에 대해서 알아보도록 하겠습니다. 먼저 커스텀하게 만들기 전에 코틀린에서는 기본적으로 사용할 수 있는 infix function을 살펴보도록 하겠습니다.

먼저 아래 코드를 보도록 하겠습니다. 아래 코드는 2개의 데이터를 하나로 묶어주는 Tuple인 Pair를 사용하여 map을 초기화하는 코드입니다. 아래의 코드처럼 Pair를 이용하여 값을 넣으면 앞의 인자를 key로 뒤의 인자를 value로 인식하여 사용할 수 있습니다.

val pairs = mapOf(
    Pair(1, "a"),
    Pair(2, "b"),
    Pair(3, "c"),
)

print("pair[1] = ${pairs[1]}") // "a"

Pair는 infix function을 지원하고 있습니다. 따라서 위의 예제를 infix function으로 표기가 가능합니다. 아래코드가 Pair의 infix function을 이용한 map의 초기화 입니다. 보도록 하겠습니다. 조금 더 깔끔해진 느낌입니다.

val pairs = mapOf(
    1 to "a",
    2 to "b",
    3 to "c"
)

print("pair[1] = ${pairs[1]}") // "a"

추가적으로 to가 어떻게 생겼는지 한번 보도록 하겠습니다. 아래 코드가 Pair의 to의 코드입니다. 확장(extention) 함수로 구현되어있는것을 알 수 있습니다. infix function을 만들기 위해서는 infix라는 syntax를 명시해줍니다. 이 코드를 통해서 우리는 to는 to를 기준으로 앞에는 호출자, 뒤에는 파라미터가 오는 것을 확인할 수 있습니다.

public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

그렇다면 이제 직접 infix function을 만들어보도록 하겠습니다. infix function을 만들기 위한 제약 조건은 아래와 같습니다.

  • 맴버 함수 또는 확장 함수
  • 단일 파라미터
  • 단일 파라미터로 여러개의 값을 받을 수 없고 기본값 설정 불가

이러한 제약조건에 맞춰서 2개의 값을 곱해주는 확장 함수를 만들어보겠습니다. infix function을 만들기 위해서는 function에 infix라는 키워드가 추가적으로 필요하게 됩니다. infix syntax를 추가하며 fucntion을 만들면 아래오 같은 더하는 함수를 만들 수 있습니다. 아래 함수는 Int 에 대해서 add 라는 확장 함수를 infix로 만든 것입니다.

private infix fun Int.add(value: Int): Int = this + value

이렇게 제작한 함수는 실제로 아래와 같이 사용할 수 있습니다. 사실 아래의 예제는 + 보다는 덜 직관적입니다만 사용방법에 따라서 좋은 결과를 도출할 수 있을 것으로 보여집니다. (ex. and, to, zip 등등)

val result: Int = 1 add 2

print("result = $result") // "result"

마무리

오늘은 이렇게 kotlin의 infix function에 대해서 알아보았습니다.

감사합니다.

참조

kotlinlang_infix-notation

댓글