
사진: 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 범위에 해당하는 숫자도 마찬가지로 재사용합니다. 객체 생성 비용은 항상 클까?객체를 생성하면, 크게 세 가지 비용이 ..

이번 게시글에서는 안드로이드에서의 MessageQueue에 대해 알아보고자 합니다. MessageQueue란?MessageQueue는 특정 스레드에서 실행될 작업들(Message, Runnable)의 목록을 저장하는 큐입니다. 안드로이드 앱에서는 버튼 클릭, UI 갱신 등 다양한 이벤트가 발생합니다. 이런 작업들을 한 번에 처리하지 않고, 메시지 형태로 큐에 넣어 순서대로 처리하기 위해 MessageQueue가 사용됩니다. 당연하게도, MessageQueue만으로는 원하는 작업을 처리할 수 없고 안드로이드는 두 가지 핵심 도구인 Looper와 Handler를 사용하여 작업을 진행합니다.RunnableRunnable은 1개의 메서드를 갖는 함수형 인터페이스입니다. 하나의 작업 단위를 정의하여 실행 가능..
클래스는 객체 지향 프로그래밍(OOP) 패러다임에서 가장 중요한 추상화입니다. 아이템 36 - 상속보다는 컴포지션을 사용하라상속은 'is-a' 관계의 객체 계층 구조를 만들기 위해 설계되었습니다. 상속은 관계가 명확하지 않을 때 사용하면, 여러 가지 문제가 발생할 수 있습니다. 그렇기 때문에 일반적으로는 상속보다 컴포지션을 사용하는 것이 좋습니다. 간단한 행위 재사용공통되는 행위는 슈퍼클래스를 만들어서 많이 추출합니다.abstract class LoaderWithProgress { fun load() { innerLoad() } abstract fun innerLoad()}class ProfileLoader: LoaderWithProgress() { override f..
이번 게시글에서는 Flow의 생산자에 대해서 알아봅니다. Flow 생산자 (Producer)Flow란?우리가 사용하는 Flow는 아래와 같은 인터페이스입니다. 이 인터페이스는 `collect`라는 중단 함수를 가지고 있습니다. public interface Flow { public suspend fun collect(collector: FlowCollector)} collect 함수는 `FlowCollector`를 인자로 받아 Flow가 발생한 데이터를 수집합니다. 즉, Flow가 데이터를 발행하고, `FlowCollector`가 그것을 처리하는 구조입니다. `FlowCollector`는 Flow가 발행한 데이터를 실제로 처리하는 객체입니다. `FlowCollector`의 핵심 메서드인 `emi..

이번 게시글에서는 코루틴의 구조적 동시성에 대해 알아보고자 합니다. 구조적 동시성이란?시작하기에 앞서구조적 동시성(Structured Concurrency)이란 동시성 작업의 흐름을 순차적으로 제어할 수 있도록 하는 방식입니다. 일반적으로 코드는 순차적으로 실행되지만 동시성 작업이 추가되면, 제어의 흐름을 벗어나게 됩니다. 아래의 그림의 `myfunc`와 같이 말이죠. 동시성 작업이 완전히 통제되기를 기대할 수는 없습니다. 일정 부분은 그대로 흘러가게 두어야 합니다. 그러나 이러한 흐름을 적절히 제어해야만, 전체 작업이 예측 가능한 순서로 실행되도록 보장할 수 있습니다. Nurseries동시성 작업을 제어하기 위한 개념으로 `nurseries`가 등장했습니다. `nurseries`의 핵심 아이디..

게시글을 시작하기에 앞서 안드로이드가 말하는 Context의 정의에 대해 알아보겠습니다. Context의 정의Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc. 애..