시그마 삽질==six 시그마

클로저 Closure (computer programming) 본문

프로그래밍/Programming stuff

클로저 Closure (computer programming)

Ethan Matthew Hunt 2020. 3. 4. 00:10

 

Wikipedia에서 말하는 클로저 정의

 

In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment.[1] The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.[b] Unlike a plain function, a closure allows the function to access those captured variables through the closure's copies of their values or references, even when the function is invoked outside their scope

 

1. 클로저란 

 

 

자신이 정의된 문맥으로부터 상수와 변수의 값을 캡처하거나 레퍼런스를 저장하는 형태

 

변수나 상수가 선언된 위치에서 참조를 획득하고 저장하는 형태. 이를 변수나 상수의 클로징이라함.

 

2. 클로저 3가지 형태

1)전역함수:이름이 있으며,주변환경에서 캡처한 어떤 값도 없는 전역함수의 형태

   var f = function(){}


2) 중첩함수: 이름이 있으며 자신을 둘러싼 함수로부터(==다른 함수 내부의) 값을 캡쳐할 수 있는 중첩된 함수의 형태

(내부함수에서 외부함수의 변수를 캡쳐해서 자신의 함수내부로 가져오는것(closing)하는것)

 

  var f = function(){
   function f2(){}

  }

 

function closure(){
 var  k= 100;

    function internal(){
       return ++k;
   }

 return internal;
 
}	

var a1= closure();
var a2= closure();

console.log(a1());  //101  var m1= a1()  101
console.log(a1());  //102  var m2= a1()  102
console.log(a2());  //101  var m3= a2()  새로운 function

 

 

이처럼 외부 함수에서 정의된 객체가 만약 내부 함수에서도 참조되고 있고 이 내부 함수가 반환되어 참조가 유지되고 있는 상태라면 클로저에 의해 내부 함수 주변의 지역 변수나 상수도 함께 저장됩니다. 정확히는 지역 변수의 값이 저장되는 것이라 할 수 있죠. 이를 값이 캡쳐되었다라고 표현합니다. 값의 캡쳐는 문맥에 포함된 변수나 상수의 타입이 기본 자료형이나 구조체 자료형일 때 발생하는데 이러한 캡쳐 기능은 클로저의 고유 기능중 하나입니다.

-꼼꼼한 재은 씨의 스위프트 3 기본편에서 발췌-

(재은님 책 구매는 요기를 클릭)

 



3) 이름이 없으며 주변 환경으로부터 값을 캡쳐할 수 있는 축약문법으로 작성된 형태.(익명) 

 

-Object C의 블록 && 자바스크립트의 익명함수 && 자바,파이썬,Lisp의 람다식 && swift의 클로저(스위프트 협의의 클로저)

 

  ()->{}

 

// 코드 15-8 맵, 필터, 리듀스 메서드의 연계 사용 
let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7] 

// 짝수를 걸러내어 각 값에 3을 곱해준 후 모든 값을 더합니다. 
var result: Int = numbers.filter{ $0 % 2 == 0 }.map{ $0 * 3 }.reduce(0){ $0 + $1 } 

print(result) // 36 

// for-in 구문 사용 시 
	result = 0 

for number in numbers { 
    guard number % 2 == 0 else { 
        continue 
    } 
    result += number * 3 
} 

print(result)   // 36

-스위프트 프로그래밍 야곰님 예제 발췌-

(야곰님 책 구매는 요기를 클릭)

 

 

 

'프로그래밍 > Programming stuff' 카테고리의 다른 글

애플리케이션 아키텍처와 객체지향  (0) 2020.04.12
우아한 객체지향  (0) 2020.04.11
모나드(Monad)  (0) 2020.03.04
함수형 프로그래밍  (0) 2020.03.03
일급객체(First-class citizen)  (0) 2020.03.03
Comments