생명주기에 맞춰 안전하게 코루틴 사용하기

생명주기에 안전한 코루틴 lifecycle 컴포넌트를 사용한다면, 생명주기를 인식하는 코루틴을 만들 수 있다. LifecycleOwner로써 취급되는 AppCompatActivity(ComponentActivity) 또는 Fragment를 일반적으로 사용할 때 lifecycle 컴포넌트를 사용하게 되는데 이때 lifecycleScope를 사용할 수 있다. 일반적은 코루틴 스코프와 마찬가지로 launch를 async와 같은 함수 호출을 통해 suspendable 한 작업을 할 수 있다. lifecycleScope.launch { // 코루틴 작업 더보기…

콜드 스트림을 핫 스트림으로 변경하기 (shareIn, stateIn)

MutableSharedFlow를 사용하여 값을 발행하고 다른 한편에서는 이를 수집할 수 있는 수단을 제공한다. 그러나 다른 코드에 있는 콜드 플로우를 가져와서 이 업스트림을 수집하고 SharedFlow로 내보낼 수 있는 편리한 방법도 있다. 바로 ShareIn 연산자를 사용하는 것이다. ShareIn 연산자 shareIn 연산자는 다음과 같이 생겼다. 이 연산자를 사용하면, Flow(콜드스트림)를 주어진 코루틴 스코프(scope) 내에서 시작되는 더보기…

[이펙티브 코틀린 요약] 효율적인 컬렉션 처리

컬렉션은 중요한 개념이며, 안드로이드에서도 일반적으로 RecyclerView, LazyColumn 등을 사용할 때 컬렉션을 사용하게 된다. 현대적인 프로그래밍 언어는 대부분 컬렉션 처리를 굉장히 잘 지원해주며, 코틀린도 강력한 컬렉션 처리를 지원한다. 컬렉션을 처리하는 부분의 최적화는 성능에 큰 영향을 미치므로 굉장히 중요하다. 이번 포스팅에서는 효율적인 컬렉션 처리를 하는 방법에 대해서 알아본다. 하나 이상의 처리단계를 가진 더보기…

오토박싱 및 언박싱 그리고 JVM내 캐시에 대하여

Autoboxing vs Unboxing 오토박싱(Autoboxing)은 Java 컴파일러가 원시 타입(Primitive types)과 해당 객체 래퍼 클래스 간에 수행하는 자동 변환을 말한다. 예를 들어 int를 Integer로, double을 Double로 변환하는 식이다. 변환이 다른 방향으로 진행되는 경우 이를 언박싱(unboxing)이라고 한다. 다음 간단한 오토박싱 예제를 살펴보자. ‘a’의 타입은 char인데 Character에 대입했다. 이렇게 해도 호환이 되며 이것이 오토박싱이다. 더보기…

[이펙티브 코틀린 요약] 비용 줄이기

과거에는 메모리가 비쌌고 하드웨어적인 제약이 컸기 때문에 효율성(efficiency) 및 최적화에 많은 노력을 기울였다. (1985년에 출시한 게임, 마리오 브라더스 용량이 약 40kB이였던 것에 대해 생각해보자) 하지만 오늘날에는 상대적으로 하드웨어보다 개발자의 몸값이 비싸기 때문에 과거보다는 효율성에 대해 상대적으로 관대하게 바라본다.하지만 여러가지 측면에서 최적화는 여전히 중요하다. 조금만 최적화에 신경을 써도 사용자 및 기업이 더보기…

처음 시작하는 코루틴, 기본적인 용어와 이해

코루틴(Coroutines)이란? 코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴이다. 코루틴은 다음과 같은 특징을 갖는다. 경량화 메모리 누수 감소 계층적 구조를 통한 취소 전달 Jetpack과의 통합 Suspend function suspend(유예하다, 연기하다) vs block(막다, 차단하다) blocking과 suspending의 차이에 대해서 먼저 알아보자. 단일 쓰레드에서 네트워크 요청(FUNCTION A)과 같은 더보기…

코틀린/자바의 volatile에 대해서

volatile이란? 자바의 volatile 키워드 또는 코틀린의 @Volatile 애노테이션을 변수 선언시 지정할 수 있다. 사전적 의미로는 ‘휘발성의’라는 뜻을 가지며, 변수 선언시 volatile을 지정하면 값을 메인 메모리에만 적재하게 된다. volatile 변수를 사용하지 않는 일반적인 경우는 내부적으로 성능 향상을 위해 메인 메모리로부터 읽어온 값을 CPU 캐시에 저장한다. 하지만 멀티쓰레드 애플리케이션에서는 각 쓰레드를 통해 더보기…

[이펙티브 코틀린 요약] 클래스 설계

코틀린에서 자주 사용하는 클래스 패턴을 살펴보도록 한다. 이번 장에서는 다음의 내용에 대해서 생각 해 볼 수 있다. ‘상속’을 활용해야 하는 경우 ‘data 클래스’를 사용해야 하는 경우 하나의 메서드를 갖는 인터페이스를 함수 타입으로 사용해야 하는 경우 equals, hashCode 그리고 compareTo의 규약 상속보다는 컴포지션 사용하기 상속은 계층 구조를 만들기 위해 사용한다. 계층 더보기…

[이펙티브 코틀린 요약] 객체 생성에 대하여

코틀린은 순수 함수형 스타일로 작성할 수도 있지만 자바처럼 OOP스타일로도 작성할 수 있다. 객체를 생성하는 방법에느 어떤 것들이 있고 어떠한 장단점이 있는지 살펴보자. 생성자 대신 팩토리 함수 사용하기 객체를 만드는 일반적인 방법은 생성자를 사용하는 방법이지만, 팩토리 패턴을 이용한 객체를 생성할 수도 있다. 팩토리 함수(패턴)의 특징 생성자와 다르게 함수에 원하는 이름을 붙일 더보기…

[이펙티브 코틀린 요약] 추상화 설계에 대하여

추상화 객체 지향 프로그래밍(Object-Oriented Programming;OOP)에서 주요한 개념은 추상화, 캡슐화, 상속이 있다. 이 중 추상화에 대해서 알아본다. 추상화는 복잡성을 숨기기 위해 사용되는 단순한 형식을 의미한다. 대표적인 예가 인터페이스(interface)다. 클래스라는 복잡한 개념에서 메서드와 프로퍼티만 추출해서 단순화 했으므로 이를 추상화라 말할 수 있다. 실세계에서는 자동차를 예를 들 수 있다. 자동차는 굉장히 잘 만들어진 더보기…