코틀린 코딩 컨벤션을 보다보면 아래와 같은 get()함수가 심심치 않게 보인다.구글링을 해보니 아래와 같은 답을 찾을 수 있었다.get()은 사용자 정의 getter메소드를 정의하는데 사용된다. property에 접근할때마다 사용자 정의 getter를 사용한다.객체지향
우선 클래스를 흔히들 설계도에 빗대어 표현한다. 클래스는 내부에 변수와 메소드를 가지는 명세서 같은 것이다. 따라서 설계도라고 말할 수 있는 것이다. 위와 같이 Car라는 클래스가 있고 내부에 size와 type이라는 변수(프로퍼티)를 가지고 있고 move라는 메소드를

초기화 블록(init)이 여러개 있을 때, 실행되는 순서위에서 부터 실행된다.응집도하나의 클래스에 모여있는 데이터와 메서드가 밀접하게 관련있는 정도같은 목적을 가진 데이터와 메서드가 하나의 클래스에 모여있을수록 응집도가 높다또한 하나의 기능을 구현하기 위해 필요한 것들

RxJava나 자바 언어 자체적으로 지원하는 멀티스레드, 콜백 등, 우리는 이미 비동기적 연산을 수행하기 위한 다양한 방법을 알고 있다. 그렇다면 왜 코틀린 코루틴을 배워야 하는 것일까?코틀린 코루틴은멀티플랫폼에서 작동시킬 수 있기에 코틀린을 사용하는 모든 플랫폼(JV

시퀀스는 List나 Set과 같은 컬렉션이랑 비슷한 개념이지만, 필요할 때마다 값을 하나씩 계산하는 지연(lazy) 처리를 한다.시퀀스의 특징은 다음과 같다.요구되는 연산을 최소한으로 수행한다.무한정이 될 수 있다.메모리 사용이 효율적이다.시퀀스는 sequence라는
중단 함수는 코틀린 코루틴의 핵심이며, 코틀린 코루틴의 다른 모든 개념의 기초가 되는 필수적인 요소이다.코루틴은 중단되었을 때 Continuation 객체를 반환한다. 이 객체를 이용하면 멈췄던 곳에서 다시 코루틴을 실행할 수 있다. 중단했을 때 코루틴은 어떤 자원도
중단 함수는 코틀린 코루틴의 핵심이며, 코틀린 코루틴의 다른 모든 개념의 기초가 되는 필수적인 요소이다.코루틴은 중단되었을 때 Continuation 객체를 반환한다. 이 객체를 이용하면 멈췄던 곳에서 다시 코루틴을 실행할 수 있다. 중단했을 때 코루틴은 어떤 자원도
코루틴의 동작 과정에서 중요한 점은 다음과 같다.중단 함수는 함수가 시작할 때와 중단 함수가 호출되었을 때 상태를 가진다는 점에서 상태 머신과 비슷하다.Continuation 객체는 상태를 나타내는 숫자와 로컬 데이터를 가지고있다.함수의 Continuation 객체가
코루틴에 대해 떠올릴 때 대부분의 사람들은 하나의 개념으로 생각한다.하지만, 코루틴은 두 가지로 구성되어 있다.코틀린 언어에서 자체적으로 지원하는 부분(컴파일러의 지원과 코틀린 기본 라이브러리의 요소)코틀린 코루틴 라이브러리(kotlinx.coroutines)코틀린 언
코루틴 빌더(coroutine builder)는 일반 함수에서 중단 함수를 호출하는 역할을 한다.kotlinx.coroutines 라이브러리가 제공하는 세 가지 필수적인 코루틴 빌더는 다음과 같다.launchrunBlockingasynclaunch가 작동하는 방식은 t
CoroutineContext는 원소나 원소들의 집합을 나타내는 인터페이스이다.Job, CoroutineName, CoroutineDispatcher와 같은 Element 객체들이 인덱싱된 집합이라는 점에서 Map이나 Set과 같은 컬렉션이랑 비슷한 개념이다.특이한 점

Job은 수명을 가지고 있으며 취소 가능하다.Job은 인터페이스지만, 구체적인 사용법과 상태를 가지고 있다는 점에서 추상클래스처럼 다룰 수 있다.Job의 수명은 상태로 나타낸다.Active 상태에서는 Job이 실행되고 코루틴은 Job을 수행한다.대부분의 코루틴은 Act
Job 인터페이스는 취소하게 하는 cancel 메서드를 가지고 있다.cancel 메서드를 호출하면 다음과 같은 효과를 가져온다.호출한 코루틴은 첫 번째 중단점(위 예제에서는 delay)에서 Job을 끝낸다.Job이 자식을 가지고 있다면, 그들 또한 취소된다. 하지만 부

잡히지 않은 예외가 발생하면 프로그램이 종료되는 것처럼 코루틴도 잡히지 않은 예외가 발생했을 때 종료된다.코루틴은 예외를 받았을 떄 자기 자신을 취소하고 예외를 부모로 전파한다. 부모는 자기 자신과 자식들 모두를 취소하고 예외를 부모에게 전파한다.이때, runBlock

위 코드는 중단 함수에서 중단 함수를 호출한다. 이때, 작업이 동시에 진행되지 않는다.하나의 엔드포인트에서 데이터를 얻는 데 1초씩 걸리기 때문에 함수가 끝나는 데 1초 대신 2초가 걸린다.두 개의 중단 함수를 동시에 실행하려면 async로 래핑해야 한다. 이때, as

디스패처를 이용해 코루틴이 실행되어야 할 스레드(또는 스레드 풀)를 결정할 수 있다. 그리고 디스패처를 정하는 것은 CoroutineContext이다. 기본 디스패처 디스패처를 설정하지 않으면 기본적으로 설정되는 디스패처는 CPU 집약적인 연산을 수행하도록 설계된 Dispatchers.Default이다. 이 디스패처는 CPU 개수와 동일한 수(최소 두 ...
CoroutineScope 팩토리 함수 CoroutineScope는 CoroutineContext를 유일한 프로퍼티로 가지고 있는 인터페이스이다. CoroutineScope 인터페이스를 구현한 클래스를 만들고 내부에서 코루틴 빌더를 직접 호출할 수 있다. 하지만
위와 같이 아이디로 사용자를 받아오거나, 이전에 전송받은 모든 사용자를 얻을 수 있는 코드가 있다. 이렇게 구현했을 때 문제점은 무엇일까? 바로 동시 사용에 대한 대비가 되어 있지 않다는 것이다. 해당 함수가 한 개의 스레드에서 시작할 경우에는 정상적으로 작동한다

대부분의 경우 중단 함수를 테스트하는건 일반적인 함수를 테스트하는 것과 다르지 않다. 코루틴을 사용하는 경우에도 중단 함수의 동작이 궁금하면 runBlocking과 assert를 지원하는 도구만 사용해도 충분하다. 시간 의존성 테스트하기 시간 의존성을 테스트하기 시

채널은 송신자와 수신자의 수에 제한이 없으며, 채널을 통해 전송된 모드 값은 단 한 번만 받을 수 있다. 그리고 채널의 양쪽 끝에 각각 하나의 코루틴만 있는 경우가 가장 일반적이다. Channel은 두 개의 서로 다른 인터페이스를 구현한 하나의 인터페이스다. S
채널은 값을 핫(hot) 스트림으로 가지지만, 콜드(cold) 스트림이 필요할 때가 있다.우리가 사용하는 대부분의 데이터 소스는 두 가지 종류로 구분할 수 있다.핫 스트림: 컬렉션(List, Set), Channel콜드 스트림: Sequence, Stream, Flow

플로우(flow)는 비동기적으로 계산해야 할 값의 스트림을 나타낸다.Flow 인서페이스 자체는 떠다니는 원소들을 모으는 역할을 하며, 플로우의 끝에 도달할 때까지 각 값을 처리하는 걸 의미한다.Flow의 유일한 멤버 함수는 collect이다. 다른 함수들은 확장 함수로
플로우는 어떤 연산을 실행할 지 정의한 것이다.중단 가능한 람다식에 몇 가지 요소를 추가한 거라고 생각하면 된다.이번 글에서는 람다식을 변환하여 Flow 인터페이스와 flow 빌더를 어떻게 구현하는지 단계별로 작성할 것이다.처음엔 간단한 람다식부터 시작해보자.각 람다식
플로우를 만드는 간단한 방법은 플로우가 어떤 값을 가져야 하는지 정의하는 flowOf 함수를 사용하는 것이다.값이 없는 플로우가 필요한 경우도 있다. 이런 경우에는 emptyFlow() 함수를 사용하면 된다.asFlow 함수를 사용해서 Iterable, Iterator

플로우를 요청이 한쪽 방향으로 흐르고 요청에 의해 생성된 값이 다른 방향으로 흐르는 파이프라 생각할 수 있다.플로우가 완료되거나 예외가 발생했을 때, 이러한 정보가 전달되어 중간 단계가 종료된다.모든 정보가 플로우로 전달되므로 값, 예외 및 (시작, 완료와 같은)다른

플로우 생성과 최종 연산 사이의 연산들(곱하고, 변형하고, 합치는 등)을 플로우 처리라 한다.이번엔 플로우 처리를 위해 사용하는 함수들을 정리해보겠다.map은 플로우의 각 원소를 변환 함수에 따라 변환시키는 함수다.각 수의 제곱을 계산하는 연산이라면, 생성되는 플로우는
일반적으로 플로우는 콜드 데이터이기에 요청할 때마다 값이 계산된다. 이때, 여러 개의 수신자가 하나의 데이터가 변경되는지 감지하는 경우도 있다.이럴 때 메일링 리스트와 비슷한 개념인 공유플로우(SharedFlow)를 사용한다.MutableSharedFlow는 브로드캐스