코틀린

코틀린 SAM 변환이 왜 되지 않을까?

태인킴 2020. 11. 25. 18:18
반응형

코틀린 SAM 변환이 왜 되지 않을까?


fun main() {
    setInterface(object : SamInterface {
        override fun callback() {
            println("callback!!")
        }
    })
}

fun setInterface(interface1 : SamInterface) {

}

interface SamInterface {
    fun callback()
}

위와 같은 코드가 있을때, setInterface() 함수는 SamInterface() 라는 인터페이스를 파라미터를 갖고 있습니다. 이럴 경우 main() 함수 쪽에서 '익명 객체'를 사용하여, 위와 같이 구현하여 사용 할수 있습니다.

 

위에서 'object : SamInterface' 와 'override fun callback()' 과 같이 보일러 플레이트 코드를 없앨수 있는 문법이 코틀린의 SAM(Single Abstract Method) 입니다. 하지만, SAM 변환은 주의할 점이 있습니다. SAM 변환은 java 인터페이스인 경우에만 동작 합니다. 

 

 

// 코틀린 소스
fun main() {
    setInterface(SamJavaInterface { println("callback!!") })
}

fun setInterface(interface1 : SamJavaInterface) {

}

// java 소스
public interface SamJavaInterface {
    void callback();
}

위와 같이, 인터페이스만 java 소스 라면, main() 함수의 setInterface() 에서 SamJavaInterface 인터페이스명 까지 입력하고, 나머지 부분을 {}(중괄호) 만을 사용해서 줄였습니다. 만약에, setInterface() 함수까지 java 소스라면 더 줄일수 있습니다. 

 

 

// 코틀린 소스
fun main() {
    val interfaceSetter = InterfaceSetter()
    interfaceSetter.setInterface { println("callback!!") }
}

// java 소스
public class InterfaceSetter {

    public void setInterface(SamJavaInterface samJavaInterface) {
    }
}

// java 소스
public interface SamJavaInterface {
    void callback();
}

위에 소스에서 setInterface() 함수에서 SamJavaInterface 인터페이스명 입력되는 부분까지 사라진 것을 볼수 있습니다. 이러한 SAM(Single Abstract Method)은 이름과 같이, interface에 메소드가 하나 만 있어야 합니다.

 

 

fun main() {
    setInterface{ str  ->
        println(str)
    }
}

fun setInterface(lamda : (String) -> Unit) {

}

코틀린에서는 위와 같은 SAM 변환을 지원하지 않는 이유는, 코틀린에서는 함수를 파라미터로 사용할수 있기 때문 입니다.

반응형

'코틀린' 카테고리의 다른 글

코틀린 apply, with, let, also, run  (0) 2020.12.08
Kotlin 코루틴(Coroutine)  (0) 2020.12.07
코틀린 6편 (lateinit)  (0) 2020.11.13
코틀린 5편 (data class, object, companion object)  (0) 2020.11.11
코틀린 4편 (람다 Lamda)  (0) 2020.11.11