expect class와 expect fun
KMM이 나오면서 코틀린을 사용해 안드로이드, iOS 모두의 비즈니스 로직을 구현하기 위해 Kotlin에 class와 fun에 붙일 수 있는 expect modifier가 나오게 됐다.
expect modifier은 abstract modifier와 비슷하게 동작하지만, 의도가 다르다. abstract class는 자신을 상속하는 클래스가 추상체로 포함된 함수나 변수 등을 구현하도록 만들지만, expect class는 KMM에서의 공통 모듈에서 선언된 선언체가 Android, iOS 각각에서 구현되도록 강제하기 위해 만들어졌다.
expect class 사용해보기
예를 들어 다음과 같은 commonMain 모듈에 다음과 같이 VersionGetter 클래스를 expect class로 만들어보자.
그러면 이 VersionGetter 클래스는 오류를 낸다. 이유는 VersionGetter 클래스의 선언이 androidMain과 iosMain 모듈에서 구현되지 않았기 때문이다.
이 문제를 해결하기 위해서는 shared 모듈의 androidMain과 iosMain에 각각 actual class로 VersionGetter을 구현해야 한다.
그러면 오류가 없어지는 것을 볼 수 있다.
언제 expect class를 사용해야 하는가?
expect 클래스는 플랫폼 별로 다른 구현을 가져야 하는 로직이 있을 때 해당 로직에 대한 구현을 강제하기 위해 만들어졌다. 따라서 만약 Android와 iOS에서 버전을 체크해야 하는 것과 같이 구현이 달라져야 하는 부분이 있다면, 해당 부분을 expect class와 actual class로 구현해야 한다.
전체 코드
전체 코드는 다음과 같다.
- commonMain 모듈
expect class VersionGetter() {
fun getVersion(): String
}
- androidMain 모듈
actual class VersionGetter {
actual fun getVersion(): String {
return Build.VERSION.SDK_INT.toString()
}
}
- iosMain 모듈
actual class VersionGetter {
actual fun getVersion(): String {
return UIDevice.currentDevice.systemVersion
}
}