안녕하세요 :) Zedd입니다.
저번에 <let us:Go! 3번째 세미나>에서 곰튀김님이 설명해주신 "Functional Reactive Programming 패러다임"을 듣고...
아 사람들이 그렇게 리액트, 리액트 하는지..그 리액트가 어떤건지 감을 잡게 되었어요.
곰튀김님이 사용하신 슬라이드는 여기에 올라가 있으니!! 꼭 한번 보세요.. 얼른 Realm에도 강의 영상이 올라왔으면 좋겠습니다 ㅠㅠ
일단 차근차근히 공부하려고 합니다 :)
바로 RxSwift공부를 하는 것 보단..일단 Reactive programming에 대한 개념을 확실히 잡고 가는것이 훨씬 도움이 될 것 같아서 :)
Reactive programming이란?
Reactive programming이 뭐냐??
또, Rx는 뭐지????!
리액티브 프로그래밍을 처음 접하시는 분들에게는 정말 어려울 거라고 생각합니다.
먼저 개념을 확실히 잡고 갑시다.
Reactive programming이 뭔지는 모르겠는데!!!!!!!1일단
Reactive programming != Rx입니다.
Rx는 Reactive programming을 가능하게 해주는 API같은 거에요.
이름도 Reactive Extension의 약어랍니다.
그럼!!! RxSwift는 뭘까요.
네. 방금 Rx가 뭔지 배웠죠? Swift에서 Reactive programming을 가능하게 해주는 API같은, Extension같은 아이죠.
RxSwift이외에도, RxJava, RxJs...등등 다양한 언어들이 있답니다.
어..그럼 Rx는 Reactive programming을 가능하게 해주는 아이구나.
그럼 그 Reactive programming이 뭐지?
Reactive programming.
간단하게 말하면 "패러다임"이에요.
우리 OOP많이 들어봤죠?
object-oriented programming
즉, 객체지향 프로그래밍이죠.
우리도 처음 OOP를 들었을 때, 이게 뭔지 몰랐죠?
배우고 나니까
아, 모든 데이터를 오브젝트(object)로 취급하여 프로그래밍 하는 방법이구나..라는 것을 알았죠. (네이버 지식백과)
아무튼 Reactive programming도 OOP와 같은 "패러다임"이에요.
~~~~런 방법으로 프로그래밍을 하자.
이런거죠.
자. 우리는 Reactive programming이 뭔지는 아직까진 모르지만, 어떠한 패러다임이라는 것은 알았어요.
그리고 Rx가 뭔지도요!!
이제 본격적으로 Reactive programming이 뭔지 보면 좋겠지만,
Reactive programming을 보기 전에, Functional programming을 아셔야 합니다.
즉, 함수형 프로그래밍이죠.
함수.
인풋을 넣으면 어케어케해서 아웃풋이 나오죠.
이 Functional programming이랑 Reactive programming이랑 무슨상관이냐면,
Reactive programming이 Functional programming을 활용하기 때문입니다.
그럼 Functional programming을 제대로 한번 보도록 합시다.
Functional programming(함수형 프로그래밍)
"함수형 프로그래밍"이라고 할게요!
자....함수형 프로그래밍이 뭔지 알려면,zzzzzzzz
명령형(imperative) 프로그래밍이 뭔지 알아야합니다.
명령형 프로그래밍이 뭔지 아시나요?
네. 그냥 이름 그대로 "명령"하는 식으로 프로그래밍하는거에요.
스택오버플로우에서 좋은 예제를 봤어요 :)
<명령형 프로그래밍으로 냉장고에 우유 사서 넣기>
- 시작
- 당신의 주머니에 열쇠 배열을 유지하기위한 공간을 만드십시오.
- 주머니에 열쇠배열을 넣으십시오.
- 차고에 가십시오.
- 차고를 엽니다.
- 차에 탑니다.
.
.
.
-우유를 냉장고에 넣습니다.
- 끝
이렇게 하나하나 시간순서대로 명령하는 식으로 프로그래밍하는게 명령형 프로그래밍이에요.
명령형 프로그래밍의 반댓말은 선언형 프로그래밍입니다.
선언형 프로그래밍으로 우유를 사러 가봅시다.
<선언형 프로그래밍으로 우유사기>
- 유당을 소화하는데 문제가 없다면, 우유는 건강 음료입니다.
- 일반적으로 냉장고에 우유를 저장합니다.
- 냉장고는 물건을 시원하게 유지하는 상자입니다.
- 상점은 상품이 판매되는 장소입니다.
- "판매"란 돈을 위해 사물을 교환하는 것을 의미합니다.
- 또한 사물 교환을 "사기(buying)"라고합니다.
명령형 프로그래밍은 프로그래머가 실행될 알고리즘을 명시해줬죠. 대신 목표는 명시하지 않습니다.
그에반해 선언형 프로그래밍은 목표를 명시하고 알고리즘을 명시하지 않았죠.
명령형 프로그래밍은 단계별로 어떻게 해야할지에 포커스를 두죠.
선언형 프로그래밍은 "이게 내가 원하는거야. 이제 어떻게 할것인가?"에 포커스를 둡니다.
명령형 프로그래밍과 선언형 프로그래밍의 차이를 조금 아시겠나요?
함수형 프로그래밍을 설명하다가 이까지 와버렸는데, 함수형 프로그래밍은 선언형 프로그래밍의 하위 카테고리입니다. ( 함수형 프로그래밍 ⊂ 선언형 프로그래밍)
이제 함수형 프로그래밍이 뭔지 알아봅시다.
함수형 프로그래밍을 정말 간단하게 말하면, 함수를 사용하는 프로그래밍이죠.
간단해보이죠?
함수형 프로그래밍에는 특징이 여러가지가 있습니다.
이제부터 그걸 살펴볼거에요.
무서워하지마세요!!! OOP에도 여러 특징들이 있었죠? 뭐 캡슐화라던가 다형성이라던가...
그냥 함수형 프로그래밍에도 있는것 뿐이에요.
살펴봅시다.
함수형 프로그래밍의 정의?는
"자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다" - 출처 위키백과
이해하기에는 조금 어려운 말 일수도 있는데, 가변데이터를 멀리한다는 말에 집중하시면 될 것 같습니다.
명령형 프로그래밍에서는 할당(assignment)으로 데이터의 상태를 바꿨죠? 즉 데이터가 "변한다"는 것입니다.
하지만 함수형 프로그래밍은 이렇게 변하는 데이터를 멀리한다는 거죠.
그래서 나온 함수형 프로그래밍의 특징 중 하나가 immutable data입니다.
즉, 변하지 않는 데이터인거죠.
순수 함수형 프로그래밍에서는
x = 1
이라고 정의한 후에는
x = 2라고 하면 에러가 나게 됩니다.
즉, 상태를 바꾸지 못하는것이죠.
그럼 순수함수형 프로그래밍에서는 어떻게 하냐?
그냥 하나 더 만들자에요.
x = 2라고 상태를 바꾸는 대신, 2라는 상태를 저장할 다른 변수를 만드는 식입니다.
또 하나의 특징, 바로 순수함수(pure functions)인데요.
순수함수란, 부작용(side-effect)이 없는 함수, 즉, 함수의 실행이 외부에 영향을 끼치지 않는 함수를 뜻합니다.
- 순수함수는 입력으로 주어진 것 외의 연산은 실행 하지 않음
- 순수함수는 부수효과(side effect)가 없어야 함
- 입력이 동일하면 출력이 동일해야함
- 상태의 변화가 없어야함
순수함수는 위와같은 특징을 가지고 있는데요, 말로하니까 잘 모르겠네요.
아래 예제를 봅시다.
var arr = ["Zedd","Mary"]
func impureFunction(name:String){
arr.append(name)
}
impureFunction(name: "Neil Perry")//["Zedd", "Mary", "Neil Perry"]
위 함수는 순수함수일까요 아닐까요?
네. 아닙니다.
일단. arr의 "상태"를 변화시킵니다. 즉 Side Effect가 발생하는것이죠.
입력이 동일하면 출력이 동일할까요?
저기서 다시한번
impureFunction(name: "Neil Perry")
를 하게되면,
출력은
["Zedd", "Mary", "Neil Perry", "Neil Perry"]
가 되겠네요.
함수를 실행함으로써 외부에 영향을 주게 되므로 순수하지 않는 함수죠.
그럼 순수한 함수는 뭘까요?
func calculate(num1: Int, num2: Int) -> Int {
return num1+num2
}
calculate(num1: 1, num2: 2)//3
calculate(num1: 1, num2: 2)//입력이 동일하니 여전히 3
calculate(num1: 2, num2: 10)//12
위 함수는 순수함수라고 할 수 있습니다.
상태를 변화시키지도 않고, 동일한 입력에 동일한 출력을 가져다주니까요.
당연히 Side Effect는 존재하지않습니다.
그 다음 특징. 바로 익명함수(anonymous function)
Swift에는 closure가 있죠! closure자체가 이름이 없는 함수입니다.
({() -> Void in
print("Hello, World!")//Hello, World!
})()
마지막 특징은 고차함수입니다.
역시나 Swift의 map, filter, reduce가 고차함수로 존재하죠.
var arr = [1,2,3,4,5]
var sol = arr.map{$0*2}.filter{$0%2==0}.reduce(0, +)
print(sol)//30
Reactive programming이야기 하다가 이까지 와버렸는데요,
다시한번 말씀드리지만, Reactive programming이 함수형 프로그래밍을 활용하기 때문에
함수형 프로그래밍을 설명드렸습니다.
- 데이터는 immutable하게 취급하자
- 데이터 변경이 필요할 때는 새로 만들자
- Side-Effect를 없애기 위해서 Pure Function(순수함수)을 사용하자.
- Function들의 Composition과 High-Order Function(고차함수)으로 프로그램을 만들자.
- Data가 아닌 Process에 집중해서 프로그램을 만들자
입니다.
본격적인 Reactive programming의 설명은 다음글에서 할게요 :)
도움이 되었길 바래요 XD
그리고!!!!위 내용 중 틀린게 있을 수도 있습니다.
만약 틀린부분이 있거나, 지적할 부분 등이 있다면 꼭!!!!! 댓글이나 PC화면 오른쪽 하단에있는 "Zedd와 대화하기"를 눌러 메세지를 보내주시면 정말 감사하겠습니다.
참고한 사이트들 :