본문 바로가기
IT/Python

[파이썬] 클로저(Closure) 쉽게 이해하기

by 프론트엔드 지식백과 2025. 1. 12.

클로저는 함수 안에 또 다른 함수를 넣어서, 내부 함수가 바깥 함수의 변수를 기억하고 사용할 수 있도록 만든 기능이다.

이 글에서는 클로저가 무엇인지, 왜 함수 안에 함수를 넣어야 하는지, 그리고 실생활에 적용 가능한 예제를 통해 이해해 보겠다.

 

클로저란?

클로저는 함수 안의 함수로, 데이터를 안전하게 저장하고 관리할 수 있도록 도와주는 도구다.

바깥 함수의 변수가 사라진 이후에도, 내부 함수가 그 변수를 기억하고 계속 사용할 수 있게 한다.

마치 작은 상자 안에 데이터를 담아 두고, 필요할 때마다 꺼내 쓰는 방식이라고 생각하면 쉽다.

 

간단한 클로저 예제

학생의 점수를 기록하고 관리하는 프로그램을 작성한다고 가정해 보자. 아래는 클로저를 활용한 간단한 예제다:

def 점수_저장(이름):
    점수장 = []  # 점수를 저장할 상자

    def 기록하기(점수):
        점수장.append((이름, 점수))  # 이름과 점수를 저장
        return 점수장

    return 기록하기

 

  • 점수_저장은 학생의 이름을 받아서 점수를 저장할 수 있는 기록하기 함수를 만들어 반환한다.
  • 기록하기 함수는 점수를 받아서 점수장에 추가한다.
  • 이때, 기록하기는 점수장이라는 변수를 기억하고 계속 사용할 수 있다.

이제 위 코드를 사용해보자.

철수_기록 = 점수_저장("철수")  # 철수 전용 점수장 생성
영희_기록 = 점수_저장("영희")  # 영희 전용 점수장 생성

print(철수_기록(90))  # -> [("철수", 90)]
print(영희_기록(85))  # -> [("영희", 85)]
print(철수_기록(95))  # -> [("철수", 90), ("철수", 95)]

 

 

각각의 철수_기록과 영희_기록은 독립적인 점수장을 갖는다. 철수의 점수를 기록해도 영희의 점수는 영향을 받지 않는다.

 

 

그렇다면 함수 안에 함수를 꼭 넣어야 할까?

"기록하기" 같은 함수를 바깥에 따로 정의하면 안 되는지 궁금할 수 있다.

이제 두 함수를 따로 정의하는 방식과 비교해 보자.

 

1. 함수 분리 방식

아래는 두 함수를 따로 정의한 코드다:

점수장 = []  # 전역 변수로 점수장을 선언

def 점수_저장(이름, 점수):
    점수장.append((이름, 점수))
    return 점수장
 

이 방식을 사용하면, 모든 이름과 점수가 같은 점수장에 저장된다.

학생별로 데이터를 따로 관리하려면 추가적인 로직이 필요하다.

또한, 점수장이 전역 변수라, 실수로 데이터를 삭제하거나 잘못된 값을 추가할 위험이 있다.

점수_저장("철수", 90)  # -> [("철수", 90)]
점수_저장("영희", 85)  # -> [("철수", 90), ("영희", 85)]

 

 

 

2. 클로저 방식

클로저를 사용하면 점수장을 함수 내부로 숨기고 독립적으로 관리할 수 있다. 즉, 다른 학생의 데이터와 섞이지 않는다.

def 점수_저장(이름):
    점수장 = []  # 점수장을 함수 내부에 숨김

    def 기록하기(점수):
        점수장.append((이름, 점수))
        return 점수장

    return 기록하기

 

그리고, 클로저는 내부 함수가 바깥 함수의 변수를 기억할 수 있는 기능을 제공한다.

-> 여기서 핵심은 내부 함수인 기록하기가 바깥 함수의 변수 점수장을 기억한다는 점이다. 이를 클로저라고 부른다.

이 기능 덕분에 내부 함수는 바깥 함수의 데이터에 계속 접근할 수 있다.

728x90