[Swift] 내가 생각하는 자바스크립트와 스위프트 클로저의 차이

클로저

내가 클로저를 처음 접한게 자바스크립트 였었는데, 자바스크립트의 경우 클로저를 표현할때 캡쳐 여부를 중요하게 생각 했고 나도 캡쳐 여부에 따라서 클로저를 판단했다. 그리고 Objective-C로 개발을 하면서 블록함수를 사용하고 블록함수 표현 전에 __block 변수를 사용하여 클로저처럼 사용하고 있다고 생각했다. 하지만 스위프트를 공부하면서.. 왜 스위프트는 익명함수까지 클로저라고 표현하는걸까? 라는 의구심이 들었다. 그래서 내가 이해한 스위프트의 클로저를 적어 보겠다. 밑에서 부터는 본인의 생각이 많이 들어가 있음..

일반적인 클로저의 경우

내가 클로저에 대해 검색하다 찾은 이분 블로그의 내용을 보면

람다 표현식에서 사용하는 변수들이 모두 묶인 변수일 때 닫힌 람다식이라고 부른다. 그리고 람다 표현식에서 사용하는 변수들 중 하나라도 자유 변수가 있을 때 열린 람다식이라고 부른다. …클로저는 바로 열린 람다식을 닫힌 람다식으로 만드는 것이다.

이라고 설명하고 있다. 한마디로 클로저는 열린 람다를 닫힌 람다로.. 결국 캡쳐 기능을 지원해야 한다고 볼수 있다.

자바스크립트와 스위프트 클로저의 차이

  • 자바스크립트
    1. 내가 이해한 자바스크립트는 익명함수와 클로저를 분리해서 표현한다.
    2. 자바스크립트의 경우 변수 선언이 자유롭다.
    3. private변수라는 개념이 없고(class자체가 없다), 변수 선언은 모두 전역 변수이다.(심지어 타입 선언 없이 변수에 값을 대입하면 전역 변수다.)
    4. 이 때문에 함수 객체를 클래스처럼 표현하기 위해 private변수를 클로저를 통해서 사용한다.

자바스크립트는 일반 함수에서 이미 전역변수를 사용하고 있고(사실 클로저일듯), 익명 함수를 사용하더라고 변수 자체가 이미 전역 변수이기 때문에 익명함수에 클로저를 사용해도 캡쳐라고 느껴지지 않는것 같다.

하지만 스위프트에서는 익명함수와 클로저를 모두 클로저라고 표현한다. 스위프트의 클로저에 대해 외국사이트에서 이런 표현을 보게 되었다.

스위프트 클로저는 익명 함수 이고, 변수로 저장 되고, 나중에 호출 이 가능하고, 프로그램의 상태 기억 를 기억

역시 자바스크립트의 익명함수랑은 차이가 없는데…-_-;; 라고 생각 되지만.. 프로그램의 상태 기억 부분(캡쳐)에서 스위프트는 캡쳐기능이 지원만 한다면(현재 변수에 대한 캡쳐가 없더라도) 클로저라고 생각하는것 같다. 그러나 자바스크립트는 어차피 전역 변수라서 익명함수를 사용하는 부분을 캡쳐한다고 말하기 보다는.. 실제 캡쳐 현상이 일어나는 시점을 클로저라고 말하는것 같다.

너무 두서없이 적었는데..-_-;;; 혼자 자바스크립트와 스위프트의 개념에 대해 정리하다보니 차이가 생기는 부분을 어떻게든 정리하고 싶었네요..
결론을 얘기 하자면…

스위프트 자바스크립트
- 클로저 기능이 있으면 무조건 클로저 - 클로저를 사용하는 시점을 클로저라고 표현

더 확실한 구별법(?)이 있으면 알려주세요..

참고

https://hyunseob.github.io/2016/09/17/lambda-anonymous-function-closure/ https://www.hackingwithswift.com/example-code/language/what-is-a-closure

태그:

카테고리:

업데이트:

댓글남기기