Kotlin Multiplatform의 특징
- Kotlin을 공통 언어로 사용
- android / iOS에서 KMP를 통해 작성한 부분은 framework 형태로 동작함
- 비즈니스 로직부터 UI까지 공통 개발 가능
- 현재 iOS 및 UI 공통 개발 기능은 Beta
Kotlin 컴파일러의 경우, 소스 코드를 입력으로 가져오고 플랫폼별 바이너리 세트를 생성함. 동일한 코드에서 여러 바이너리를 실행하게 됨.
ex) 동일한 코틀린 파일에서 JVM 파일과 기본 실행 파일 생성
java 코드가 어떻게 Native 코드로 동작할 수 있지? 하고 내부 구조를 찾아봤는데 Kotlin -> ObjC로 변환되는 구조인가봄 Swift로도 변환은 가능하지만 ObjC보다 제한적으로 가능함
자세한 건 이쪽 참고
https://kotlinlang.org/docs/native-objc-interop.html#usage
Interoperability with Swift/Objective-C | Kotlin
kotlinlang.org
iOS 빌드 시에는 각 OSMain이 빌드되어 AppleMain으로 합쳐져서 빌드됨.
코틀린 멀티 플랫폼 프로젝트 내에 구조를 살펴 보면(로직&UI / 로직 only냐에 따라서 다르겠지만 크게 보면) iosMain / androidMain / commonMain으로 나뉘는데 그 외에 iosArm64Main이라든가 appleMain을 찾아볼 수 있음 그 안에는 아무것도 뭔가 정의되어 있거나 하는 게 없음 모두 빌드될 때 합쳐지는 거임
프로젝트 구조
공통 UI와 로직을 사용하는 경우
- commonMain
- 플랫폼간 공유되는 Kotlin 코드
- 해당 코드에서는 플랫폼별 함수나 클래스를 사용하지 못함 ⇒ 다른 플랫폼으로 컴파일될 수 없기 때문에!
- androidMain
- 전체 UI 모듈로, commonMain이 framework 형식으로 함께 빌드되어 android app을 만든다.
- iosMain
- androidMain의 UI를 iOS 컴파일러에서 컴파일 가능한 형태로 선언한다.
공통 로직을 사용하지만, UI는 native에서 구현하는 경우
- shared
- commonMain
- 특정 플랫폼 구현에 대한 의존성 없이 순수 Kotlin만으로 구현되는 비즈니스 로직들이 위치하는 곳
- 모든 공통 모듈의 기반
- androidMain
- 공통 모듈에서 Android 플랫폼에 종속적인 로직들이 위치하는 곳
- Kotlin으로 Android Framework(Preference, LocationManager, …)에 접근하여 비즈니스 로직을 구현할 수 있음
- iosMain
- 공통 모듈에서 iOS 플랫폼에 종속적인 로직들이 위치하는 곳
- Kotlin으로 iOS Framework에 접근하여 비즈니스 로직을 구현할 수 있음
- commonMain
- androidMain
- Android 애플리케이션 모듈로
- shared 모듈과 함께 빌드되어 Android App을 만든다.
- iosMain
- iOS 애플리케이션 모듈로
- shared 모듈이 framework 형태로 빌드되어 iOS App을 만들 수 있다.
기존 iOS 프로젝트와의 차이점
KMP 내의 iOS 프로젝트의 경우, commonMain 코드가 프레임워크 형태로 빌드되어 iOS 프로젝트 내에서 해당 프레임워크를 참조하는 형태로 실행된다. commonMain 내에 있는 Kotlin 코드는 Objective-C로 변환되어 런타임 시 동작함.
각 OS에 따라 iosX64Main(iosArm64), iosSimulatorMain(iosSimulatorArm64)으로 빌드되어 이후에는 AppleMain으로 합쳐져 빌드됨
전체적으로는 비슷하지만 공통 UI 사용 유무에 따라서 세부 사항이 조금씩 달라지는데 관련하여 서술해 보자면,
Native UI Multiplatform
- Shared 폴더 내 iosMain 안에는 해당 Kotlin 로직 모델을 Framework 형태로 가져와서 사용
- iosMain 안에는 공통 로직을 iOS 요소로 선언하는 과정을 거침 (필요하다면)
- 빌드 시 Xcode에서 단일 실행 가능
Shared UI Multiplatform
- commonMain 폴더 내 Kotlin UI / 로직 모델을 Framework 형태로 가져와서 사용함.
- iosMain 안에는 공통 모듈을 iOS UI 요소로 선언하는 과정을 거침
- 빌드 시 Xcode에서 단일 실행 불가능 (Android Studio를 통해 실행 / Fleet을 통해 실행)
아무래도 Kotlind을 주요 언어로 사용하는 플랫폼이다 보니 iOS가 내부에서 어떻게 동작하는지? 자료를 찾기가 어려웠다 ㄱ- 그래도 zetbrain 홈페이지에서 상세히 설명되어 있어서 관련 글은 거의 다 읽어본 것 같음.
꽤 재미있는 플랫폼이고 모바일뿐만 아니라 웹, 서버도 해당 언어로 개발 가능하다고 하니 신기했다. 어쨌든 코틀린이 java 기반이라 그런가?!
나중에 코틀린도 공부해 봐야겠다. :3 아무래도 안드로이드가 iOS보다 훨 친절한듯
'Study' 카테고리의 다른 글
[2조 스터디] 타입 캐스팅(is/as 연산자) (0) | 2023.12.12 |
---|---|
[2조 스터디] String (0) | 2023.12.12 |
[2조 스터디] Closure (0) | 2023.12.12 |
[2조 스터디] 클래스와 구조체 (0) | 2023.11.27 |
[2조 스터디] 함수와 옵셔널 타입, 딕셔너리 (0) | 2023.11.27 |