전체 글 170

RxJava - 스케쥴러 (Scheduler)

스케쥴러는 프로그램의 세부 일정을 주관하는 관리자라고 생각하면 좋습니다. 그 동안 RxJava를 사용하여 구현해온 코드들은 모두 main Thread에서 동작하는 코드입니다. 그런데 실무에서는 요구 사항에 따라 비동기로 동작할 수 있도록 스레드를 지정할 수 있어야 합니다. (메인 스레드로 고정된 것을 바꾸어야 함) 스케쥴러는 스레드를 지정할 수 있게 해줍니다. 새로운 스레드를 생성하거나 기존의 Executors를 활용하는 것을 넘어서 새로운 방식으로 동작이 이루어 집니다. 스레드를 만들면서 경쟁 조건이나 synchronized 키워드를 사용했다면 스케쥴러는 이와 같은 것들을 신경 쓸 필요가 없어집니다. flip()의 기능 보다는 시간 표시줄에 더 집중해서 살필 필요가 있습니다. 위 마블 다이어그램을 코드..

Kotlin 컬렉션 타입 - (2)

1. 매핑 함수 map(), mapIndexed() map() 함수는 forEach() 함수와 유사합니다. 집합 객체의 데이터 수만큼 반복하여 실행하는 것을 동일하나 forEach()와는 다르게 반환값이 있다는 점입니다. forEach()는 단순히 반복 실행만 하지만 map()은 반복실행 한 후 결과 값을 반환합니다. val list = listOf(12, 8, 9, 20) list.filter { it > 10 } .map { it * 10 } .forEach { println(it) } 결과는 120, 200이 출력됩니다. val list = listOf(12, 8, 9, 20) list.filter { it > 10 } .map { it * 10 } .map { println(it) } 위 코드 역..

Kotlin 컬렉션 타입

코틀린에서 제공하는 컬렉션 타입을 이용하면서 iterator(), filter(), map(), forEach() 함수 등을 이용하여 더 간편하게 데이터를 제어할 수 있습니다. 이런 컬렉션 타입의 함수들은 고차 함수로 구현되어 있습니다. 1. 집합 연산 함수 forEach() / forEachIndexed() 이 함수는 컬렉션 타입의 데이터 개수 만큼 단순하게 특정 구문을 반복적으로 실행 할 수 있는 함수입니다. val result = list.filter { it > 10 } for(i in result) { println(i) } 기존에 위와 같이 코드를 작성했다고 한다면, val result = list.filter { it > 10 } .forEach { println(it) } 이렇게 사용할 수..

리액티브 연산자 - (1) 변환 연산자

리액티브 X에는 다양한 연산자 함수가 있습니다. 이 연산자 함수들의 개수는 Rx 버전이 올라갈수록 계속 증가하고 있습니다. 하지만 기본적인 함수들을 익혀놓으면 이후에는 필수 연산자에서 파생된 연산자 함수들이기 때문에 이해할 수 있습니다. 리액티브 연산자의 특징은 언어 특성과 크게 연관이 없습니다. RxJava, RxKotlin, RxJS, RxSwift 등 언어적인 부분에서 말고는 연산자의 기능이 크게 다르지 않습니다. 리액티브 연산자는 함수형 프로그래밍 관점에서 보았을 때 순수 함수입니다. 이번 포스트에서는 다양한 연산자 함수 중 변환 연산자에 대해 알아보도록 하겠습니다. Transforming 연산자에는 map()과 flatMap() 두 가지가 있습니다. 1. map() 함수 map() 함수는 입력된..

Kotlin 함수형 프로그래밍 - (5) 클로저

