[Swift문법] 클로저(Closure)를 이해하기위해 꼭 알아야하는 한가지

안녕하세요 한글링의 루시입니다 🙂
기존에 운영하던 개인블로그 호스팅이 곧 종료가 되어 한글 블로그는 더 이상 운영하지 않을 생각이에요!
그래서 기존의 글들이 아까워 한글링에 옮겨 놓겠습니다 ㅎ.ㅎ

[Swift문법] 클로저(Closure)를 이해하기위해 꼭 알아야하는 한가지

제가 처음 클로저를 딱 봤을때 드는 생각이

“너는 어느별에서왔니?다시 돌아가주면 안되겠니??”

많은 사람들이 스위프트를 배울때 겪는 고비가 여러가지 있는데 그중 하나가 클로저라고 생각됩니다?

우리가 ?스위프트게임?을 무사히 완수하기 위해?클로저?라는 보스를 정복해야하는데 이 보스는 생각보다 꽤 쎕니다

레벨이 낮은 상태로 도전했다가 사망?합니다 정신건강에 문제가 생길 수도 있어요

하!지!만! 모든 게임이 그렇듯 낮은 레벨을 커버해주는 건 끝내주는아이템이잖아요?
불변의진리죠? 그럼 득템하러 가볼까요?

제가 처음 클로저를 딱 봤을때 드는 생각이

“너는 어느별에서왔니?다시 돌아가주면 안되겠니??”

많은 사람들이 스위프트를 배울때 겪는 고비가 여러가지 있는데 그중 하나가 클로저라고 생각됩니다?

우리가 ?스위프트게임?을 무사히 완수하기 위해?클로저?라는 보스를 정복해야하는데 이 보스는 생각보다 꽤 쎕니다

레벨이 낮은 상태로 도전했다가 사망?합니다 정신건강에 문제가 생길 수도 있어요

하!지!만! 모든 게임이 그렇듯 낮은 레벨을 커버해주는 건 끝내주는아이템이잖아요?
불변의진리죠? 그럼 득템하러 가볼까요?

?클로저(Closure)를 이해하기위해 꼭 알아야하는 한가지

스위프트언어는 객체지향언어이자 동시에 함수형 언어입니다

클로저는 스위프트가 함수형 언어라고 불리는 이유라고 해도 과언이 아닌데,

그래서 이 클로저를 이해하기위해서는 함수형 프로그래밍에 대한 이해가 필요합니다!

?함수형프로그래밍

함수형 프로그래밍의 첫번째 특징! 기존의 사고방식을 바꿔야합니다 대입문을 갖다버리고 오세요
이게 무슨 말이고 하니 바로 코딩으로 한번 볼까요?

위의 함수는 우리가 늘 봐왔던 모습인데 밑에 있는 요상한 아이는 뭘까요?

근데 이 둘은 똑같이 “안녕하세요”를 프린트하고 있습니다! 와우?

뒤의 아이는 클로져 표현식으로 선언되어있는데 이름이 없죠? 그래서 익명함수라고도 합니다

제가 왜 대입문을 버리고 오라는지 이해하셨나요?

함수형 프로그래밍은 단적으로 말하자면, 대입문 없이 프로그래밍을 하는 것입니다

그러니까,

앞에 대입문 없이 뒤의 문법으로 똑같은 값을 반환하도록 할 수 있습니다

**Void 와 ()는 서로 동일합니다

typealias Void = ( ) 로 선언되어있습니다!

대입을 해서 어떠한 값을 할당하고 반환받고…우리가 늘 생각했던 사고방식과 다르죠?

이 사고 방식을 가지고 클로저한테 덤빈다면 엄청 뚜드려 맞을 수 있어요?

함수형 프로그래밍의 두번째 특징! 참조투명성referential transparency

참조 투명성은 정의를 가지고 있는 문장의 어디에서나 동일한 단어라면 그 단어를 서로 맞바꾸어 놓아도 그 문장이 가지고 있는 원래 의미가 절대 변하지 않는 것을 의미한다.

그러니까, f(x) = x + 1  이라고 할 때

y = f(x)   + 1 는  y =  x + 1 + 1 은 다른 문장인가요? 아니죠! 이 식이 가지고 있는 원래의미가 절대 변하지 않습니다

메모리의 관점에서 본다면, 한번 값이 할당된 메모리 위치에는 새로운 값을 다시 할당하지 않는 것이 참조 투명성의 필수 조건이 입니다. 이러한 필수 조건이 만족된다면,  어떤 함수를 수없이 호출(콜백)하더라도, 항상 동일한 결과값을 얻게 됩니다. 프로그램이 사용하는 컴퓨터 메모리의 값이 프로그램이 실행되는 동안에는 절대 변하지 않죠.

대입문이 없으니 메모리에 적재가 되는 것이 아니고 말그대로 불러오는것!(콜백하는것!)입니다.

즉, 함수를 호출할 때 몇 백번을 호출하든지에 관계없이 항상 동일한 결과값을 얻게된다는 이야기입니다. 이 말은 결국 f(x) 이라는 함수 호출 부분이 어디에 있든지, 몇번을 호출하든지 상관없이, 이 함수의 결과값으로 대체할 수 있다는 것을 의미합니다

?그래서 그게뭐 어쨌다고?

사실 이제 나오는 설명에 가장 중요합니다!

클로져를 사용하는 이유는 멀티스레드때문입니다. 즉, 스레드가 하나가 아니란 말이죠. iOS의 메인스레드는 UI와 관련된일을 순서대로 처리합니다.

만약에 네트워크를 처리해야할 때, 네트워크가 연결될 동안 놀고 있는 것이 아니라 다른 것들을 준비하고 있어야 합니다. 이때 클로져가 필요한데 네트워크를 불러오는게 끝났다면 그 시점부터 바로 다음 것을 실행시키도록 불러옵니다(callback)
11

**스레드(thread): 어떠한 프로그램 내에서 특히 프로세스 내에서 실행되는 흐름단위를 말함

클로져는 주로 콜백함수로 사용하는데, 131030개의 프로세서들이 서로 먼저 이 메모리 값을 사용하려고 한다고 한다면? 콜백 함수가 불러질 때마다 다른 메모리에 적재된다면? ?????? 말안해도 아시겠죠?

메모리의 어떤 위치에 맨 처음 한번만 값을 할당하고 프로그램이 실행되는 동안 이 값을 변경하지 않는다면, 131030개의 프로세서들이 서로 먼저 이 메모리 값을 사용하려고 한다 할지라도 우리는 더이상 신경쓸 필요가 없겠죠.

그렇기 때문에 클로져를 쓰는 겁니다!

 

?클로저를 사용하면 얻을 수 있는것

-엄청나게 간결한 코드

-엄청난 자유도 (I’m GOD!!!?)

-엄청난 개발자가 된 것같은 느낌적인 느낌

 

?클로저를 사용하면 잃을 수 있는것

-정신건강

-코드의 가독성

이제 득템도 했으니 보스몹을 잡으러가볼까요 ?
?블로그: 함수형 프로그래밍이란 무엇인가?

?그림출처

?블로그: [번역]함수형 프로그래밍의 기초 
?현재 게시물은 Swift2.1을 기준으로 하고 있습니다

  • GangyeolKim

    감사합니다 덕분에 덜 뚜드려맞게 된것 같습니다^^