Compose UI 매커니즘Compose는 데이터를 UI로 변환하기 위해 아래와 같은 세 가지 주요 단계를 통해 UI를 그리는 매커니즘을 사용합니다. Composable 함수들은 UI를 그리기 위해 각 단계를 매번 수행해야 합니다. 하지만, 동일한 입력일 때 동일한 결과를 계산하는 반복 작업은 불필요합니다. 그래서 Compose에서는 Recomposition에서 이전과 동일한 입력이 보장된다면, 동일한 결과를 계산하는 반복 작업(세 단계의 작업)을 생략합니다. 동일한 입력인지 판단히기Recomposition은 입력 매개변수가 변경될 떄, 트리거됩니다. Compose Runtime은 이전 매개변수 값을 기록해 뒀다가, `equals()`를 사용해서 새롭게 변경된 매개변수 값과 비교합니다. `equ..
사진: Unsplash의Nick Russill 코루틴을 언제 사용하는가?여러 작업을 동시에 수행하는 애플리케이션을 만들기 위해, 즉 "동시성"을 구현하기 위해 Kotlin은 코루틴을 사용합니다. JVM과 Kotlin/Native 환경에서, 코루틴을 포함한 모든 동시성 코드는 OS가 관리하는 스레드 위에서 실행됩니다. 코루틴은 스레드를 블로킹(Blocking)하지 않고 실행을 중단(Suspend) 할 수 있습니다. 이를 통해 하나의 코루틴이 어떤 데이터가 도착하기를 기다리며 중단되어 있는 동안, 같은 스레드에서 다른 코루틴이 실행될 수 있어, 시스템 자원을 효율적으로 사용할 수 있습니다. 코루틴과 스레드 비교스레드는 운영체제가 관리합니다. 스레드는 여러 CPU 코어에서 작업을 병렬로 실행할 수 있으며..
사진: Unsplash의Vidar Nordli-Mathisen 이번 게시글에서 Compose Navigation을 사용하면서 발생한 Recomposition 문제, 그리고 그 원인과 해결방안에 대해 이야기해보려고 합니다. Recomposition으로 인한 문제 발생어느 때와 같이 안드로이드 개발을 하던 도중 문제가 발생했습니다. 바로 NavHost가 리컴포지션 되면, 현재 화면이 계속 startDestination으로 되돌아간다는 문제였습니다. 제가 정의한 NavHost는 다음과 같습니다.NavHost( navController = navigator.navController, startDestination = navigator.startDestination,) { composabl..
사진: Unsplash의Towfiqu barbhuiya 면접에서 아키텍처 패턴에 대한 이야기를 할 때, 자주 나오는 질문이 MVI와 MVVM의 차이에 대해 묻는 것입니다. 이번 게시글에서는 이 질문에 대한 저의 답변을 한번 작성해보고자 합니다. 지극히 개인적인 생각이므로, 잘못되거나 다른 의견이 있으시다면 댓글로 작성해주시길 바라겠습니다. 두 아키텍처 패턴의 차이에 대해 말하려면, 먼저 각 아키텍처 패턴에 대해 이해하고 있어야 합니다. 그래서 차이에 대해 말하기 전에 각 패턴에 대해 알아보겠습니다. MVVM란?다음은 위키피디아에서 말하는 MVVM의 정의와 이미지 입니다.위키피디아: Model–View–ViewModel(MVVM)은 컴퓨터 소프트웨어에서 사용되는 아키텍처 패턴으로, 그래픽 사용자 인터페..
사진: Unsplash의Kelly Sikkema 최근 개발을 하면서 다른 사람들의 GitHub을 뒤져보다가, TextField를 너무나도 간단하게 사용하는 사례를 발견했습니다. 제가 기존에 사용하던 방식과 비교했을 때 너무 간단해져서 사용을 고려했지만, 결국 어떠한 이유로 사용하지 않게 되었기에, 이 경험을 공유해보고자 합니다. 기존 방식제가 이전에 사용했던 방식은 ViewModel에서 상태를 관리하는 형태였습니다.@HiltViewModelclass NameViewModel @Inject constructor() : ViewModel() { private val _name = MutableStateFlow("") val name: StateFlow get() = _name fun se..
사진: Unsplash의Elena Mozhvilo 이번 게시글에서는 WebSocket에 대해 알아보고 멀티 모듈 환경에서 WebSocket을 사용해보려고 합니다. WebSocket이란?WebSocket은 웹 환경에서 실시간, 양방향 통신을 지원하는 프로토콜입니다. 한 번 연결을 맺으면, 서버와 클라이언트가 끊임없이 데이터를 주고받을 수 있습니다.WebSocket 연결이 생성되면 TCP 소켓 기반으로 통신이 시작됩니다.소켓이란 네트워크에서 데이터를 주고받은 두 장치 간의 종단점을 의미합니다. 한 번 연결을 맺으면, 서버와 클라이언트가 끊임없이 데이터를 주고받을 수 있습니다. WebSocket 통신은 아래와 같은 과정으로 진행됩니다.WebSocket HandshakeTCP 기반 통신소켓 종료 WebS..
현대 프로그래밍 언어는 대부분 컬렉션 처리를 잘 지원합니다. 컬렉션 처리를 최적화하는 것은 생각보다 어렵지만 굉장히 중요합니다. 그러니 몇 가지 규칙을 기억하고, 상황에 맞게 생각해야합니다. 아이템 49 - 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라아래의 Iterable과 Sequence는 완전히 다른 목적으로 설계되어서, 다른 형태로 동작합니다.interface Iterable { operator fun iterator(): Iterator}interface Sequence { operator fun iterator(): Iterator} 무엇보다 Sequence는 지연 처리됩니다. 따라서 시퀀스의 최종적인 계산은 최종 연산이 이루어질 때 수행됩니다. 반면에 Iterable..
가독성과 성능 사이에 트레이드 오프가 발생할 때, 개발자는 무엇이 더 중요한지 스스로 답할 수 있어야 합니다. 이를 결정할 수 있는 몇 가지 방법이 있지만, 최종적인 결정은 스스로 상황을 보고 해야 합니다. 아이템 45 - 불필요한 객체 생성을 피하라 객체 생성에는 비용이 들어갑니다. 그러니 불필요한 객체 생성은 피해야 합니다. 이런 이유에서 JVM에는 동일한 문자열을 처리한다면, 기존의 문자열을 재사용합니다.val str1 = "effective kotlin"val str2 = "effective kotlin"println(str1 === str2) // true -128 ~ 127 범위에 해당하는 숫자도 마찬가지로 재사용합니다. 객체 생성 비용은 항상 클까?객체를 생성하면, 크게 세 가지 비용이 ..