or infix 함수

신연우·2023년 11월 11일
0

WIL

목록 보기
5/13

배경

회사에서 업무할 때 다루는 코틀린을 좀 더 잘 써보기 위해 배우던 도중 or infix function의 존재를 알게 되었습니다. 그런데 이걸 실제로 사용하는 케이스를 회사 코드 내에서 찾아보지 못해서 왜 안 쓰는지 궁금해서 좀 더 자세히 살펴봤습니다.

왜 안쓸까?

코틀린을 or 라는 이름의 infix 함수를 제공하고 있습니다. || 연산자와 동일하게 A 조건식과 B 조건식 중 하나의 결과값이라도 참이라면 참을 반환해줍니다.

infix 함수이기 때문에 A or B와 같은 형태로 코드를 작성할 수 있습니다. 개인적으로 코드의 가독성이 좋아진다고 생각했습니다.

다만, or infix 함수의 특성 상 || 연산자에 비해 실행 속도가 느려질 수 있는 문제가 존재합니다.

fun main() {
    val elapsed = measureTimeMillis {
        val alwaysTrue = true
        if (alwaysTrue or getFalseAfter5Sec()) {
            println("Test result is true")
        } else {
            println("Test result is false")
        }
    }
    println(elapsed)
}

fun getFalseAfter5Sec(): Boolean {
    // NOTE: 5초간 sleep
    runBlocking {
        launch {
            delay(5000L)
        }
    }

    return false
}

위 코드를 실행해보면 실제로 5초 이후에 "Test result is true" 라는 문자열이 콘솔에 출력됩니다. 왜나하면 or infix 함수의 경우 두 조건식을 모두 평가하기 때문입니다.

만약 || 연산자였다면 short-circuit 평가로 인해 거의 즉시 "Test result is true"라는 문자열이 콘솔에 출력되었을 것입니다.

결론

  • or infix 함수에서 어째서 short-circuit 평가를 지원하지 않는지 이해하지 못했습니다. 성능적인 부분에서 살펴보면 지원하는 것이 당연히 좋을텐데 말이죠...
  • 사실 개발을 조금만 하면 || 연산자를 보고 or 를 떠올리는 것이 어렵지 않은 부분도 있어서 가독성을 챙기기 위해 or infix 함수를 사용하지는 않을 것 같습니다.

참고한 글

profile
남들과 함께하기 위해서는 혼자 나아갈 수 있는 힘이 있어야 한다.

0개의 댓글