본문 바로가기

코틀린

(13)
컴포즈 UI 성능과 Stability Compose UI Performance와 Stability: 실무 가이드Android Compose를 사용하여 성능과 안정성을 확보하는 것은 사용자 경험을 개선하고 유지보수를 용이하게 하는 데 필수적입니다. 이 글에서는 Android 개발자 문서의 Compose Stability를 바탕으로, 주요 개념과 실전 예제를 자세히 살펴봅니다.1. 기본 개념: Compose Stability란?Compose Stability는 Compose UI에서 불필요한 재구성을 줄여 성능을 최적화하고, UI의 상태를 예측 가능하게 유지하는 것을 의미합니다. 핵심은 다음과 같습니다:Stable Object: 안정적인 객체로, 동일한 입력에 대해 동일한 결과를 제공합니다.Immutable Object: 불변 객체로, 객체의 ..
Sealed Class와 Enum Class의 차이점 Sealed Class와 Enum Class의 차이점코틀린에서는 Sealed Class와 Enum Class 모두 특정 값의 집합을 정의하고 관리하는 데 사용됩니다. 하지만 이 둘은 사용 목적과 동작 방식에서 큰 차이가 있습니다. 이번 글에서는 Sealed Class와 Enum Class의 차이점과 각각의 활용 사례를 정리합니다.1. Enum Class정의Enum Class는 고정된 상수 집합을 정의하는 데 사용됩니다. 이 클래스는 각 상수가 하나의 객체로 간주되며, 비교와 분기에 유용합니다.특징값의 집합이 고정적이며 컴파일 시점에 정의됩니다.각 상수는 싱글톤 객체로 동작합니다.직렬화와 함께 사용하기 적합합니다.간단한 상수 집합에 적합합니다.예제enum class Direction { NORTH, ..
코틀린 제네릭이란? (in, out) 코틀린 제네릭의 이해와 활용코틀린은 코드의 타입 안정성을 극대화하기 위해 다양한 기능을 제공합니다. 그중 하나가 바로 **제네릭(Generic)**입니다. 제네릭은 코드를 유연하고 재사용 가능하게 만들면서도 안정성을 유지하는 데 중요한 역할을 합니다. 이 글에서는 코틀린 제네릭의 핵심 개념과 활용법을 체계적으로 정리합니다.제네릭의 기본 개념: 가변성과 제약 조건코드를 작성하다 보면 특정 로직을 다양한 타입에서 재사용하려는 요구가 발생합니다. 예를 들어, 파라미터를 모두 Any로 받는 방식으로 일반화를 시도할 수 있습니다. 그러나 이는 타입 안정성을 저하시켜 의도치 않은 오류를 유발할 수 있습니다.제네릭을 활용하면 다양한 타입에서 재사용 가능한 코드를 작성하면서도, 타입 안정성을 유지할 수 있습니다. 코틀..
불변 객체 불변 객체란 객체를 생성한 이후 변하지 않는 객체를 말한다. private, val과 같이 데이터가 변하지 않기 때문에 생성된 객체를 신뢰할 수 있게 된다. 얕은 복사란 해당 객체의 메모리 주소 값만 복사하는 것을 말한다. 주소만 복사하기 때문에 기존 객체가 변하게 되면 영향을 받게 된다. 깊은 복사란 해당객체의 데이터를 복사하는 것을 말한다. 데이터를 복사하기 때문에 기존 객체의 변경에도 영향을 받지 않는다. 코틀린에서는 객체의 .copy()등을 이용한다. 방어적 복사란 생성자를 통하여 초기화할 때 새로운 객체 등으로 감싸서 복사하는 방법이다. 코틀린의 toList(), toMutableList()로 사용할 수 있다. public fun Collection.toMutableList(): MutableL..
inline 함수 inline 고차 함수를 사용할 경우 객체를 생성하여 런타임시 오버헤드가 발생한다. 이를 Inline으로 선언해 주면 객체를 생성하지 않아 오버헤드가 발생하지 않지만 객체를 생성하는 대신 코드를 copy하기 때문에 코드의 양이 많은 함수는 inline을 사용하지 않는게 좋다. 보통 1~3줄의 경우에 사용하는게 좋다. inline함수의 인자로 고차 함수가 존재할 수 있는데 별도 처리를 해주지 않으면 코드를 생성하여 객체를 생성하지 않는다. 하지만 inline함수내에서 다른 함수를 호출할 경우나 전달 받은 파라미터 함수의 사이즈가 너무 커서 inline을 사용하는게 좋지 않은 경우가 있을 수 있다. 이경우에 파라미터에 @noninline 어노테이션을 달아 주면 코드를 생성하지 않고 객체를 생성한다. Reif..
코틀린 by란? 코틀린에서 by의 사용은 주로 두가지로 나누어 진다. 첫번째는 Property Accessors의 구현을 다른 객체에 위임하는 것이다. 주로 안드로이드 개발을 하면서 흔히 사용되는 by lazy, by inject(), by mutableStateOf()등 있다. private val viewModel: SomeViewModel by lazy { ViewModelProvider(requireActivity())[SomeViewModel::class.java] } private val viewModel: SomeViewModel by viewModels() var someState by remember { mutableStateOf(false) } 위에서 사용되는 by를 이해하기 위해 간단한 예시를 하나 ..
코틀린 플로우 개념 Flow는 여러 값을 순차적으로 내보낼 수 있는 비동기 스트림(콜드)이다. 데이터 스트림은 다음과 같은 세 가지 항목으로 다눌 수 있다. 생산자 Flow 스트림에 추가되는 데이터를 생산한다(emit) 중개자 Flow 스트림에 내보내는 데이터를 가공한다.(선택사항) 소비자 생산자와 중개자를 통해 생산된 데이터를 소비한다.(collect 등) 종류 생산자 flow 가장 기본적인 생산자이다. fun flowNumber(): Flow = flow { repeat(10) { emit(it) delay(100) } } flowOf flow와 달리 생산 인자를 직접 입력해 줘야 한다. fun flowNumber(): Flow = flowOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) asFlow li..
비동기 callback을 동기로 처리하기 suspendCoroutine, suspendCancellableCoroutine 기존에 callback 방식을 이용하여 비동기식으로 사용되고 있는 함수를 suspendCoroutine, suspendCancellableCoroutine, callbackFlow를 이용하여 동기식으로 이용하는 방법에 대해 알아보자. (callbackFlow는 추후 포스팅 예정) callback함수를 통해 하나의 테이터만 전달할 경우 suspendCoroutine, suspendCancellableCoroutine 이용하고 지속적인 데이터 전달이 있을 경우는 callbackFlow를 사용하면 된다. public suspend inline fun suspendCoroutine(crossinline block: (Continuation) -> Unit): T { contract { callsInPlace(b..