SAM(Single Abstract Method) 인터페이스란?
SAM 인터페이스는 이름 그대로, 하나의 추상 메서드만을 가진 인터페이스이다. 예를 들어 다음과 같이 SAMSample 인터페이스를 만들고 내부에 foo 함수 하나만을 넣는다면, 이것은 SAM 인터페이스가 된다.
fun interface SAMSample {
fun foo()
}
*Kotlin 1.4 이후부터는 SAM 인터페이스를 사용하기 위해서는 fun interface 키워드를 사용해야 한다.
*Kotlin 1.4부터는 Java의 SAM 인터페이스에 대해 자동으로 SAM 변환을 지원한다.
SAM 인터페이스가 중요한 이유는 이러한 SAM 인터페이스는 Kotlin의 함수형 프로그래밍을 깔끔하게 만들어주는 역할을 하기 때문이다. 기본적으로 인터페이스에 대한 익명 객체를 만들기 위해서는 object 키워드를 통해 객체를 생성하고, 해당 객체를 구현하는 방식을 취해야 한다. 예를 들어 SAMSample 인터페이스에 대한 익명 객체는 다음과 같이 만들 수 있다.
object : SAMSample {
override fun foo() {
TODO("Not yet implemented")
}
}
하지만, SAM의 특성을 사용하면 매우 깔끔하게 구현이 가능해진다. 위의 코드는 다음과 같이 대체가 가능하다.
SAMSample {
TODO("Not yet implemented")
}
SAM은 코드를 깔끔하게 만드는 특성 때문에 다양한 곳에서 사용된다. 지금부터 그 사용 예제를 알아보도록하자.
SAM의 사용 예제
SAM을 사용하는 대표적인 예제는 바로 안드로이드의 OnClickListener 인터페이스 이다. OnClickListener인터페이스는 자바로 구현되어 있다.
public interface OnClickListener {
void onClick(View var1);
}
OnClickListener을 버튼에 설정하기 위해서는 기본적으로 다음과 같이 만들어져야 한다.
button.setOnClickListener(object: OnClickListener {
override fun onClick(p0: View?) {
TODO("Not yet implemented")
}
})
하지만, OnClickListener은 SAM 인터페이스이기 때문에 다음과 같이 깔끔하게 작성될 수 있다.
button.setOnClickListener {
TODO("Not yet implemented")
}
* Kotlin 1.4부터는 Java의 SAM 인터페이스에 대해 자동으로 SAM 변환을 지원한다.
이렇게 SAM을 활용하면 코드를 더욱 깔끔하게 만들 수 있다.
정리
- SAM(Single Abstract Method)는 하나의 추상 메서드만을 가진 인터페이스이다.
- Kotlin 1.4 이후부터는 SAM 인터페이스를 사용하기 위해서는 fun interface 키워드를 사용해야 한다.
- Kotlin 1.4부터는 Java의 SAM 인터페이스에 대해 자동으로 SAM 변환을 지원한다.