Function literals with receiver 문서 정리를 공부한 이후 작성한 코틀린 receiver 이해를 위한 예시 정리data class Foo(private val name: String) { fun bar1(block: Foo.() -> Unit) { block() } fun bar2(block: (Foo) -> Unit) { block(this) } fun bar3(block: Foo.(s: String) -> Unit) { block(name) } fun bar4(other: Foo, block: Foo.() -> Unit) { other.block() ..
자바
Function types코틀린은 함수를 다루는 선언에 (Int) -> String과 같은 함수 타입을 사용한다. val onClick: () -> Unit = ...이러한 타입은 함수의 시그니처(매개변수와 반환 값)에 해당하는 특별한 표기법을 가진다. 모든 함수 타입은 괄호로 묶인 매개변수 타입 목록과 반환 타입을 가진다: (A, B) -> C는 타입 A와 B의 두 인수를 받아 타입 C의 값을 반환하는 함수를 나타내는 타입이다. 매개변수 타입 목록은 () -> A와 같이 비어 있을 수 있습니다. Unit 반환 타입은 생략할 수 없다.함수 타입은 선택적으로 추가 수신자 타입을 가질 수 있으며, 이는 표기법에서 점(.) 앞에 지정된다: A.(B) -> C 타입은 객체 A에서 매개변수 B와 함께 호출할 수 ..
public interface Job : CoroutineContext.Element { // ...}Job은 CoroutineContext의 Element를 확장한 객체이다.Job은 백그라운드에서 동작하고 개념적으로 완료 시 종료되는 라이프사이클을 가진 취소 가능한 것이다. 계층 구조의 JobJob은 부모-자식 계층 구조로 배열할 수 있다.이때 부모가 취소되면 모든 자식이 재귀적으로 즉시 취소된다. 그리고 취소 예외(CancellationException)가 아닌 예외가 있는 자식이 실패하면 그 부모와 결과적으로 다른 모든 자식도 즉시 취소된다.이러한 예외의 전파는 SupervisoerJob을 사용하여 예외 전파를 막을 수 있다. Job의 생성Job 인터페이스의 가장 기본적인 인스턴스는 다음과 같..
SupervisorJob은 자식 Job으로부터 예외를 전파받지 않아 서로 독립적으로 실패할 수 있다.참고로 Supervisor의 뜻은 감독자다 자식 Job이 실패하거나 취소되어도 SupervisorJob이 실패하지 않고 다른 Job의 작업에 영향을 미치지 않는다.SupervisorJob은 자식 Job의 실패를 처리하기 위한 사용자 지정 정책을 구현할 수 있다.launch를 사용하여 생성된 자식 Job의 실패는 컨텍스트에서 CoroutineExceptionHandler를 통해 처리할 수 있다.async를 사용하여 만든 자식 Job의 실패는 결과 지연 값에 대한 Deferred.await을 통해 처리할 수 있다. 상황Job자식 코루틴끼리 운명을 같이 해야 하는 경우Job()자식 중 하나가 실패해도 다른 작업..
새 코루틴의 범위를 정의한다.코루틴을 생성하기 위한 명세서이다. 모든 코루틴 빌더(예: launch, async 등)는 코루틴 스코프의 확장이며, 코루틴 컨텍스트를 상속받아 모든 요소와 취소를 자동으로 전파한다.public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit ): Job { // 기존의 컨텍스트와 합쳐진 새로운 컨텍스트 val newContext = newCoroutineContext(context) ..
컨텍스트 스위칭다른 스레드 없이 메인 스레드 하나만 스케줄링하다고 하면, 메인 스레드는 항상 실행될 것이다. 반대로 CPU 개수보다 실행 중인 스레드의 개수가 많다고 하면, 운영체제가 특정 스레드의 실행 스케줄을 선점하고 다른 스레드가 실행될 수 있도록 스케줄을 잡는다. 이처럼 하나의 스레드가 실행되다가 다른 스레드가 실행되는 순간 컨텍스트 스위칭이 일어난다. 컨텍스트 스위칭이 일어나는 상세한 구조를 보면, 먼저 현재 실행 중인 스레드의 실행 상태를 보관해두고, 다음번 실행되기로 스케줄 된 다른 스레드의 실행 상태를 다시 읽어 들인다. 스레드 스케줄링을 하려면 운영체제와 JVM 내부의 공용 자료 구조를 다뤄야 한다는 문제가 있다. 운영체제와 JVM 역시 프로그램 스레드가 사용하는 것과 같은 CPU를 함께..