ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 순수함수와 사이드이펙트
    Swift 2021. 8. 22. 13:29

    안녕하세요. 그린입니다🟢

    이번 포스팅에서는 정말 정말 간략하게 순수함수와 사이드이펙트에 대해 알아보겠습니다🧐

     

    다들 순수함수와 사이드이펙트는 들어보셨을거라 생각해요!

    저도 막연하게 어떤거다~~ 하는것만 알고 제대로 사용하진 못했던것 같아요.

    음.. 앱을 개발하면서 객체지향 중심적으로 사고가 박혀있어서인지 순수함수를 쓰려던 부분은 고작해야

    클로저로 처리하거나 통신할때 등 틀에 박혀있게 생각했어요.

    그러던중 ReactiveX를 공부하고 Composable Architecutre로 구조를 잡아가면서 순수함수와 사이드이펙트에 대해 많이 접하네요😱

     

    우선 간략하게 순수함수와 사이드이펙트에 대해 말해보겠습니다.

     

    순수함수

    순수함수는 말그대로 순수한 함수입니다! 즉, 순수함수의 결과값은 항상 동일해야합니다.

    외부 요인(사이드이펙트)에 결과값이 변하면 안되요!

    간단한 예시를 통해 알아보겠습니다.

    import UIKit
    
    struct Effect {
      var talk: () -> Void
    }
    
    Effect(talk: { print("Hi Everyone") })
    Effect(talk: { print("This is not pure") })
    Effect(talk: { print("Thank you") })

    위의 코드는 순수함수 일까요?
    아닙니다.

    talk라는 메서드가 호출될때 항상 동일한 실행과 결과를 보장해야 순수함수인데 talk에 각 다른 문자열을 출력합니다.

    즉, 해당 문자열을 출력하는 사이드이펙트가 발생하죠!

     

    자꾸 사이드이펙트 사이드이펙트 거리는데 사이드이펙트가 뭘까요?

     

    사이드이펙트

    사전적인 의미로는 부작용이라고해요. 음.. 부작용?! 어떻게 보면 함수입장에서도 부작용일 수 있어요.

    talk 메서드를 호출하는데 매번 다른 출력 명령이 주어진다면 부작용이겠죠?

    우리는 쉽게 생각해서 예기치 못한 실행이라고 정의해볼 수 있을것 같아요.

    유저나 개발자가 생각치 못한 실행값이 포함될 수 있죠.

     

    왜 그럼 ReactiveX 세계에서 순수함수와 사이드이펙트를 고려해야할까요?

    우리는 사용자의 반응을 통해 동작을 하고 뷰를 그려주는 리액터한 환경을 구축하고 있습니다.

    즉, 어떠한 액션에 대해 동일한 완전무결한 결과가 보장되야하죠. 

    그렇지 않다면 매번 다른 실행값이 나타날테고 안정성을 보장할 수 없을겁니다.

    이에 순수함수를 통해 액션과 실행을 구현하고 사이드이펙트는 별도로 처리해줘야합니다.

    어디서요?!

    사이드이펙트를 한곳에 모아 처리할 수 있는 Environment가 필요하겠죠!

    (이건 아키텍쳐마다 조금씩 다릅니다.)

    이렇게 사이드이펙트를  어디서 발생시켜줄지 정하고 모아줌으로 편리하게 관리될 수 있습니다.

     

    사이드이펙트 처리

    그럼 되게되게 간단하게 어떻게 사이드이펙트를 모아 처리해볼 수 있을지 코드로 보겠습니다.

    import UIKit
    
    struct Effect {
      var talk: () -> Void
    }
    
    // 사이드이펙트 모음
    let effects: Array<Effect> = [Effect(talk: { print("Hi Everyone") }), Effect(talk: { print("This is not pure") }), Effect(talk: { print("Thank you") })]
    
    // 사이드이펙트 처리
    for effect in effects {
      effect.talk()
    }

    코드만 봐도 다들 아시겠죠?

    간단히 어레이로 묶어주고 반복 실행시키면 됩니다.

    물론 아키텍쳐 모델마다 이러한 처리들이 다르겠지만 쉽게 생각해서 사이드이펙트가 나는것들은 묶어주고 한번에 처리한다!

    이걸 생각하면 될것 같아요😃

     

    간략하게 순수함수와 사이드이펙트에 대해 겉핥기를 했는데 저도 지금 막 배우는 중이라 더 성장해서 포스팅을 하겠습니다🙏🏻

    'Swift' 카테고리의 다른 글

    KeyPath  (0) 2021.09.04
    Dictionary.init(uniqueKeysWithValues:)  (0) 2021.08.31
    Safe Array  (0) 2021.07.24
    ReactorKit으로 계산기 구현하기  (0) 2021.07.05
    진수 변환  (0) 2021.05.27
Designed by Tistory.