728x90
반응형

개발/코틀린 20

Kotlin object와 Gson의 오해

안녕하세요. 안드로이드 개발자 정석준입니다. 오늘 소개할 내용은 Kotlin에서 Gson을 사용할 때 object로 json을 파싱하는 경우 발생하는 버그에 대해 이야기해보려고 합니다. 예제코드 import com.google.gson.Gson fun main() { val gson = Gson() val json = "{}" val house: House = gson.fromJson(json, House.Room::class.java) val name = when (house) { House.Living -> "Living" House.Room -> "Room" } println(name) } sealed class House { object Room : House() object Living: Hou..

개발/코틀린 2023.08.03

(Coroutine) asStateFlow()를 써야할까요?

안드로이드 개발을 하면서 대부분 MVVM 패턴을 많이 사용하고 그 안에서 Observable한 형태를 사용하기 위해 LiveData, Rx, Flow등 여러가지를 사용합니다. 그 안에서 ViewModel 내부에서는 Mutable한 형태를 유지하고 외부에서는 Immutable한 형태를 유지하기 위해서 아래와 같은 형태를 많이 사용합니다. import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow sealed interface LoadingUiState { object Loading : LoadingUiState object Load..

개발/코틀린 2023.07.28

(Test) Junit에서 isEqualTo 와 isSameAs

Kotlin에서 JUnit을 사용할 때 isEqualTo와 isSameAs 메서드의 차이점은 Java에서와 동일합니다. isEqualTo 메서드는 두 개의 객체가 내용(content) 면에서 동일한지 확인하는 데 사용됩니다. 객체의 값(value)을 비교하기 위해 equals 메서드를 사용합니다. 예를 들어, obj1과 obj2라는 두 개의 객체가 있다면, assertThat(obj1).isEqualTo(obj2)를 사용하여 obj1이 obj2와 동일하다고 단언할 수 있습니다. isSameAs 메서드는 반면에 두 개의 객체가 메모리 상에서 정확히 동일한 인스턴스를 참조하는지 확인합니다. 객체의 참조(reference)를 비교합니다. 예를 들어, obj1과 obj2라는 두 개의 객체가 있다면, assert..

개발/코틀린 2023.06.17

(Coroutine) Flow flatMapConcat, flatMapLatest, flatMapMerge

flatMapConcat, flatMapLatest, 그리고 flatMapMerge는 모두 Kotlin의 코루틴 라이브러리에서 제공하는 Flow 연산자들입니다. 이들 연산자들은 각각 다른 방식으로 upstream Flow의 각 요소를 다른 Flow로 변환하고, 이렇게 생성된 여러 Flow들을 하나의 결과 Flow로 연결합니다. flatMapConcat: flatMapConcat 연산자는 upstream Flow의 각 요소를 Flow로 변환하고, 이를 순차적으로 연결하여 결과 Flow를 생성합니다. 즉, 한 번에 하나의 내부 Flow만 처리하며, 새로운 내부 Flow는 이전의 내부 Flow가 완전히 수집된 후에만 수집됩니다. flatMapMerge: flatMapMerge 연산자도 upstream Flow..

개발/코틀린 2023.06.14

(코틀린) Testing with Kotest

테스트 프레임워크는 개발 생명 주기 전반에서 품질을 유지할 수 있도록 도움을 주고, 재사용 가능한 코드 작성을 돕는 중요한 역할을 합니다. Kotest 명세 Kotest를 설정하는 방법과 테스트 하는 방법에 대해 알아봅니다. Kotest 시작하기 Kotest를 하려면 프로젝트 의존성에 Kotest를 추가해야 합니다. testImplementation "io.kotest:kotest-runner-junit5:4.5.0" Kotest와 IntelliJ의 통합해주기 위해 제공되는 플러그인이 있습니다. import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe class NumbersTest : StringSpec({ "2 + 2..

개발/코틀린 2022.12.18

(코틀린) 동시성

동시성(concurrent) 주제로 코루틴에 대해 알아보겠습니다. 코루틴 코틀린 프로그램에서도 자바 동시성 기본 요소를 쉽게 사용해 스레드 안전성을 이용할 수 있습니다. 하지만 동시성 연산인 Thread.sleep(), Thread.join(), Object.wait()등이 스레드를 블럭하기 때문에 문제가 남아있습니다. 스레드를 블럭하고 나중에 재개하려면 문맥 전환(context switch)를 하면서 성능이슈가 발생할 수 있습니다. 또한 자원을 많이 사용하기 때문에 비효율적입니다. 더 효율적인 접근 방법은 비동기(Asynchronous) 프로그래밍입니다. 동시성 연산에 대해 연산이 완료될 때 호출될 수 있는 람다를 제공할 수 있고, 원래 스레드는 블럭된 상태로 작업 완료를 기다리는 대신 다른 유용한 작..

개발/코틀린 2022.12.11

(코틀린) 자바 상호 운용성

자바 코드를 코틀린에서 사용하기 코틀린은 JVM을 주 대상으로 설계됐기 때문에 자바 코드를 코틀린에서 쉽게 사용할 수 있습니다. 자바 메서드와 필드 Unit과 void 자바에서 void는 코틀린에서 Unit으로 변환되서 사용합니다. 연산자 관습 Map.get()과 같은 몇몇 자바 메서드는 코틀린에서 연산자 관습을 만족합니다. 자바 메서드에는 operator가 붙어있지 않지만 코틀린에서는 연산자처럼 사용할 수 있습니다. 그래서 List나 Map의 get을 코틀린에서는 []로 접근 할 수 있습니다. 합성 프로퍼티 자바에는 합성 프로퍼티가 없고 getter와 setter를 사용하는 일이 많습니다. 이로 인해 코틀린 컴파일러는 자바의 getter와 setter를 일반적인 프로퍼티처럼 사용할 수 있게 변형 해줍니..

개발/코틀린 2022.12.03

(코틀린) 도메인 특화 언어(DSL)

도메인 특화 언어(Domain-Specific Language, DSL)는 특정 기능이나 영역을 위해 만들어진 언어를 뜻합니다. 연산자 오버로딩 코틀린 내장 연산자에 대해 새로운 기능을 제공하도록 해주는 기능입니다. + 가 수 타입에서는 덧셈 연산이지만 문자열의 경우 연결 연산인고 컬렉션의 경우는 원소를 맨 뒤에 붙이는 연산입니다. 이렇게 + 가 다르게 동작할 수 있는데 연산자 오버로딩이 되어 있기 때문에 가능합니다. 연산자 오버로딩은 operator 키워드를 붙이고 그에 맞는 이름을 붙이면 됩니다. operator fun String.times(n: Int) = repeat(n) fun main() { println("abc" * 3) // abcabcabc println("abc".times(3)) ..

개발/코틀린 2022.11.27

(코틀린) 제네릭스

제네릭 선언을 정의하고 사용하는지 보고 런타임 타입 소거(type erasure)와 구체화(reification)로 인해 제네릭스 사용 시 어떤 문제가 생기는지 보고 같은 제네릭 타입에 대해 타입 파라미터 값이 달라지는 경우까지 하위 타입 관계를 확장함으로써 제네릭스의 유연성을 향상시켜주는 중요한 개념인 변성(variance)에 대해 알아봅니다. 타입 파라미터 제네릭 선언 어떤 선언을 제네릭 선언으로 만들려면 하나 이상의 타입 파라미터를 추가해야 합니다. fun main() { val map = HashMap() val list = arrayListOf() // 컴파일러가 문맥에서 타입 인자를 추론할 수 있으면 생략 가능 val map2: HashMap = HashMap() val list2: Array..

개발/코틀린 2022.11.12

(코틀린) 클래스 계층 이해하기

클래스 상속 개념을 이해하고 하위 클래스를 정의하는 방법을 터득하며 abstract class, interface, 클래스 위임을 통해 복잡한 클래스 계층 구조를 설계하는 방법에 대해서 알아봅니다. 그리고 강력한 스마트 캐스팅을 사용할 수 있는 타입 검사를 가능하게 해주는 대수적 데이터 타입(Alegebraic Data Type, ADT)인 Sealed class에 대해서도 알아봅니다. 상속 객체지향 언어에서 상속은 도메인 개념에 있는 is-a 관계를 표현합니다. is-a는 사람은 동물이고, 자동차는 이동수단과 같은 개념을 의미합니다. 여기서 동물과 이동수단은 상위 클래스(superclass), 기반클래스(base class)라고 부르며 사람과 자동차는 하위 클래스(subclass), 파생클래스(deri..

개발/코틀린 2022.11.06
728x90
반응형