본문 바로가기

Kotlin

Kotlin - Functional (SAM) interfaces

https://kotlinlang.org/docs/fun-interfaces.html

 

Functional (SAM) interfaces | Kotlin

 

kotlinlang.org

 

하나의 추상 메소드를 가지고 있는 인터페이스를 functional interface 또는 Single Abstract Method(SAM) 인터페이스 라고 한다. functional interface는 여러 비추상 멤버를 가질 수 있지만 메소드는 오직 추상 메소드 1개만 갖는 속성이 있다.

functional interface는 fun 수정자를 이용하여 아래와 같이 선언한다.

fun interface KRunnable {
    fun invoke()
}

 

SAM conversions

SAM 전환을 통해 람다 표현식을 작성면 코드를 간결하고 가독성 높게 작성 할 수 있다.

fun interface IntPredicate {
    fun accept(i: Int): Boolean
}

val isEven = object : IntPredicate {
    override fun accept(i: Int): Boolean {
        return i % 2 == 0
    }
}

// 위와 같이 구현해야하는 코드를 SAM 전환을 통해 아래처럼 간결하게 작성 할 수 있다.

var isEven2 = IntPredicate { it % 2 == 0 }

fun main() {
    println(isEven.accept(2))
    println(isEven2.accept(2))
}

 

Functional interfaces va. type aliases

function 타입을 위한 type alias를 이용해 function interface 와 비슷한 코드를 작성 할 수 있다.

typealias IntPredicate2 = (i: Int) -> Boolean

var isEven3: IntPredicate2 = { it % 2 == 0 }

fun main() {
    println(isEven3(2))
}

하지만, functional interface가 어떤 타입을 정의하는데 비해, type alias 는 기존에 존재하는 타입의 별칭을 추가하는 정도의 역할이다. 따라서 function interface 는 기능을 확장하거나, 1개 이상의 멤버를 가질 수 있고, 다른 인터페이스를 상속받거나 상속할 수 도 있는 등 type alias 로는 처리하기 불가능한 기능들이 가능하다.

functional interface가 type alias에 비해 작성하는데 더 신경 써야하고 런타임 시 더 비용이 크지만, 더 유연하며 다양한 기능을 제공한다. 따라서 상황에 맞게 typealias 와 functional interface 를 구분해서 사용하는 것이 좋겠다.

  • 명확한 파라미터와 반환타입을 가지는 함수에는 함수타입을 간단히 하고 축약형 이름을 사용하기 위해 functional type 이나 type alias를 사용하자.
  • 단순 함수보다 좀더 복잡한 기능 - functional type으로는 표현하기 어려운 중요한 작업들- 은 분리된 functional interface를 이용하자.

 

반응형