Kotlin

    스케줄러를 통한 멀티스레딩, subscribeOn, observeOn

    스케줄러(Scheduler) 스케줄러는 Reactive X에서 멀티스레딩을 수행할 수 있도록 스레드 풀을 생성하고 다른 스레드에서 실행할 수 있게 해준다. Reactive X에서는 미리 정의된 스케줄러를 제공하며, 아래와 같은 종류와 사용 용도를 가진다. Schedulers.io() : * I/O 관련 작업을 수행할 수 있는 무제한의 워커 스레드. 무제한으로 워커 스레드를 생성할 수 있어 OutOfMemory를 야기할 수 있으니 주의하여 용도에 맞게 사용하여야 한다. * I/O 관련 작업 : 파일 시스템, DB 등의 작업 Schedulers.computation() : CPU의 코어 수와 동일한 수의 스레드를 가지는 스레드 풀을 제공한다. CPU 코어를 사용하는 복잡한 계산 작업에 사용하는 스케줄러이다...

    연산자 - 결합, 그룹핑, 필터링 응용, 오류처리

    1. startWith startWith 연산자를 통해 기존 observable의 앞에 새로운 observable을 결합 할 수 있다. fun main() { val observable = Observable.range(11, 10) val observable2 = Observable.range(1, 10) observable .startWith(observable2) .subscribe { result -> println("onNext = $result") } } //onNext = 1 //onNext = 2 //onNext = 3 //onNext = 4 //onNext = 5 //onNext = 6 //onNext = 7 //onNext = 8 //onNext = 9 //onNext = 10 //on..

    연산자 - 필터링, 변환, 축소

    연산자 (Operator) Observable , Flowable을 피연산자로 사용해 변환된 새로운 Observable, Flowable을 반환하는 함수 필터링 연산자 1. debounce debounce 연산자는 아이템의 발행 이후 특정 시간이 지난 후에 다운스트림으로 해당 아이템이 전달될 수 있도록 한다. ex) EditText에서 사용자가 입력 할 때마다 검색이 수행되는 것이 아닌 입력 한 뒤 n초가 지난 후에 검색이 수행되도록 할 때 fun main() { val observable = Observable.create { it.onNext("H") runBlocking { delay(100) } it.onNext("He") runBlocking { delay(100) } it.onNext("Hel..

    Cold Observable / Hot Observable

    Cold Observable Cold Observable은 각 observer가 observable을 구독 할 때마다 구독 된 시기에 상관없이 늘 처음부터 배출 된 값을 온전히 받을 수 있는 형태를 말한다. 여태까지 알아봤던 create, from, just와 같은 팩토리 메서드들은 모두 이러한 Cold Observable에 해당한다. fun main() { val coldObservable = Observable.just(1, 2, 3, 4) val observer1 = object : Observer { override fun onSubscribe(d: Disposable) { println("observer1 onSubscribe") } override fun onNext(t: Int) { prin..

    Observable / Observer

    Observable 옵저버블(Observerble)은 데이터를 소모하는 컨슈머(Observer)가 소모할 수 있는 데이터를 내보내주는 역할을 한다. 기존 iterator에서 값을 가져오는 pull 방식이 아니라 옵저버블에서 값을 내보내는 push 방식을 채택함을 알 수 있다. 옵저버 패턴을 사용하여 옵저버블을 구독하는 옵저버 측에서 옵저버블이 데이터를 내보낼 때 이를 사용한다. Observable의 동작 Observable은 데이터에 대한 처리를 할 수 있는 3가지 메소드를 가진다. onNext : 해당 메소드를 통해 옵저버블은 옵저버에게 데이터를 내보낸다. onComplete : 해당 메소드를 통해 옵저버블은 옵저버에게 모든 아이템의 발행이 완료되었음을 알린다. 터미널 메소드로써, 마지막 아이템까지 발..

    Reactive Programming

    리액티브 프로그래밍 (Reactive Programming) 리액티브 프로그래밍(Reactive Programming) : 데이터의 흐름과 변경사항에 대한 전파에 대한 프로그래밍 패러다임. 예를 들어, 데이터 A의 변화에 따라 데이터 B의 값이 변화하는 방식을 리액티브 프로그램이라 칭함. 리액티브 프로그래밍 방식은 작성된 코드가 정해진 순서대로 수행되는 명령형 프로그래밍 방식과는 다르게 데이터의 흐름에 따라 코드가 수행되는 방식을 취한다. 즉, 프로그램이 아닌 주변의 데이터의 변경에 따른 이벤트가 흐름을 주도하는 방식이다. 리액티브 프로그래밍의 특징 함수형 프로그래밍 방식을 통해 콜백과 같은 방식에서 사이드 이펙트가 없으므로 스레드에 안전하다. 또한, 스케줄러 등을 활용하여 스레드를 활용한 비동기 처리가..

    [Android, Kotlin] 제네릭의 in, out 키워드는 무엇일까?

    (0) 학습 계기 깃허브의 좋은 소스코드 예제를 분석하며 공부 중, 몇 번씩 봐왔지만 정확한 의미는 몰랐던 in, out에 관한 키워드가 등장했다. 문제의 소스코드다. 필요한 부분만 축약해서 보자. sealed class Result { data class Success(val data: T) : Result() object Empty : Result() companion object { fun successOrEmpty(list: List): Result { return if (list.isEmpty()) Empty else Success(list) } } } sealed class로 Result를 정의하는 코드이다. in, out가 무엇인지 몰랐으므로 저 out이 없으면 뭐가 문제인지도 몰랐다. 그래..

    [Kotlin] object / companion object를 통한 Java의 static 키워드 대체

    (1) Kotlin의 object 코틀린에서의 object 키워드는 두가지 형태로 사용 할 수 있다. - object declarations(선언식) - object expressions(표현식) 1. object declarations(선언식) : Singleton object를 선언식으로 사용하게 된다면 Singleton 형태로 사용할 수 있다. 코틀린에서 object를 선언식으로 사용하는 문법은 다음과 같다. object Singleton { ... } 본 코틀린 코드를 자바로 디컴파일 해보면 다음과 같다. public final class Singleton { public static final Singleton INSTANCE; static { Singleton var0 = new Singlet..

    [Kotlin] Class, Interface 새로 배운 학습 정리

    (1) 기본/보조 생성자 (constructor) - 기본적인 접근 제어자는 public이다. public으로 사용 할 땐 constructor 키워드 생략 가능하다. - 멤버 변수로 사용하고자 할 때에는 기본 생성자에서 val 또는 var 키워드를 붙인다. class MyClass(name: String) // name은 기본적으로 public 형태를 가진다. class YourClass(val name: String) // name은 YourClass의 멤버 변수 - 보조 생성자를 통해 다양한 형태의 생성자를 만들 수 있다. - 보조 생성자를 통해 멤버 변수에 값을 할당하기 위해서는 위 기본 생성자와 같이 val, var를 붙일 수 없다. - 보조 생성자의 매개변수를 직접 클래스의 멤버 변수에 할당해..

    [Kotlin] Type, String, Array 새로 배운 학습 정리

    (1) Type - 원시 타입(Primitive Type) : 변수에 할당 될 때 메모리 상에서 고정된 크기로 할당되며, 원시 데이터의 값을 보관. 값이 저장된 메모리 영역에 직접적으로 접근. [Access By Value] - 참조 타입(Reference Type) : 크기가 정해져 있지 않고 값이 직접 변수에 할당되지 않고 값이 저장되어 있는 Heap Memory의 주소값을 가짐. [Access By Reference] - Stack (정적 메모리 영역) : 변수의 실제 값을 저장하는 영역. 객체 내 메소드 작업 종료 시 메모리 공간은 비워진다. - Heap (동적 메모리 영역) : 런타임 시 메모리에 동적으로 할당되는 영역. 참조 변수가 없으면 가비지 컬렉터에 의해 메모리가 정리될 수 있다. 가비지..