infix 와 inline

Panda·2022년 3월 18일
0

Kotlin

목록 보기
8/10

infix

infix 키워드는 함수를 가독성 있게 표현할 수 있는 키워드입니다.
객체와 객체 사이에 사용하는 함수표현이라고 보시면 됩니다.

infix fun String.add(other : String): String {
    return this + other
}

fun main() {
    val price = "3000"
    println(price add "원")
}

- 결과 -
3000

주로 확장함수에 적용되는거 같고
사용법도 쉽고 쉬운 내용인데
문제는 저한테는 그냥 함수쓰듯이 쓰는게 훨씬 가독성 좋아보여서 이런 표현방식은 안쓸것같네요 ㅋㅋㅋ

inline

infix가 생각외로 너무 간단해서 inline에 대해서 공부해봤습니다.

inline에 대해서 공부하려면 일급함수에 대해서 알고있어야 합니다.
일급함수에 대해 정~~말 간단하고 쉽게 설명하자면 함수를 매개변수로 하는 함수 라고 생각하시면 됩니다. (고차함수, 람다식, 익명함수 등)
코틀린은 이러한 일급함수 때문에 함수형 프로그래밍을 지원한다고 볼 수도 있죠
일급함수에 대해서 설명하면 길어지니까 바로 넘어갑시다 ㅋㅋㅋ

fun doSomething(body : () -> Unit) {
    body()
}

fun callFunction() {
    doSomething { println("문자열 출력!") }
}

이런 코틀린 코드가 존재한다면
자바로 변환이 되고

public void callFunction() {
    doSomething( new Function() {
        @Override
        public void invoke() {
            System.out.println("문자열 출력!");
        }
    });
}

이런식으로 Function 오브젝트 가 생성되게 됩니다.
그래서 이러한 현상을 막을 수 있는게 inline 입니다.

inline fun doSomething(body : () -> Unit) {
    body()
}

fun callFunction() {
    doSomething { println("문자열 출력!") }
}

그냥 단순히 inline 만 붙여주면

public void callFunction() {
    System.out.println("문자열 출력!");
}

저희가 원하는 방향으로 자바코드로 변환이 됩니다!!

inline을 잘활용한 함수가 있는데 그것은 말로 Scope Functions 입니다.
대표적으로 also를 활용한 예제를 한번 보겠습니다.

@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block(this)
    return this
}
fun main() {

    val prices = listOf(3000, 5000, 6000)
    prices.also {
        println("Total Price : ${it.sum()}")
    }
}

- 결과 -
Total Price : 14000

also 함수는 inline을 활용하는 것을 보실 수 있습니다.

미미한 성능 영향

그러면 무조건 inline을 써야지 자원적 효율이 좋겠네 라고 생각이 들었는데

사실은 inline으로 인한 예상 성능의 영향은 미미하다고 합니다 inline 함수 유형의 매개 변수가 있을 때 가장 유용하다고 합니다.
이유 : 이미 JVM에서 inline을 해주고 있음. ( JVM은 신인가?)

그럼 대체 언제 써야되?

처음에 일급함수에 대해서 알고있어야 된다는게 힌트였긴한데

바로 고차함수(Higher-Order functions)를 작성할 때 inline을 쓰는게 효과적이라고 합니다.

고차함수 작성하고 inline을 안쓰게 되면 변한된 java코드에서 익명 객체 를 생성하는 비용이 발생하는 것을 확인할 수가 있습니다.

따라서 inline을 적용시키면 첫번째 예제를 본것과 같이 저희가 원하는 방향으로 변환 되는것을 확인할 수 있습니다.

느낀 점

JVM에 대해서 좋은 점을 느끼니까
점점 개발자들 편의성을 좋게 해준다는 느낌이 들었습니다.

만약에 옛날이였으면 변환 과정 코드 까지 전부 생각하고
실제 컴퓨터 파이프라인 생각해서 코딩했어야됬는데

JVM이 전부 처리해주니까 너무 너무 좋은 것 같네요.

근데 이러한 사실도 공부를 해서 이러한 역할을 해준다는 것을 느낀거지
공부 안했으면 JVM의 대단한 기능들을 잘 몰랐을 것 같습니다.

그리고 코틀린은 다양한 키워드들이 많아서
정말 많이 공부해야 될 것 같습니다.

profile
실력있는 개발자가 되보자!

0개의 댓글

관련 채용 정보