이번 포스트에서는 함수형 프로그래밍 중 클로저의 개념에 대해 살펴보도록 하겠습니다. 클로저(Closure)는 함수가 호출될 때 발생하는 데이터를 함수가 호출된 이후에도 계속 유지해서 사용하는 기법입니다. fun closureFunction(num: Int) { println("arguments : $num") } num이라는 변수는 함수가 종료되면 사라지는 즉, 스코프는 함수 내부가 됩니다. 함수형 프로그래밍에서는 함수에 선언된 변수가 호출 후에도 유지되어야 하는 경우도 있습니다. 그 이유는 함수형 프로그래밍에서는 함수가 1급 객체이기 때문에 함수 내부에 함수를 정의할 수 있기 때문입니다. fun closureFunction(num: Int): (Int) -> Int { println("argument ..

Kotlin 함수형 프로그래밍 - (4) 인라인 함수

고차 함수는 함수형 프로그래밍에서 매우 중요한 기법이지만 람다 함수를 전달하고 이 람다 함수를 이용하는 코드가 많아지면서 런타임 시 성능 상의 문제가 발생할 가능성이 있습니다. fun hoFunTest(argFun: (x1: Int, x2: Int) -> Int) { argFun(10, 20) } fun main(args: Array) { val result = hoFunTest { x1, x2 -> x1 + x2 } } 고차 함수 호출이 빈번하게 일어나서 런타임 시 성능 상의 문제가 발생할 수 있다면 인라인 함수가 대안책이 될 수 있습니다. 인라인 함수는 inline이라는 키워드를 추가한 함수이며 컴파일 단계에서 정적으로 포함되는 함수이므로 런타임에 함수가 호출되지 않습니다. inline fun hoF..

Kotlin 함수형 프로그래밍 - (3) 고차 함수

고차 함수는 매개변수로 함수를 전달받거나 함수를 반환하는 함수를 말합니다. fun highFunction(a: Int, argFunction: (Int) -> Int) { val result = argFunction(10) println("a : $a, highFunction : $result") } highFunction(10, {x -> x * x}) (Int) -> Int 타입의 함수를 argFunction이라는 이름으로 사용할 수 있다는 것입니다. 위의 코드에서는 highFunction의 매개변수로 람다 함수를 사용한 예시입니다. 고차 함수와 함수 타입 매개변수 함수 타입의 매개변수 대입 일반적으로 함수를 호출할 때는 함수명 뒤에 ()를 붙이고 () 안에 인수를 작성합니다. 그런데 고차 함수의 매..

Kotlin 함수형 프로그래밍 - (2) 람다 표현식

람다식(람다 함수)은 익명 함수(Anonymous Function)를 지칭하는 용어입니다. 함수형 프로그래밍이 아니더라도 람다식(람다함수)을 사용할 수 있지만 함수형 프로그래밍에서는 람다 함수가 고차함수의 매개변수(Parameter)나 반화값(Return Value)으로 사용됩니다. 고차 함수가 무엇인지는 조금 후에 알아보도록 하고 코틀린에서 람다식이 무엇인지 알아보기로 하겠습니다. 람다식 (람다 함수) fun 함수이름(매개변수) { 함수내용 } 코틀린에서 함수를 작성하는 방식은 위와 같습니다. 람다 함수는 fun이라는 키워드와 함수 이름을 생략하고 선언합니다. { 매개 변수 -> 함수 내용 } 람다 함수는 다음과 같은 규칙을 바탕으로 정의합니다. 1. 람다 함수는 항상 { }로 감싸서 표현해야 한다. ..

[공유] 넵 병은 실재했다

신기한 글이 있어서 공유하도록 한다. 출처 : https://brunch.co.kr/@kklloop/6 2017년, 박창선님께서 이른바 '넵'병을 세상에 소개해주셨다. 넵병은 '을'의 관계에 있는 사람들이 '갑'에게 대답할 때 자기도 모르게 '넵'을 타이핑하게 되는 슬픈 현상을 의미한다. 넵병은 아직 뚜렷한 치료법이 발견되지 않아 지금도 우리 주변에 창궐하고 있다. 우리 회사 슬랙에 '넵'을 검색해보았다. 16k results... 나는 2017년 당시에 대학원에서 석사과정을 밟고 있었다. 다들 아시다시피 대학원생은 교수라는 '슈퍼갑'을 상대해야 하는 '슈퍼을'이다. 그렇다 보니 내 몸에서도 자연스레 넵병이 발병하게 되었다. 어디서 옮아왔는지 모르겠다. 아직 치료 중이다. 자고로 병은 원인을 알아야 고칠..

일상이야기 2019.08.12