클로저 (Closure)

컴퓨터과학·AI
한 줄 정의: 함수가 자신이 만들어질 때의 주변 환경(변수)을 기억해서, 나중에 그 환경 밖에서 호출되어도 그 변수를 계속 사용할 수 있게 하는 프로그래밍 개념입니다.

쉽게 풀면

여행 가방을 쌀 때 필요한 물건을 미리 챙겨 넣으면, 집을 떠나 어디를 가더라도 가방 속 물건을 계속 꺼내 쓸 수 있습니다. 클로저도 비슷합니다. 함수 안에서 또 다른 함수를 만들면, 안쪽 함수는 자신을 감싸고 있던 바깥쪽 함수의 변수를 "가방에 담듯" 기억해 둡니다. 그래서 바깥쪽 함수의 실행이 이미 끝나버렸어도, 안쪽 함수는 여전히 그 변수 값을 꺼내 쓸 수 있습니다. 이 덕분에 "카운터를 하나씩 늘려주는 함수"나 "특정 설정값을 기억한 채 동작하는 함수"처럼, 상태를 몰래 간직한 함수를 만들 수 있습니다.

왜 중요한가

클로저는 상태를 전역 변수 없이도 함수 안에 안전하게 캡슐화할 수 있게 해주기 때문에, 프로그래밍 언어 설계와 소프트웨어 공학 논문에서 함수형 프로그래밍의 핵심 개념 중 하나로 자주 다뤄집니다. 이벤트 기반 시스템, 비동기 처리, 콜백 중심의 UI 프레임워크에서 각 콜백이 독립적인 상태를 유지해야 하는 경우가 많아, 클로저는 이러한 설계의 이론적 근거로 언급됩니다. 또한 정적 분석이나 컴파일러 최적화 연구에서는 클로저가 메모리 관리와 성능에 미치는 영향을 분석 대상으로 삼기도 합니다.

논문에서는 이렇게 쓰입니다

"제안한 이벤트 처리 모듈은 클로저(closure)를 활용해 각 콜백 함수가 자신이 생성될 당시의 설정 상태를 독립적으로 유지하도록 구현하였다."

이 문장은 여러 개의 콜백 함수를 만들 때, 각 함수가 서로 다른 설정값을 헷갈리지 않고 자기 것만 기억하도록 클로저 구조를 이용했다는 뜻입니다.

"본 시스템은 함수형 프로그래밍 패러다임을 채택하여, 상태 변경이 필요한 지점마다 클로저를 통해 지역 컨텍스트를 캡슐화함으로써 전역 상태 의존성을 최소화하였다."

전역 변수를 여러 함수가 공유하면 예상치 못한 부작용이 생기기 쉬운데, 그 대신 각 함수가 클로저로 자신만의 지역 상태를 갖도록 설계해 이런 문제를 줄였다는 뜻입니다.

"웹 프론트엔드 컴포넌트의 렌더링 로직에서는 클로저를 이용해 이벤트 핸들러가 컴포넌트 생성 시점의 props와 상태 값을 참조하도록 하였으며, 이는 비동기 렌더링 환경에서도 일관된 동작을 보장하였다."

UI 컴포넌트가 비동기적으로 다시 렌더링되더라도, 이벤트 핸들러가 클로저 덕분에 자신이 만들어질 당시의 값을 정확히 기억해 엉뚱한 값을 참조하지 않도록 했다는 뜻입니다.

조금 더 깊게 보면

클로저를 더 깊이 이해하려면 "렉시컬 스코프(lexical scope)"라는 개념을 함께 봐야 합니다. 이는 변수의 유효 범위가 함수가 호출되는 위치가 아니라 함수가 코드 상에서 정의된 위치에 따라 결정된다는 규칙으로, 클로저가 바깥 함수의 변수를 기억할 수 있는 근본적인 이유입니다. 논문에서는 이를 구현하기 위한 내부 구조로 "환경 레코드(environment record)"나 "자유 변수(free variable)"라는 용어가 함께 등장하기도 하며, 자유 변수란 클로저가 참조하지만 자신의 매개변수나 지역 변수는 아닌 바깥 스코프의 변수를 가리킵니다. 아울러 여러 클로저가 같은 바깥 변수를 공유하는 경우와, 각자 독립된 복사본을 갖는 경우의 차이는 언어별 구현 방식에 따라 달라질 수 있어, 관련 논문을 읽을 때는 대상 언어의 스코프 규칙을 함께 확인하는 것이 도움이 됩니다.

주의할 점

클로저는 "함수 자체"가 아니라 "함수 + 그 함수가 기억하는 주변 변수"를 합친 개념입니다. 단순히 재귀함수처럼 스스로를 반복 호출하는 것과는 다르며, 클로저가 변수를 계속 붙잡고 있으면 그 변수가 메모리에서 오래 해제되지 않아 메모리 사용량이 늘어날 수 있다는 점도 함께 알아두어야 합니다.

관련 용어