Python(파이썬)_점프 투 파이썬/파이썬 날아오르기

클로저와 데코레이터

study note 2025. 9. 15. 23:49
반응형

❰클로저와 데코레이터❱

-클로저와 데코레이터에 대해 배워봅시다!

 

▶클로저란?

클로저(Closure)함수 안에서 함수를 정의하고, 내부 함수가 외부 함수의 변수를 기억하여 사용하는 구조입니다.

즉, 함수 안의 함수가 바깥쪽 함수의 변수를 기억하는 기능입니다.

클로저는 3가지 조건을 만족해야합니다.

①내부 함수가 존재 해야합니다.

②내부함수는 자유변수(외부함수의 변수)를 참조해야 합니다.

③외부 함수는 내부 함수를 반환 해야합니다.

비유
장난감 상자(바깥 함수)가 있고 그 안에 장난감(변수)들이 있습니다. 상자를 들고 다른 방(다른 함수)으로 이동해도, 상자안의 장난감은 변동되지 않고 그대로 따라오는데 이게 클로저 입니다.

 

예시 코드로 클로저에 대해 이해 해보겠습니다.

위 예제를 통해 다시 한번 설명 하면

상자(외부 함수)가 만들어질 때 그 안에 담긴 장난감(자유 변수)을 영원히 기억하는 기능이며,

상자(외부 함수) make_multiplier(2)처럼 클로저를 생성하는 함수 자체이며, 이 함수는 실행이 끝나면 사라지지만, 이 함수가 반환하는 함수(클로저)상자 안의 내용물(장난감)을 기억합니다.

장난감(자유 변수) x처럼 외부 함수에 속해있던 변수이며 클로저가 만들어질 때 이 변수의 값이 클로저에 묶이게 됩니다.

따라서, 한 번 만들어진 클로저 times_two = make_multiplier(2)처럼 특정 상자의 내용물(자유 변수 값)을 고정하게 됩니다. 이 상태에서 times_two(5)를 호출하면, 상자 안의 장난감(2)은 바뀌지 않고, 새로운 장난감(5)을 가지고 놀아서(2 * 5) 새로운 결과(10)를 만들어냅니다.

상자의 개수는 클로저의 개수를 의미하고, 상자 안의 장난감 수는 클로저 내부 함수에 전달되는 인자를 의미합니다. 따라서 times_two라는 상자 한 개를 만들면, 그 안의 장난감 x의 값은 2로 고정됩니다. 이후 times_two(10)을 호출하든, times_two(100)을 호출하든 상자 자체(times_two)와 그 안의 고정된 장난감(x=2)은 변하지 않습니다.

 

이처럼 함수가 종료 된 후에도 자유변수(x)에 입력된 '2'를 기억하는 함수를 클로저라 부릅니다.

 

이 클로저는 상태를 기억하는 함수를 만들 때 유용하며, 특히 콜백 함수데코레이터를 구현할 때 많이 사용됩니다.

 

▶데코레이터란?

데코레이터(Decorator)함수를 감싸서 새로운 기능을 추가하는 기법입니다.

즉, 기존 함수를 수정하지 않고 추가 기능을 덧붙이는 방법을 의미 합니다. 

다른 함수들과 다르게 @기호를 사용하여 함수를 꾸미는 역할을 합니다. 

이를 통해 함수의 시작과 끝에 로그를 남기거나, 실행 시간을 측정하는 등 부가적인 기능을 쉽게 추가할 수 있습니다.

비유
선물을 예쁜 포장지(데코레이터)로 포장 해주는 것 과 같습니다. 선물(기존 함수)는 그대로인데, 포장지(데코레이터) 덕분에 특별한 느낌을 줍니다.

 

데코레이터의 가장 흔한 예시인 함수의 실행 시간 측정으로 코드를 확인해보겠습니다.

위 예제에서 @timer가 바로 데코레이터입니다. say_hello 함수 위에 @timer를 붙이면, say_hello 함수가 호출될 때 timer 데코레이터가 자동으로 실행되면서 실행 시간을 측정하는 기능이 추가됩니다.

데코레이터는 클로저의 원리를 이용해 만들어집니다. timer 함수는 say_hello 함수를 인수로 받아 wrapper라는 내부 함수(클로저)를 반환합니다. 이 wrapper 함수는 say_hello 함수를 호출하는 동시에, 앞뒤로 추가적인 기능을 수행하는 것입니다.

 

정리하면 

클로저는 함수가 자유 변수를 기억하는 기능이고 데코레이터는 클로저를 활용해 기존 함수에 추가 기능을 덧붙이는 기능입니다.

 

이것으로 클로저와 데코레이터에 대한 설명을 마치겠습니다.

고생하셨습니다~😄

 

📘 참고:
《Do it! 점프 투 파이썬 (전면 개정 2판)》, 박응용 저, 이지스퍼블리싱, 2023
※ 본 글은 위 교재의 내용을 학습 및 정리 목적으로 요약/재구성한 글입니다.

 

반응형