반응형
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 |