클로저는 함수 안에 또 다른 함수를 넣어서, 내부 함수가 바깥 함수의 변수를 기억하고 사용할 수 있도록 만든 기능이다.
이 글에서는 클로저가 무엇인지, 왜 함수 안에 함수를 넣어야 하는지, 그리고 실생활에 적용 가능한 예제를 통해 이해해 보겠다.
클로저란?
클로저는 함수 안의 함수로, 데이터를 안전하게 저장하고 관리할 수 있도록 도와주는 도구다.
바깥 함수의 변수가 사라진 이후에도, 내부 함수가 그 변수를 기억하고 계속 사용할 수 있게 한다.
마치 작은 상자 안에 데이터를 담아 두고, 필요할 때마다 꺼내 쓰는 방식이라고 생각하면 쉽다.
간단한 클로저 예제
학생의 점수를 기록하고 관리하는 프로그램을 작성한다고 가정해 보자. 아래는 클로저를 활용한 간단한 예제다:
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 기록하기
그리고, 클로저는 내부 함수가 바깥 함수의 변수를 기억할 수 있는 기능을 제공한다.
-> 여기서 핵심은 내부 함수인 기록하기가 바깥 함수의 변수 점수장을 기억한다는 점이다. 이를 클로저라고 부른다.
이 기능 덕분에 내부 함수는 바깥 함수의 데이터에 계속 접근할 수 있다.
'IT > Python' 카테고리의 다른 글
[파이썬] 클래스 관련 용어, 객체 인스턴스 차이 쉽게 이해하기 (0) | 2025.01.15 |
---|---|
[파이썬] 람다 함수(Lambda) 쉽게 이해하기 (0) | 2025.01.14 |
[파이썬] 이터레이터 이터러블 차이 쉽게 이해하기 (0) | 2025.01.11 |
[장고] SSL 인증서 구매, runsslserver로 적용 (0) | 2022.05.04 |
[DSAC M1] DataFrame, Series 정리 (0) | 2021.08.19 |