Kotlin 8

[Kotlin] 코루틴의 취소와 예외 처리 파고들기

코루틴을 막 학습한 사람에게 코루틴은 매우 간단하고 자바스크립트의 async, await와 비슷하게 보이기도 해서 비동기 프로그래밍을 위한 아주 쉽고 훌륭한 도구로 보일 수 있습니다. 실제로 쉽고 훌륭한 도구이긴 하지만요. 하지만 코루틴을 더 깊게 살펴보면 실제로 걸리기 쉬운 함정들이 많이 존재합니다. 예외 처리나 취소를 try-catch 블록을 통해 간단히 할 수 있으리라 생각하지만 실제로는 복잡한 매커니즘으로 동작하고 있기에 많은 것들이 잘못될 수도 있습니다. 본문에서는 유튜브의 In-Depth Guide to Coroutine Cancellation & Exception Handling 영상을 바탕으로 다음의 내용을 다룹니다. 코루틴에서 어떻게 예외를 잡고 처리해야 하는지 코루틴에서 예외 처리가 일..

Kotlin/Coroutines 2022.07.15

[Kotlin] suspend 함수의 실행 원리: 콜백에서 코루틴으로

Coroutines: Replace callbacks & Main safety 코루틴은 콜백 스타일의 코드를 순차적 프로그래밍으로 변경해주고 안드로이드에서 우리의 코드를 main safe하게 만들어준다. main safe하다는 것은 예시로 네트워크 요청을 만드는 코루틴 기반의 함수를 작성할 수 있게 해주고, 그냥 메인 스레드에서 호출해도 아무런 문제가 없다는 것을 뜻한다. 어떻게 코루틴이 이것을 가능하게 해주는지 네트워크 요청을 생성하기 위한 예제 코드를 통해 알아보자. Blocking 스타일 코드 메인 스레드에서 result를 networkRequest()부터 직접 리턴받는 블로킹(blocking) 스타일로 작성한 코드를 보자. 위의 코드에서 networkRequest()는 메인 스레드를 블로킹할 것이..

Kotlin/Coroutines 2022.07.03

[Kotlin] Scope function (let, run, with, apply, also) 정리

코틀린 표준 라이브러리는 객체 컨텍스트 내에서 코드 블럭을 실행하는 것이 유일한 목적인 함수들을 포함하고 있다. 이 함수들을 람다식을 이용해서 호출하면 일시적인 범위(scope)가 생성되는데, 이 범위 내에서는 이름이 없어도 객체에 접근할 수 있다. 이 함수들을 Scope Function(범위 지정 함수)이라 부르며, let, run, with, apply, also 5가지가 존재한다. Function selection 함수 객체 참조 리턴 값 확장 함수 여부 let it Lambda Result O run this Lambda Result O run - Lambda Result X with this Lambda Result X apply this Context Object O also it Contex..

Kotlin 2022.03.02

메서드 체이닝 패턴이 적용된 코틀린 코드의 시간 복잡도 구하기

다음 코드의 시간 복잡도는 어떻게 될까? arr.filter { it > 0 }.reduce { acc, i -> acc + i } 일반적인 for-loop문이 들어간 명령형 코드에서 시간 복잡도를 계산하는건 직관적이고 익숙하지만, 코틀린 표준 라이브러리의 컬렉션 함수형 API 함수들의 시간 복잡도를 계산하는건 다소 낯선 일이다. 더욱이 위의 코드와 같이 메서드 체이닝(method chaining) 패턴으로 작성된 코드의 시간 복잡도를 구하라는 이야기를 처음 들으면 당황스러울 수 있다(면접에서 내가 그랬다...). 다음에는 당황하는 일이 없도록 잘 정리해보자. 아래 예제의 확장 함수 IntArray.sumPositive()는 IntArray의 요소 중 양수만 걸러내고(filter) 그 결과에 대해 초기값..

Kotlin 2022.02.05

[Kotlin] 최상위 함수와 프로퍼티

최상위 함수 객체 지향 언어인 자바에서는 모든 코드를 클래스의 메소드로 작성해야 한다. 하지만 실제 코드를 작성하면 어느 한 클래스에 포함시키기 어려운 코드가 많이 생긴다. 중요한 객체는 하나뿐이지만 그 연산을 객체의 인스턴스 API에 추가해서 API를 너무 크게 만들고 싶지 않은 경우가 있다. 그 결과 다양한 정적 메서드를 모아두는 역할만 담당하며, 특별한 상태나 인스턴스 메서드는 없는 클래스가 생겨난다. JDK의 Collectios 클래스가 전형적인 예시이며, 프로그래머가 작성한 코드에서 Util이 이름에 들어있는 클래스가 비슷한 예이다. 코틀린에서는 이런 무의미한 클래스가 필요없다. 대신 함수를 직접 소스 파일의 최상위 수준, 모든 다른 클래스의 밖에 위치시키면 된다. 이러한 함수를 최상위 함수(T..

Kotlin 2021.12.29

[Kotlin] 코틀린과 함수형 프로그래밍

함수형 프로그래밍의 핵심 개념 1. 일급 시민(first-class) 함수 함수(프로그램의 행동을 나타내는 코드 조각)을 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 반환할 수 있다. (일급 시민에 대한 설명은 여기에서 확인) 2. 불변성(immutability) 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다. 3. 부수 효과(side effect) 없음 함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수(pure function)를 사..

Kotlin 2021.12.27

[Kotlin] 1급 시민(first-class citizen)이란?

1급 시민(first-class citizen)이란? 프로그래밍에서 1급 시민이란 다음의 조건을 충족하는 것을 말한다. 변수에 담을 수 있다. 함수의 인자로 전달할 수 있다. 함수의 반환값으로 전달할 수 있다. 1급 객체와 1급 함수? 1급 시민, 1급 객체, 1급 함수와 같이 비슷한 용어들이 존재하는데 그 미묘한 차이를 정리해보자. 1급 객체는 말 그대로 1급 시민의 조건을 충족하는 객체를 이야기한다. 코틀린의 함수는 객체로 사용할 수 있기 때문에 1급 객체에 속한다. 1급 함수는 1급 객체이면서 아래의 조건들은 추가로 만족하는 함수를 말한다. 런타임에 생성이 가능하다. 익명으로 생성이 가능하다. 코틀린과 1급 함수 코틀린의 함수는 1급(first-class)이다. 자바의 경우 함수는 클래스의 멤버의 ..

Kotlin 2021.12.27

[Kotlin] 정적 타입 언어 vs 동적 타입 언어

정적 타입(Statically typed) 언어 정적 타입 언어는 컴파일 타임에 타입 검증이 일어난다. 프로그램 안에서 객체의 필드나 메서드를 사용할 때마다 컴파일러가 타입을 검증해준다. 기본적으로 자바, C, C++는 모든 변수의 타입을 프로그래머가 직접 명시해야 한다(언어의 버전이 올라가면서 타입 추론 기능을 지원하기도 한다). 하지만 정적 타입 언어 중에서도 코틀린, 하스칼, 오카멜(OCaml)과 같은 언어는 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추하여 프로그래머가 타입 선언을 생략할 수 있다. 컴파일러가 문맥을 고려해 변수 타입을 결정하는 기능을 타입 추론(type inference)이라고 한다. var x = 1 위의 코드는 코틀린으로 작성되었다. 변수를 정의하면서 정수 값으로 초기화하..

Kotlin 2021.12.25