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 클래스를 e..
Kotlin
안드로이드 스튜디오에서 KMM(Kotlin Multiplatform Mobile) 앱을 개발하기 위해서는 KMM 개발용 플러그인을 설치해야 한다. 이번 글에서는 KMM 용 플러그인을 설치하는 방법과, 해당 플러그인을 사용해 프로젝트를 만드는 방법까지를 학습해볼 것이다. KMP 플러그인 설치하기 1. 안드로이드 스튜디오를 켜면 다음과 같은 화면이 나온다. 2. 이 화면에서 왼쪽에 Plugin을 누르고, Kotlin Multiplatform을 검색하면, Kotlin Multiplatform Mobile 플러그인이 나온다. 이걸 Install을 누른다. 3. 설치가 완료되면, 안드로이드 스튜디오를 재시작하라는 팝업이 나오고, 재시작(Restart) 버튼을 누르면, 플러그인의 설치가 완료된다. 여기까지 KMM ..
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의 함수형 프로그래밍을 깔끔하게 만들어주는 역할을 하기 때문이다. 기본적으로 인..
코루틴이 멀티 스레드 환경에서 실행될 때 테스트가 어려운 이유 코루틴은 일반적으로 멀티 스레드 환경에서 비동기적으로 실행된다. 이 때문에 멀티 스레드 환경의 문제가 그대로 테스트에 나타난다. 그 대표적인 문제는 다음과 같다. 1. 함수 호출 순서 문제 2. 경쟁 상태 문제 3. 코루틴이 사용하는 디스패처 문제 함수 호출 순서 문제 멀티 스레드 환경에서 실행되는 함수들은 함수의 호출 순서를 파악하기 어렵다. 코루틴을 테스트 할 때도 이 문제가 나타나며, 병렬성으로 인해 실행을 코루틴이 실행되기 전에 다른 코루틴이 실행될 수 있다. 또한, 코루틴은 함께 실행되기 때문에 어떤 코드가 먼저 실행될지 파악하기 매우 어렵다. 예를 들어 하나의 코루틴이 일시 중단하게 되면 스레드를 다른 스레드가 사용할 수 있도록 양..
every를 사용해 응답값을 설정할 때의 문제점 이전 글에서 다루었던 UserProfileFetcher이 리모트 저장소로부터 데이터를 가져오는 I/O 작업을 한다고 가정하고, 함수를 모두 다음과 같이 일시 중단 함수로 바꿔보자. class UserProfileFetcher( private val userRepository: UserRepository, ) { suspend fun getUserProfileById(id: String): UserProfile { return UserProfile( id = id, name = userRepository.getNameByUserId(id) ) } } interface UserRepository { suspend fun saveUserName(id: Strin..