RxSwift) RxSwift 개요 (2)

Havi·2021년 2월 27일
0

RxSwift 기초

목록 보기
2/14

비동기 프로그래밍

가변 / 불변 상태 (mutable / immutable state)

다음과 같이 Test struct를 let으로 선언한 뒤에 var property를 변경하려고 하면 에러를 발생한다.

property 자체는 muttable하지만 property를 가지고 있는 인스턴스가 immutable하기 때문이다.

이런식으로 mutating func로 바꿔주려고 해도 당연히 안된다.

이렇게 var instance를 생성해 줄 경우 muttable하게 변경이 가능하다.

여기서 함수에서 struct의 property의 값을 변경시키려면 mutating키워드를 붙여줘야 한다.

왜냐하면 Strutct는 Value Type이고, 기본적으로 Value Type의 프로퍼티는 해당 인스턴스의 메소드 내에서 수정할 수 없기 때문이다.

mutating 키워드를 통해 자기 자신을 아예 새로운 인스턴스로 할당할 수도 있다.

이는 mutating키워드를 사용할 경우 메소드의 계산이 끝난 후 원본 구조체에 그 결과를 덮어 쓰는 방식으로 값을 변경하기 때문이다.
(메모리는 동일한 곳에 저장됨)

일급 객체 (first-citizen class)

Swift에서는 함수를 일급 객체로 취급한다.
즉 다른 객체들 같이 함수가 다음과 같은 특성을 가지게 된다.

  1. 런타임에도 객체가 생성 가능
  2. 인자값과 반환값으로 함수를 전달 가능
  3. 변수나 구조체 안에 객체를 저장 가능
  4. 할당에 사용된 이름과 관계없이 고유한 구별이 가능해야 함

자세한 내용은 이전 글 참조

순수함수 (pure function)

순수함수란 외부 상태에 의존적이지 않고, 어떠한 사이드이펙트도 발생시키지 않는 함수를 말한다.

  • 동일한 input이 들어왔을 때 항상 같은 output을 방출해야 한다.
  • 두개의 순수한 표현식 사이에 데이터 의존성이 없을 경우, 순서가 반대로 되거나 병렬로 수행될 수 있고, 서로 간의 간섭을 할 수 없다.

이렇게 순수함수를 사용할 경우

  1. 테스트가 용이하고, 재사용성이 올라감
  2. 예측 가능성이 높아짐

객체 지향 프로그래밍

Object들로 프로젝트가 구성되고, 오브젝트들의 연관관계로 만들어짐

기능의 최소 단위는 모듈로 연관된 오브젝트로 구성

메소드가 수행될 때는 멤버변수를 사용

멤버변수가 어떤 상태를 가지고 있는가에 따라 결과가 달라짐

명령형 프로그래밍

참고
제드님 블로그

명령형 프로그래밍: 어떤 과정을 통하는가 -

즉 말 그대로 명령하는 형태로 시간의 순서에 따라 프로그래밍 하는 방식

명령형 프로그래밍에서는 할당으로 데이터 상태를 바꾼다.

선언형 프로그래밍

선언형 프로그래밍: 어떤 결과를 얻는가 -

데이터가 잘 흘러갈 수 있도록 제시해주는 방식

명령형 프로그래밍은 단계별로 어떻게 해야할지에 포커스를 둔다.
선언형 프로그래밍은 "내가 원하는 건 이거야. 다음은 어떻게 될거야" 라는 방식에 포커스를 둔다.

함수형 프로그래밍 ⊂ 선언형 프로그래밍

함수형 프로그래밍

민소네님 블로그
곰튀김님 발표 요약 블로그

함수형 프로그래밍이란 자료처리를 수학적 함수( f(x) = y )의 계산으로 취급하고, 상태가변 데이터를 멀리하는 패러다임 입니다.

즉 함수형 프로그래밍은
1. Function을 이용해서
2. No Side-Effect하도록
3. Declarative Programming 하는것이다.

명령형 프로그래밍의 경우 상태 값을 변경할 수 있어 예측하지 못한 에러를 유발할 수 있다.

하지만 함수형 프로그래밍의 경우 순수함수를 사용하기 때문에 항상 예측된 결과가 나오게 된다.

함수형 프로그래밍을 하려면 모듈 단위로 기능을 작게 쪼개야하고, 가변상태를 피하도록 프로그래밍해야하며, 타입을 신중하게 사용해야합니다.

RxSwift Import하기

SPM으로 간단하게 import할 수 있다.

https://github.com/ReactiveX/RxSwift

import할 때 RxBlocking과 RxTest는 반드시 test target에 import해줘야한다.

profile
iOS Developer

0개의 댓글