본문 바로가기
프로그래밍 언어

클로저 (Closure)

by Jo_Wick 2025. 11. 3.
반응형

클로저(closure)는 “자신이 선언된 환경(scope)에 있는 변수들을 기억하는 함수 객체”이다.

 

클로저(Closure) = 함수 + 함수가 만들어질 때의 환경(스코프)을 함께 기억하는 것

 

클로저는 함수함수가 만들어질 때의 환경에서 결합된 경우를 뜻하기 때문에 보통 함수형 언어에서 많이 사용한다.

 

클로저 사용 이유

1. 전역 변수 사용 억제

2. 정보의 은닉

 

 

1. 전역 변수 사용 억제

전역 변수의 사용 빈도를 줄이면 코딩을 할 때 안정성이 훨씬 높아진다. 애초에 전역 변수는 누구나 쉽게 접근, 변경이 가능하기 때문에 위험하다. 이는 의도치 않게 값이 변경될 수 있다는 것을 의미한다. 만약 누군가에 의해 의도치 않게 전역 변수의 값이 변경된다면 오류로 이어진다.

 

2. 정보의 은닉

굳이 private으로 선언을 할 필요 없이 아무나 쉽게 접근할 수 없는 환경을 만들기 때문에 코드의 안정성이 높아진다.

 

 

단점으로 이미 스코프가 끝난 변수들을 기억해야 하기 때문에 성능에 영향이 있기는 하다.

 

 

 

자바 스크립트 예시

function makeAdder(x) {
    return function(y) {
        return x + y; // 외부 변수 x 기억
    };
}

const add5 = makeAdder(5);
console.log(add5(10)); // 15

 

const add5 = function(y) {
    return 5 + y;
};

 

console.log(add5(10)); // 15

 

y = 10, 그리고 x는 클로저로 기억된 5
→ return x + y
→ return 5 + 10
→ 15

 

 

C++ 예시

 

람다 함수

#include <iostream>
#include <functional>
using namespace std;

function<void()> makeCounter() {
    int count = 0;
    return [=]() mutable {
        count++;
        cout << "현재 count: " << count << endl;
    };
}

int main() {
    auto counter = makeCounter();
    counter(); // 1
    counter(); // 2
    counter(); // 3
}

 

함수 객체

#include <iostream>
using namespace std;

struct Counter {
    int count = 0;
    void operator()() {
        count++;
        cout << count << endl;
    }
};

int main() {
    Counter c;
    c(); // 1
    c(); // 2
}
반응형

'프로그래밍 언어' 카테고리의 다른 글

정렬의 원리? 기준?  (0) 2025.10.04
로케일(Locale)이란?  (0) 2025.10.01
타입 승격 (Type Promotion)  (0) 2025.09.21
버퍼링 (Buffering)  (0) 2025.09.19
스트림 (Stream)  (0) 2025.09.19

댓글