SAM; Single Abstract Method
- 단 하나의 추상 메서드만 가진 인터페이스 또는 추상 클래스
- Java에서는 주로 함수형 인터페이스(Fuctional Interface)라고 호칭
- Kotlin에서도 Java 함수형 인터페이스와 함께 사용할 때 SAM 변환을 지원
함수형 인터페이스 (java.util.function 패키지)
Java 8부터 추가된 함수형 인터페이스
Kotlin에서 람다로 사용 가능
Function<T, R>
- 입력값: T
- 반환값: R
val f: (Int) -> String = Function<Int, String> { i -> "값: $i" }
println(f(10)) // 값: 10
Consumer<T>
- 입력값: T
- 반환값: 없음
val printer: Consumer<String> = Consumer { println(it) }
printer.accept("Hello")
Supplier<T>
- 입력값: 없음
- 반환값: T
val supplier: Supplier<Double> = Supplier { Math.random() }
println(supplier.get())
Predicate<T>
- 입력값: T
- 반환값: Boolean
val isEven: Predicate<Int> = Predicate { it % 2 == 0 }
println(isEven.test(4)) // true
BiFunction<T, U, R>
- 입력값: T, U
- 반환값: R
val sum: BiFunction<Int, Int, Int> = BiFunction { a, b -> a + b }
println(sum.apply(3, 5)) // 8
BiConsumer<T, U>
- 입력값: T, U
- 반환값: 없음
val printer: BiConsumer<String, Int> = BiConsumer { name, age ->
println("$name is $age years old")
}
printer.accept("Alice", 23)
스레드 / 비동기 처리 관련
Runnable
- 입력값: 없음
- 반환값: 없음
→ void run() 메서드
val task = Runnable { println("스레드 실행!") }
Thread(task).start()
Callable<V>
- 입력값: 없음
- 반환값: V
→ V call() 메서드
val task = Callable { "결과값" }
println(task.call())
이벤트 리스너
- GUI 계열은 SAM 변환이 잘 되는 인터페이스만 람다로 사용 가능
- e.x.) ActionListener
ActionListener
- 버튼 클릭 이벤트 등
val listener = ActionListener { e -> println("클릭됨: $e") }
ItemListener
KeyListener, MouseListener (일부는 SAM 아님, 메서드가 여러 개)
- 메서드가 두 개 이상이면 SAM 조건 불충분
Kotlin에서 SAM
Kotlin은 SAM 변환을 지원하며 람다로 사용
fun execute(task: Runnable) {
task.run()
}
execute { println("람다로 SAM 변환됨!") }
- Runnable 대신 람다를 넘기면 자동으로 변환
'개발새발 > 코틀린' 카테고리의 다른 글
[코틀린/Kotlin] SAM; Single Abstract Method (0) | 2025.09.10 |
---|---|
[코틀린/Kotlin] enum / enum class (0) | 2025.09.08 |
[코틀린/Kotlin] qualifiedName (0) | 2025.09.06 |
[코틀린/Kotlin] 로컬 클래스(Local Class) (1) | 2025.09.05 |
[코틀린/Kotlin] 익명 클래스(Anonymous Class) (0) | 2025.09.04 |