목록Book (47)
시배's Android
기본 디스패처 디스패처를 설정하지 않으면 기본적으로 설정되는 디스패처는 CPU 집약적인 연산을 수행하도록 설계된 Dispatchers.Default 입니다. 실행되는 컴퓨터의 CPU 개수와 동일한 수의 스레드 풀을 가지고 있습니다. Dispatchers.Default의 limitedParallelism을 사용하면 디스패처가 같은 스레드 풀을 사용하지만 같은 시간에 특정 수 이상의 스레드를 사용하지 못하도록 제한할 수 있습니다. 메인 디스패처 안드로이드에서 메인 스레드는 UI와 상호작용하는 데 사용하는 유일한 스레드입니다. 메인 스레드가 블로킹되면 전체 애플리케이션이 멈춰 버립니다. 메인 스레드에서 코루틴을 실행하려면 Dispatchers.Main을 사용하면 됩니다. IO 디스패처 Dispatchers.I..
가변성을 제한하라 상태를 적잘하게 관리해야한다. 프로그램을 이해하고 디버그하기 힘들어집니다. 가변성이 있으면, 코드의 실행을 추론하기 어려워집니다. 멀티스레드 프로그램일 때는 적절한 동기화가 필요합니다. 테스트하기 어렵습니다. 상태변경이 일어날 때, 이러한 변경을 다른 부분에 알려야 하는 경우가 있습니다. val lock = Any() var num = 0 for ( i 1..1000) { thread { Thread.sleep(10) synchronized(lock) { num += 1 } } } Thread.sleep(1000) print(num)가변성은 생각보다 단점이 많아서 이를 완전하게 제한하는 프로그래밍 언어도 있습니다. 바로 순수 함수형 언어입니다. 코틀린에서 가변성 제한하기 읽기 전용 프로..
//이렇게 구현하면 안 됩니다!! suspend fun getUserProfile() : UserProfileData { val user = GlobalScope.async { getUserData() } val notifications = GlobalScope.async { getNotifications() } return UserProfileData( user = user.await(), notifications = notifications.await() ) } GlobalScope는 그저 EmptyCoroutineContext를 가진 스코프일 뿐입니다. 이때 aync 코루틴은 취소가 될 수 없습니다. 부모로부터 스코프를 상속받지 않습니다. 메모리 누수가 발생할 수 있으며 쓸데없이 CPU를 낭비합니다..
코루틴 빌더는 부모도 종료시키며, 취소된 부모는 자식들 모두를 취소시킨다는 점입니다. 코루틴이 종료되기 전에 예외를 잡는 건 도움이 되지만, 조금이라도 늦으면 이미 손쓸 수 없는 상황이 되어 버립니다. 코루틴 간의 상호작용은 잡을 통해서 일어나기 때문에, 코루틴 빌더 내부에서 새로운 코루틴 빌더를 try-catch 문을 통해 래핑하는 건 전혀 도움이 되지 못합니다. SupervisorJob SupervisorJob을 사용하면 자식에서 발생한 모든 예외를 무시할 수 있습니다. fun main() = Unit = runBlocking { //이렇게 하지 마세요. 자식 코루틴 하나가 있고 //부모 코루틴이 없는 잡은 일반 잡과 동일하게 작동합니다. launch(SupervisorJob()) { //1 laun..
기본 요소 : 함수와 변수 함수를 선언할 때 fun 키워드를 사용한다. 파라미터 이름 뒤에 그 파라미터의 타입을 쓴다. 함수를 최상위수준에 정의할 수 있다. (자바와 달리) 꼭 클래스 안에 함수를 넣어야 할 필요가 없다. 배열도 일반적인 클래스와 마찬가지다. 코틀린에는 자바와 달리 배열처리를 위한 문법이 따로 존재하지 않는다. System.out.println 대신에 println이라고 쓴다. 코틀린 표준 라이브러리는 여러 가지 표준 자바 라이브러리 함수를 간결하게 사용할 수 있게 감싼 래퍼를 제공한다. 최신 프로그래밍 언어 경향과 마찬가지로 줄 끝에 세미콜론(;)을 붙이지 않아도 좋다. 함수 fun max(a: Int, b: Int): Int { return if (a > b) a else b } fu..
단순히 스레드를 죽이면 연결을 닫고 자원을 해제하는 기회가 없기 때문에 최악의 취소 방식입니다. 기본적인 취소 Job 인터페이스는 취소하게 하는 cancel 메서드를 가지고 있습니다. 호출한 코루틴은 첫 번째 중단점에서 잡을 끝냅니다. 잡이 자식을 가지고 있다면, 그들 또한 취소됩니다. 하지만 부모는 영향을 받지 않습니다. 잡이 취소되면, 취소된 잡은 새로운 코루틴의 부모로 사용될 수 없습니다. cancel 함수의 인자로 사용되는 예외는 반드시 CancelationException의 서브타입이어야 합니다. cancel이 호출된 뒤 다음 작업을 진행하기 전에 취소 과정이 완료되는 걸 기다리기 위해 join을 사용하는 것이 일반적입니다. join을 호출하지 않으면 경쟁상태가 될 수도 있습니다. 잡이 취소되..
자식은 부모로부터 컨텍스트를 상속받습니다. 부모는 모든 자식이 작업을 마칠 때까지 기다립니다. 부모 코루틴이 취소되면 자식 코루틴도 취소됩니다. 자식 코루틴에서 에러가 발생하면, 부모 코루틴 또한 에러로 소멸합니다. Job 이란 잡은 수명을 가지고 있으며 취소 가능합니다. 잡은 인터페이스이긴 하지만 구체적인 사용법과 상태를 가지고 있다는 점에서 추상 클래스처럼 다룰 수도 있습니다. 잡의 수명은 상태로 나타냅니다. Active 상태에서는 잡이 실행되고 코루틴은 잡을 수행합니다. 대부분의 코루틴은 Active 상태로 시작됩니다. 지연 시작되는 코루틴만 New 상태에서 시작됩니다. 실행이 완료되면 상태는 Completing으로 바뀌고 자식들을 기다립니다. 자식들의 실행도 모두 끝났다면 잡은 마지막 상태인 Co..

코틀린 맛보기 data class Person( val name: String, val age: Int? = null ) name과 age라는 프로퍼티가 들어간 간단한 데이터 클래스를 정의한다. age 프로퍼티의 디폴트 값은 null이다. 코틀린의 주요 특성 정적 타입 지정 언어 자바와 마찬가지로 코틀린도 정적 타입 지정 언어다. 정적 타입 지정이라는 말은 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다는 뜻이다. 이런 점은 다른 동적 타입 지정 언어와는 다르다. JVM에서는 그루비(Groovy)나 JRuby가 대표적인 동적 타입 지정 언어다. 동적 타입 지정 언어에서는 타입과 관계없이 모든 값을 변수에 넣을 ..