[v.0.0] Kotlin Multiplatform의 expect/actual 정리

Kotlin Multiplatform의 expect/actual 정리

Kotlin Multiplatform(KMP)을 이해하기 위해 반드시 알아야 할 키워드가 바로 expectactual입니다. 이 키워드는 플랫폼마다 다른 구현을 제공하면서도, 공통 인터페이스를 유지하는 다형성 선언 방식을 가능하게 합니다.

이 글에서는 expect/actual 키워드의 개념부터 컴파일 타임 처리 방식, IDE에서 보이지 않는 이유까지 자세히 설명합니다.


기본 개념: expectactual이란?

키워드설명
expect공통 코드에 선언된 API 인터페이스 (stub)
actual각 플랫폼에서의 실제 구현

즉, expect는 **계약(Contract)**이고,
actual은 그 계약에 맞는 **실제 구현(Implementation)**입니다.


예시 코드

commonMain (공통 모듈)

// 선언만 있고 구현 없음
expect fun getPlatformName(): String

jvmMain

actual fun getPlatformName(): String = "JVM"

iosMain

actual fun getPlatformName(): String = "iOS"

expect는 인터페이스만 정의하고, 각 플랫폼에 맞는 actual 구현이 연결됩니다.


.jar에서는 expect가 안 보일까?

External Libraries에서는 expect를 찾을 수 없음

Gradle에서 다운받은 JAR 파일(kotlinx-coroutines-core-jvm-1.7.3.jar)은 JVM에서 실행 가능한 바이트코드만 포함합니다.

  • expect컴파일 타임에만 존재하는 추상 선언입니다
  • JVM에는 actual 구현만 컴파일되고 포함됨
  • 따라서 .jar 안에서는 expect 선언을 확인할 수 없습니다

대신 expect를 확인하려면:


사용 목적

상황이유
플랫폼별 파일 경로 필요Android: Context.filesDir, iOS: NSFileManager
UI, 시스템 API 분리JVM은 Swing, iOS는 UIKit 사용 등
네이티브 코드 연동actual에서 C/C++ 호출 가능

IDE 팁: expect/actual 관계 보기

  1. commonMainexpect 선언 추가
  2. jvmMain/iosMainactual 구현 작성
  3. IntelliJ나 Android Studio에서는 Cmd+B로 상호 이동 가능
    (단, 소스가 연결되어 있어야 함)

expect에 커서 올리면 구현된 actual 목록을 툴팁으로 확인할 수 있음


정리 요약

키워드목적컴파일 타임 존재런타임 존재
expect공통 선언✅ 있음❌ 없음
actual플랫폼 구현✅ 있음✅ 있음
  • .jar에는 actual만 존재 → expect는 보이지 않음
  • expect다형성의 선언부, actual구현부 역할
  • Kotlin Multiplatform에서 플랫폼 특화 코드를 안전하게 관리할 수 있게 해 줌

참고 링크

Built with Hugo
Theme Stack designed by Jimmy