ReentrantLock 사용해 락 걸기 코틀린에서는 기본적으로 자바의 ReentrantLock 클래스를 사용해 락을 걸고 해제할 수 있다. ReentrantLock을 사용해 락을 걸고 해제하는 방법은 간단하다. 임계영역(Critical Area)의 시작지점에서 ReentrantLock 객체의 lock 함수를 호출하고 임계영역의 종료 지점에서 ReentrantLock의 unlock 함수를 호출하면 된다. ReentrantLock 객체를 사용해 보기 위해 다음과 같은 SafeAdder 클래스를 만들어보자. 이 SafeAdder 클래스는 add 함수를 여러 스레드가 동시에 호출하더라도 손실되는 연산 없이 더하기 연산이 수행되도록 만든 클래스이다. *물론 add 함수에 @Synchronized를 붙이면 간단하..
코틀린 파일의 최상위에 선언된 함수가 컴파일 될 때 일어나는 일 코틀린에서는 .kt 파일을 만든 다음 최상위에 함수를 선언하는 것이 허용된다. 예를 들어 다음과 같이 main 패키지 안에 선언된 Main.kt파일 내부에 printHello 함수가 선언되어 있다고 해보자. 우리가 이를 바이트 코드로 컴파일 하면 다음과 같이 MainKt.class 파일이 생성되며, 이 MainKt 클래스 내부에는 printHello 함수가 정적 함수로 선언된다. 따라서 우리는 이 함수를 자바 파일에서 다음과 같이 사용할 수 있다. import main.MainKt; public class Test { public static void main(String[] args) { MainKt.printHello(); } } 위 코..
sealed class의 한계와 sealed interface의 등장 sealed class는 클래스를 상속하는 서브 클래스를 컴파일러에서 알 수 있도록 하기 위해 만들어졌다. 아래의 UIState와 같은 간단한 상속구조라면 sealed class로도 충분하다. sealed class UIState() data object Loading : UIState() data class Success(val data: UIData) : UIState() data class Error(val error: Exception) : UIState() 하지만, sealed class를 사용하면, 다른 클래스들이 둘 이상의 sealed class를 상속받지 못하게 되는 한계가 있다. 예를 들어 다음과 같은 코드를 만들어보자..
Java에서 안전한 타입 변환을 위해 선택했던 방법 서버와의 HTTP 통신을 통해 응답을 받아오기 위해 다음과 같은 Response 인터페이스를 상속하는 간단한 클래스 Success와 Fail을 만들었다고 해보자. sealed interface Response data class Success(val responseBody: String) : Response data class Fail(val errorMessage: String) : Response 기존 자바에서는 안전하게 타입을 변환하기 위해 타입을 변환하기 전에 instanceof 함수를 통해 타입을 체크한 후 다시 타입 변환을 해서 메서드를 호출해야 했다. public class ResponseMain { public static void mai..
Kotlin Multiplatform의 약자는 KMP 일까 KMM 일까? Kotlin Multiplatform을 공부하면서, 이상한 점을 하나 발견했다. 어떤 사이트에서는 약자를 KMM이라고 쓰고 어떤 사이트에서는 KMP이라고 쓰는 것을 발견했는데, 일반적으로 하나의 제품을 가리킬 때 두가지 약어로 가리키는 경우는 드물기 때문에 이상하다 생각했다. 그러던 중 인터넷을 찾아보다 다음과 같은 글을 발견했다. https://blog.jetbrains.com/kotlin/2023/07/update-on-the-name-of-kotlin-multiplatform/ Update on the Name of Kotlin Multiplatform | The Kotlin Blog From now on, “Kotlin Mu..