저번 포스팅에서는 UniRx가 모든 것을 스트림으로 보는 프로그래밍 방식이고, 스트림을 어떻게 만들고 사용하는지에 대해서 공부했었다.
UniRx는 이렇게 만든 스트림을 여러가지 오퍼레이터를 통해 필터링하여 원하는 데이터들만 가지고 원하는 타이밍에 원하는 작업을 수행할 수 있도록 만들 수 있다. 사실 얼마나 이 필터링 작업을 자유롭게 하는지에따라 UniRx를 다루는 실력이 나누어질거라고 생각한다. (물론 나는 초짜) 이번에는 스트림을 필터하는 친구들 중에서도 가장 기본이되는 Where과 Select에 대해서 알아보도록하자.
Where
조건에 맞는 메세지만 필터링하는 오퍼레이터
무작정 구독한 스트림에서 오는 모든 메세지를 원하는 것은 아닐 것이다. 만약 0~9까지의 숫자들이 넘어 오는 스트림에서 5 이상의 숫자들에만 반응 하고 싶다면? 이럴 때 Where 오퍼레이터를 사용하면 완벽하다.
만약, Where 오퍼레이터를 사용하지 않는다면 Subscribe쪽에서 if문으로 필터링을 하고 처리하면 될것이다. 하지만 이렇게된다면 Subscribe에서 작성하는 코드가 상대적으로 깔끔하지 못하다. 우리는 그래서 Where구문을 사용하여 필터링 처리를 하고 Subscribe를 하게된다. 이렇게되면 원하는 메세지에만 집중할 수 있고 전체적인 라인수도 짧아지며 Subscribe 내부 구문들이 훨신 더 깔끔해진다.
위 코드는 직접 만든 UniRx 샘플들 중 하나이다. Where(_ => Input.GetMouseButtonDown(0))를 통해 마우스 왼쪽 버튼이 눌렀을 때만 필터링하고 있다. Where은 이 구문이 True일 때만 통과된다는 의미이다.
Select
메세지 요소를 변환하는 오퍼레이터
Where을 통해 메세지 중 원하는 메세지와 원치 않는 메세지를 구분했다면 Select를 통해서는 원하는 메세지 중에서도 그 내용을 미리 가공해서 사용하고 싶을 때 사용하는 오퍼레이터이다. 이것도 물론 Subscribe에서 처리할 수 있지만 위와 같은 이유로 Select 오퍼레이터를 사용하여 처리한다.
이건 Drag를 처리하는 구문 중 하나인데 Select를 통해 원하는 메세지를 Vector2 형식으로 변환하고 있다. 마우스가 눌린 X축과 Y축 각각을 2차원 벡터로 변환하여 사용하는 구문이다. 이렇게 단일 값만 변환할 수도 있지만 SelectMany를 이용하여 단순히 값을 변환하는 것이 아니라 다른 스트림에 흐르는 메시지로 가져와 변환 시킬 수도 있다. (이 오퍼레이터는 아직 적극적으로 사용해보지 않아서 깊게 이해되는 편은 아님)