Kotlin

    [Kotlin] 코틀린의 시퀀스(Sequence)

    코틀린 표준 라이브러리에는 container type인 시퀀스가 있다. 이 시퀀스는 Iterable object에 사용할 수 있다. 기존의 Iterable이 전체 collection에 대해 정의된 순서대로 확장 함수들을 완료하고 다음 단계로 넘어갔다면 시퀀스는 각각 하나의 엘리먼트가 확장함수들을 수행하고 다음 단계로 넘어간다. 물론 크기가 매우 작은 Iterable일 때는 상관없겠지만, 반대로 매우 클 경우에 발생할 수 있는 오버헤드를 해결할 수 있는 유용한 방법이다. 그러므로 상황에 따라 시퀀스를 쓸지 그냥 Iterable 그대로 쓸지 잘 생각해봐야 한다. 일반적인 Iterable이 체인되어 있는 확장 함수들에서 어떻게 동작하는지 확인해보자. val maxEvenSquare = listOf(1, 2, ..

    [Kotlin] 코틀린에서 RxJava와 Coroutine

    위 두 라이브러리는 비동기 작업을 구현하는 방법으로 여기저기서 많이들 사용한다. 코틀린의 경우 RxJava와 Coroutine 모두 사용 가능하고, 두 방식을 혼합하여 사용할 수도 있다. 먼저 간단하게 두 방식 사용 방식 차이점에 대해 알아보자. RxJava RxJava는 Observable Pattern, Iterator Pattern, Functional Programming을 결합한 형태로 데이터를 관찰 가능한 stream 형태로 받을 수 있다. 그렇기 때문에 중간중간마다 데이터의 변화를 확인할 수 있다. RxJava를 사용하기 위해서는 반환값으로 Single 클래스를 사용해야 한다. interface UserService{ @GET("/users) fun getUser(): Single @GET(..

    [Kotlin] Coroutine 동기화 처리

    멀티 스레드 처리는 애플리케이션의 퍼포먼스에 큰 이점을 주지만 경쟁 상태(race condition)를 적절히 조절해 주지 않는다면 데이터의 손실을 야기할 수 있다. - 경쟁 상태란 여러 개의 스레드가 하나의 공유/변경 가능한 자원에 접근하는 것을 말한다. 자세히 보기 데이터 손실을 막기 위해서는 동기화(synchronization)를 통해 race condition을 제어하여 올바른 멀티 스레드 환경을 구축해야 한다. 그러기 위한 여러 방법 중 하나로 Mutex를 고를 수 있다. Mutex Mutex는 공유자원에 변경이 일어나는 순간 적절한 block을 통해 race condition을 제어하는 동기화 제어 기법이다. 코드가 임계 구역에 있는 경우 절대로 동시성이 발생하지 않게 하고 오직 하나의 루틴만..

    [Kotlin] inline 함수

    코틀린 inline 코틀린에선 고차 함수를 사용할 수 있다. 함수를 인자 혹은 반환값으로 사용할 경우 내부적인 동작에서 무의미한 객체/함수를 생성하여 메모리를 낭비시키고 성능 저하를 일으킬 수 있다. 이러한 무의미한 행위를 줄이기 위해 inline 키워드가 제공되는데, 해당 키워드를 사용할 경우 고차 함수 내부의 코드가 그대로 복사되므로 위에서 말한 페널티를 줄일 수 있다. 원본 코드 fun main(){ val someText = foo("main"){ println("in") } } fun foo(value: String, doSomeThing: () -> Unit): String{ doSomeThing() return value + "foo()" } 인라인이 아닐경우 (Java 변환) public ..

    [Kotlin] Flow

    Flow란? 코틀린의 플로우는 순차적으로 값을 내보내고 정삭적으로 또는 예외로 완료되는 비동기적 데이터 스트림이다. map, filter, take, zip 등과 같은 flow의 중간 연산자는 업스트림 flow나 flow에 적용되어 추가 연산자를 적용할 수 있는 다운 스트림 flow를 반환하는 함수다. 위 중간 연산자는 flow에서 코드를 실행하지 않고 함수 자체를 일시 중단하지 않는다. 단지 향후 실행과 신속한 복귀를 위해 일련의 작업을 설정한다. 이를 cold flow라고 부른다. flow의 터미널 연산자는 collect, single, reduce, toList 등과 같은 일시 중단 함수이거나 지정된 스코프에서 flow 수집을 시작하는 launchIn 연산자이다. 이는 업스트림 flow에 적용되며 ..

    [Kotlin] 리스트를 통한 명령형 방식과 함수형 방식 비교

    코틀린의 리스트는 명령형 방식과 함수형 방식을 모두 제공한다. 함수형 방식으로 작성하는 경우 고차 함수를 체이닝 하면 명령형 프로그래밍에서 for와 if문을 사용해서 작성하는 로직을 간결하게 표현할 수 있다. 예를 들면 입력 리스트의 값을 제곱하여 10보다 작은 첫 번째 값을 리턴하는 함수를 명령형으로 작성해보자. fun imperativeWay(): Int { val bigIntList = (1..10000000).toList() var firstSquare = 0 for (value in bigIntList) { val doubleValue = value * value if (doubleValue < 10) { firstSquare = doubleValue break } } return firstSq..