Seoplee
개발의 섭리, Seoplee의 개발
Seoplee
  • 분류 전체보기 (54)
    • Android (26)
      • Architecture (12)
      • Compose (0)
      • Tips (11)
      • 트러블슈팅 (3)
    • IOS (1)
      • Tips (1)
    • Kotlin (1)
    • Coroutine (3)
      • Flow (3)
    • RxJava (12)
    • CI&CD (1)
    • WEB (8)
    • Network (1)
    • ETC (1)
    • (임시) (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Seoplee

개발의 섭리, Seoplee의 개발

RxJava

RxJava 02 - RxJava를 사용하는 데 필요한 배경 지식

2022. 1. 13. 15:33

RxJava Chapter 02 - RxJava를 사용하는 데 필요한 배경 지식


람다식

함수형 인터페이스를 구현하기 위해 자바 8에서 도입한 표현식
RxJava에서 람다식을 사용하여 생산성을 높일 수 있다.

람다식을 이용하면 구현해야할 인터페이스나 메서드의 선언은 생략하고, 인자와 실행문만으로 작성되며, 인자 타입, return값등도 생략이 가능하다.

예제

BiFunction<Integer, Integer, BigDecimal> function =     
    new BiFunction<Integer, Integer, BigDecimal>() {           
        @Override         
        public BigDecimal apply(Integer value1, Integer value2) {             
            return new BigDecimal(value1 + value2);     
        } 
    };

이를 람다식으로 표현하면 다음과 같다.

BiFunction<Integer, Integer, BigDecimal> function =     
    (value1, value2) -> new BigDecimal(value1 + value2);

이를 코틀린으로 변환하면 다음과 같다.

var function: BiFunction<Int, Int, BigDecimal?> =
    BiFunction<Int, Int, BigDecimal?> { value1, value2 -> BigDecimal(value1 + value2) }

RxJava는 다음과같이 독자적으로 준비된 함수형 인터페이스를 제공한다.

Function/Predicate

  • 구현해야 할 메서드에 인자와 반한값이 있음
  • Funtion은 메소드의 반환값에 제한이 없고, Predicate는 반환값이 Boolean이어야 함.

BooleanSupplier: 인자없이 반환값을 반환

  • 인자없이 Boolean을 반환하는 메서드 존재

Action/Consumer: 반환값이 없음

  • 반환값이 없는 메서드
  • Action은 구현해야 할 메서드에 인자가 없고, Consumer는 인자가 있음

Cancellable : Action과 동일하나 실행 의미가 다름

  • Action과 마찬가지로 인자도 반환값도 없는 메서드 존재
  • 단지 Action과 달리 취소 처리를 구현하는데 사용.

람다식 기본 문법

(타입, 인자, ...) -> {
    실행문
    return 반환값
}

람다식과 익명 클래스의 차이점

익명 클래스의 this는 구현한 인터페이스의 인스턴스를,
람다식의 this는 람다식을 구현한 클래스의 인스턴스를 나타낸다.

비동기 처리

비동기 처리란 어떤 작업을 실행하는 동안 해당 처리가 끝나기를 기다리지 않고 다른 작업을 시작할 수 있는것을 말한다.

Java나 Kotlin에서는 스레드(thread)를 이용하여 각각의 스레드에서 작업을 실행해 비동기처리를 할 수 있음.

비동기 처리시 주의할 점

  1. 메모리와 캐시
    클래스 필드가 가르키는 값과 실제 메모리가 가리키는 값이 동일하지 않을 수 있음.
    필드가 다루는 값은 메모리에서 캐시된 값으로 값 참조와 변경을 하고 적절한 시점에 실제 메모리 값을 변경하기 때문.
  2. 원자성
    일련의 처리 흐름 중간에 다른 작업이 끼어들 수 있음을 고려해야 함. 비동기 처리 도중 다른 작업이 해당 값을 참조할 수 있으므로 주의.

해결 방안

  1. 변수의 재할당이나 객체 상태를 변경하지 못하게 선언.
  2. 변경이 가능한 가변 객체를 다루어야 한다면 volatile 제한자 사용.
  3. synchronized 블록. 자신의 스레드가 이 블록을 처리하는 중에는 다른 스레드에서의 접근을 대기시킨다.

자바에서의 synchronized 사용 예시

synchronized void rightUp() {
    //Do Something
}

코틀린에서의 synchronized 사용 예시

@Synchronized fun rightUp() {
    //Do SomeThing
}
저작자표시 (새창열림)

'RxJava' 카테고리의 다른 글

RxJava 04 - Flowable과 Observable의 연산자 (part.02)  (0) 2022.01.18
RxJava 04 - Flowable과 Observable의 연산자 (part.01)  (0) 2022.01.18
RxJava 03 - RxJava의 매커니즘  (0) 2022.01.15
RxJava 01 - (번외) Hot Observable 예제 in Android  (0) 2022.01.04
RxJava 01 - RxJava란 무엇인가?  (0) 2021.12.28
    'RxJava' 카테고리의 다른 글
    • RxJava 04 - Flowable과 Observable의 연산자 (part.01)
    • RxJava 03 - RxJava의 매커니즘
    • RxJava 01 - (번외) Hot Observable 예제 in Android
    • RxJava 01 - RxJava란 무엇인가?
    Seoplee
    Seoplee
    개발공부를 하며 기록할만한 것들을 정리해놓은 블로그입니다.

    티스토리툴바