본문 바로가기
Kotlin

[깡샘의 코틀린 프로그래밍] 정리 19 - SAM

by 들풀민들레 2018. 3. 2.

본 글은 [깡샘의 코틀린 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

19장. 코틀린의 다양한 기법

 

19.2.2. 코틀린에서 SAM 활용

 

코틀린 프로그래밍을 하다 보면 많은 자바 API를 활용하게 됩니다. 자바 서버 측 응용프로그램을 코틀린으로 개발하거나 안드로이드 앱을 코틀린으로 개발하다 보면 자바의 많은A PI를 사용해야 합니다.

 

코틀린에서 사용하는 API 중 자바 인터페이스가 있고 그 인터페이스를 등록하는 자바 setter 함수를 활용하는 방법을 설명하려고 합니다. 위에서 자바로 설명한 JavaInterface1 이름의 인터페이스와SAMTest 클래스에서 제공하는 setInterface ( ) 함수를 활용하는 코틀린 코드를 작성해 보겠습니다

 

01 package ten_one

02

03 import test.JavaInterface1

04 import test.SAMTest

05

06 fun main(args: Array<String>) {

07   val obj=SAMTest()

08   obj.setInterface(object : JavaInterface1{

09     override fun callback() {

10       println("hello kotlin")

11     }

12   })

13   obj.callback.callback()

14 }

 

【 실행결과 】

hello kotlin

 

08번 줄에서 SAMTest 클래스의 setInterface ( ) 함수를 호출하면서 JavaInterface1을 구현한 익명 클래스를 만들어 등록했습니다. 별문제 없는 정상적인 코드지만, 위의 코드를 SAM을 이용한 람다 식으로 조금 더 쉽게 만들 수 있습니다.

 

01 package nineteen_two_two

02

03 import test.SAMTest

04

05 fun main(args: Array<String>) {

06   val obj=SAMTest()

07

08   obj.setInterface { println("hello sam") }

09   obj.callback.callback()

10 }

 

【 실행결과 】

hello sam

 

08번 부분이 람다 식으로 SAM 전환을 이용한 부분입니다. 코드가 너무 간결하게 나왔습니다. 인터페이스의 추상 함수 내부 코드 구현만 람다 식으로 표현해 주면 됩니다. 이것이S AM 전환의 이점입니다.

 

람다 함수만 넘겼는데 어떻게 자바의 인터페이스를 구현한 객체가 될까요? 그건 컴파일러가 알아서 해주기 때문에 가능한 일입니다. setInterface ( ) 함수는 Interface1을 구현한 객체를 매개변수로 받는다고 명시적으로 선언된 함수입니다. 따라서 개발자 소스에서 람다만 전달하더라도 알아서 매개변수에 선언된 인터페이스를 구현한 익명 클래스를 컴파일러는 자동으로 만들어 줍니다.

 

그리고 그 인터페이스에 추상 함수가 하나만 있으므로 그 함수를 오버라이드받고 개발자가 지정한 람다함수 내부 내용을 오버라이드받은 함수 내부에 추가해 주게 됩니다. 이 모든 작업이 컴파일러에 의해 자동으로 이뤄지므로 개발자는 람다 함수만 정의하면 되는 것입니다.

 

 

결국, 개발자가 직접 object를 이용하여 익명 클래스의 객체를 생성했으므로 함수에 대입한 것과 같은 결과가 나옵니다.