#BASIC

[Kotlin] Functional (SAM) Interface

피치트리 2022. 2. 7. 22:40

[목표]

SAM Interface 이해

 

[참고]

공식문서

 

Functional (SAM) interfaces | Kotlin

 

kotlinlang.org

 

What is SAM?

SAM은 Single Abstraction Method의 약자로 하나의 추상 메소드를 가지는 것을 의미합니다. Kotlin에서는 이런 SAM interface를 functional interface라고 부릅니다. Functional Interface는 여러 non-abstract member(0..N개)를 가질 수 있지만, 오직 하나의 abstract member만 가질 수 있습니다.

 

일반적으로 인터페이스를 선언하고, 인터페이스를 구현하는 클래스를 상속하여 사용하는 것과 달리 Functional Interface는 람다 표현식을 통해 아래와 같이 간단하게 구현될 수 있습니다.

 

package main.etc

fun main() {
    val isEven = IntPredicate {
        it % 2 == 0 // accept method 구현체
    }
    
    isEven.accept(10)
}

fun interface IntPredicate {
    fun accept(i: Int): Boolean // 무조건 1개의 abstract method가 있어야 함
    
    fun print() { // 있어도 되고 없어도 됨
        println("non abstract method")
    }
}

Functional Interface로 구현 시, IntelliJ에서 위와 같이 functional interface(2번째 요소)가 추가되어 보여지는 것을 확인할 수 있습니다. 클래스나 object expression을 이용해서 구현하는 방법은 아래와 같습니다.

 

클래스로 구현

class IntPredicateClass : IntPredicate {
    override fun accept(i: Int): Boolean = (i % 2 == 0)
}

val isEven = IntPredicateClass()

object expression 활용

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