본문 바로가기
개발새발/코틀린

[코틀린/Kotlin] SAM - Java 표준 API

by 조희우 2025. 9. 12.

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 대신 람다를 넘기면 자동으로 변환