프로그래밍 언어/Kotlin

kotlin interface 익명 내부함수 lambda로 대체

65살까지 코딩 2023. 12. 4. 22:36
728x90
반응형

Kotlin fun interface와 interface 차이 

먼저 fun interfcace를 사용하게된 계기...

interface LogCallStrategy<T> {

    fun call() : T
}

다음과 같은 인터페이스가 있고 

class LogHelperStrategy<T>(
    private val logService: LogServiceDirtyCode,
    private val logCallStrategy: LogCallStrategy<T>,
) {


    fun execute(message: String): T {
        var trace: Trace? = null
        return runCatching {
            trace = logService.begin(message)
            logCallStrategy.call()
        }.onSuccess {
            logService.finish(trace!!)
        }.onFailure {
            logService.execption(trace!!)
            throw it
        }.getOrThrow()
    }
}

위 인터페이스를 주입 받아서 사용하는 객체가 있다 (전략패턴) 

 

나는 위 LogHelper를 사용할떄 다음과 같이 사용하고 싶었다.

@GetMapping
fun getItems(): List<Item> {
    return LogHelperStrategy(logService) {
        itemService.getItems()
    }.execute("ItemControllerStrategy/getItems")
}

interface에 override를 할 fun이 하나이기 떄문에 Java에서 그래왔듯이  당연히 될거라고 착각했다. 

fun getItems(): List<Item> {
    return LogHelperStrategy(logService, object :LogCallStrategy<List<Item>>{
        override fun call(): List<Item> {
            return itemService.getItems()
        }
    }).execute("ItemControllerStrategy/getItems")
}

이렇게는 아주 잘되는데 왜 람다를 사용하면 받질 못하니...

Required:
LogCallStrategy<TypeVariable(T)>
Found:
() → List<Item> 계속 이런 error가 떳다.. 

찾아본 결과 kotiln에서 익명 내부함수를 람다로 사용하기 위해선 fun interface를 사용해야한다고 한다. 

fun interface LogCallStrategy<T> {

    fun call() : T
}

다음과 같이 수정하니 lambda로 잘 받아진다.

 

interface인데 함수가 하나이고 용도가 하나의 함수를 호출하는 용도이며 확장가능성이 없을때  funtional interface를 사용하자 

 

 

728x90
반응형