https://kotlinlang.org/docs/fun-interfaces.html
하나의 추상 메소드를 가지고 있는 인터페이스를 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를 이용하자.
반응형
'Kotlin' 카테고리의 다른 글
Kotlin - 확장(Extensions) (2) | 2024.01.31 |
---|---|
Kotlin - 액세스 한정자 (Visibility modifiers) - public, protected, internal, private (0) | 2024.01.25 |
Kotlin - 인터페이스 (Interface) (0) | 2024.01.24 |
Kotlin - 속성 (Properties) (0) | 2024.01.20 |
Kotlin - 상속 (Inheritance) (0) | 2024.01.18 |