rxSwift를 사용하다가 사용빈도수가 높은 map과 flatMap을 정리 해보겠습니다.

map은 Observable로 방출된 값을 어떤 함수에 적용시켜서 값을 변경하거나 타입을 변경 할 필요가 있을때 유용하게 쓰인다.
입력값을 다른 출력값으로 변환하는 역할을 합니다.
Observable의 내부의 값을 변경하는데 쓰인다.

예) Observable의 타입이 int인경우 String으로 변환하려할때
값을 변환하려고 하는 경우
import RxSwift
let disposeBag = DisposeBag()
let numbers = Observable.of(1, 2, 3, 4, 5)
numbers
.map { $0 * 2 } // 각 숫자를 2배로 변환
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
타입을 변환하려고 하는 경우
아래는 예제는 int타입의 Observable을 String타입으로 변환 시켜주는 예제이다.
let disposeBag = DisposeBag()
let numbers = Observable.of(1, 2, 3, 4, 5)
numbers
.map { String($0) }
.bind(to: label.rx.text)
.disposed(by: disposeBag)
Observable에 의해 방출된 항목을 Observable로 변환한 다음 그 방출을 단일 Observable로 평면화합니다.

flatMap을 자세히 알기위해서는 Map과의 차이점을 비교하면서 아는게 좋다고 생각한다.
먼저 Map은 Observable의 내부의 타입, 값을 변형시키지만 flatMap은 변형시키면서 새로운 Observable형태의 새로운 스트림을 방출한다. 따라서 각 스트림에 대해서 구독이 가능하다.
예시로 Observable< String > 을 String을 Observable타입으로 map을 사용해서 변형시키면 아래와 같이 Observable이 중첩이 된다.
Observable<Observable<Observable<..>>>
하지만 flatMap은 변환 과정에서 새로운 Observable을 생성하고, 이를 병합하여 단일 스트림으로 만듭니다.
이 점 때문에, flatMap은 주로 비동기 작업(네트워크 요청, 파일 읽기 등)에서 사용됩니다.
let numbers = Observable.of(1, 2, 3, 4, 5)
numbers
.flatMap { number -> Observable<String> in
return Observable.just(String(number))
}
위와 같은 예제는 int타입인 숫자들을 String으로 변환하게 되는데 이때 각각의 숫자마다 Stream이 생겨 subscribe를 할 수 있게 된다.
flatMap의 사전적인 뜻과 연관을 지으면 기존 Observable에 각각의 Observable이 평탄하게 올라온다. 위의 사진처럼..
map: 값을 변환하거나 타입을 변경할 때 사용. 단순 변환에 적합.
flatMap: 새로운 Observable을 생성하고 이를 병합. 주로 비동기 작업이나 중첩된 Observable 처리를 위해 사용.