IMCAT.DEV
로그인 가입
Kotlin 고급 프로젝트

Kotlin Kotlin Multiplatform 기초

Kotlin Kotlin Multiplatform 기초 — 고급

Kotlin Multiplatform 기초

1. 도입 (왜 배워야 하는가)

Kotlin Multiplatform(MPP)은 여러 플랫폼(iOS, Android, 웹 등)에서 공통의 코드를 공유할 수 있게 해주는 강력한 도구입니다. 실무에서 MPP를 활용하면 코드 재사용성을 높이고, 유지보수 비용을 줄이며, 팀의 생산성을 극대화할 수 있습니다. 예를 들어, 모바일 애플리케이션을 개발할 때 Android와 iOS에서 비즈니스 로직을 공유할 수 있어 두 플랫폼에서 각각의 로직을 중복 작성할 필요가 없어집니다.

반면, MPP를 모르면 각 플랫폼별로 동일한 로직을 반복해서 작성해야 하며, 이는 시간과 비용의 낭비로 이어집니다. 또한, 버그 수정이나 기능 추가 시 두 곳에서 모두 수정해야 하므로 관리가 복잡해지는 문제도 발생합니다.

2. 핵심 개념 설명

Kotlin Multiplatform의 핵심 개념에는 아래와 같은 것들이 있습니다.

개념설명
Shared Code여러 플랫폼에서 공유되는 코드.
Platform-Specific Code각 플랫폼에 특화된 코드.
Expect/Actual공통 코드와 플랫폼 특화 코드 간의 연결.

실생활 비유: MPP는 마치 한 집에서 여러 가족이 함께 사는 구조입니다. 가족들은 각각의 방에서 독립적으로 생활하지만, 거실이나 주방 같은 공통 공간을 공유합니다. 이처럼, MPP는 코드의 공통 부분을 공유하고, 각 플랫폼에 필요한 특화된 부분은 별도로 관리하는 방식입니다.

3. 기본 코드 예제

아래는 Kotlin Multiplatform을 이용해 공통 로직을 공유하는 간단한 예제입니다.

// commonMain/src/commonMain/kotlin/Greeting.kt
expect fun platformName(): String

fun greet(): String {
    return "Hello from ${platformName()}"
}

// androidMain/src/androidMain/kotlin/Greeting.kt
actual fun platformName(): String {
    return "Android"
}

// iosMain/src/iosMain/kotlin/Greeting.kt
actual fun platformName(): String {
    return "iOS"
}

실행 결과

  • Android: "Hello from Android"
  • iOS: "Hello from iOS"
  • 코드 한 줄씩 동작 설명

    1. expect fun platformName(): String: 공통 모듈에서 플랫폼별로 구현해야 할 함수를 정의합니다.
    2. fun greet(): String: 플랫폼 이름을 포함한 인사 메시지를 반환하는 함수입니다.
    3. actual fun platformName(): String: Android 플랫폼에서의 구현을 제공합니다.
    4. actual fun platformName(): String: iOS 플랫폼에서의 구현을 제공합니다.
    5. 4. 실전 활용 예제

      쇼핑몰에서 장바구니를 구현할 때

      장바구니 기능은 여러 플랫폼에서 사용되므로 공통 로직을 MPP로 구현할 수 있습니다.

      // commonMain/src/commonMain/kotlin/Cart.kt
      data class CartItem(val id: String, val quantity: Int)
      
      class Cart {
          private val items = mutableListOf<CartItem>()
      
          fun addItem(item: CartItem) {
              items.add(item)
          }
      
          fun totalItems(): Int {
              return items.sumOf { it.quantity }
          }
      }

      사용자 인증 처리

      사용자가 로그인할 때 필요한 로직을 MPP로 관리하여 Android와 iOS에서 공유할 수 있습니다.

      // commonMain/src/commonMain/kotlin/Auth.kt
      expect fun login(username: String, password: String): Boolean
      
      // androidMain/src/androidMain/kotlin/Auth.kt
      actual fun login(username: String, password: String): Boolean {
          // Android의 로그인 로직
      }
      
      // iosMain/src/iosMain/kotlin/Auth.kt
      actual fun login(username: String, password: String): Boolean {
          // iOS의 로그인 로직
      }

      5. 흔한 실수와 주의사항

      실수 1: Expect/Actual을 혼동하기

    6. 잘못된 코드:
    7.     // 잘못된 예: actual로 구현된 코드가 공통 모듈에 있음
          fun platformName(): String {
              return "Common"
          }
    8. 올바른 코드:
    9.     expect fun platformName(): String  // 공통 모듈에서 정의

      실수 2: 플랫폼-specific 코드에서 공통 코드 접근

    10. 잘못된 코드:
    11.     actual fun platformName(): String {
              return greet()  // 공통 코드에서 사용
          }
    12. 올바른 코드:
    13.     actual fun platformName(): String {
              return "Platform Code"  // 직접적인 구현
          }

      6. 정리

    14. Kotlin Multiplatform을 사용하면 코드 재사용성이 높아진다.
    15. Expect/Actual 키워드를 활용하여 플랫폼별 구현을 관리할 수 있다.
    16. 공통 로직과 플랫폼 특화 로직을 명확하게 나누는 것이 중요하다.

다음 학습 주제: Kotlin Multiplatform을 활용한 모듈화 및 테스트 전략, KMP와 Gradle 설정 방법.