3.1 클로저와의 만남
클로저는 자신의 외부 범위에서 변수를 캡처하는 함수로, 이 범위가 완료된 후에도 계속 작동하지. 즉, 클로저는 외부 범위에서 변수 값을 "기억"하고, 이 범위가 더 이상 활성이 아니더라도 계속 작업할 수 있다는 의미야.
클로저가 어떻게 작동하는지 이해하려면, 다음 예를 보자:
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
print(closure(5)) # 출력: 15
여기서 무슨 일이 일어나고 있는지 알아보자:
외부 함수 (outer_function)
: 이 함수는 x
라는 인수를 받아들이고, inner_function
이라는 내부 함수를 정의해. 이 내부 함수는 y
라는 인수를 받아 x
와 y
의 합계를 리턴해. inner_function
은 outer_function
내에서 호출되지 않고, 단지 선언될 뿐이야.
내부 함수 (inner_function)
: 이 함수는 outer_function
에서 리턴되며, outer_function
에 전달된 x
값에 대한 참조를 내부에 저장해.
클로저: 변수 closure
는 x
값(이 경우, 10)을 "기억"하고 호출 시 사용할 수 있는 클로저가 돼.
보통 처음부터 클로저로 제대로 작업할 수 있는 사람은 없지. 그럼 예제를 통해 클로저에 대한 이해를 높여보자.
3.2 클로저 사용 예제
함수 생성기 만들기
클로저는 값을 생성하는 함수-생성기를 만드는 데 사용될 수 있어.
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter = make_counter()
print(counter()) # 출력: 1
print(counter()) # 출력: 2
print(counter()) # 출력: 3
설명:
함수-생성기 (make_counter)
: 이 함수는 count
변수를 생성하고, 그 값을 증가시키고 리턴하는 내부 함수 counter
를 리턴해.
클로저: 함수 counter
는 count
변수의 상태를 저장하고 호출 시마다 이를 변경할 수 있어.
설정된 함수 만들기
클로저는 미리 정의된 설정으로 함수를 만드는 데 사용될 수 있어.
def make_multiplier(factor):
def multiplier(x):
return x * factor
return multiplier
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # 출력: 10
print(triple(5)) # 출력: 15
설명:
설정 함수 (make_multiplier)
: 이 함수는 factor
라는 인수를 받아들이고, 입력 값을 factor
로 곱하는 내부 함수 multiplier
를 리턴해.
클로저: 함수 double
과 triple
은 factor
의 고유 값을 저장하고 이를 곱셈에 사용하는 클로저야.
파라미터가 있는 데이터 필터링
클로저는 파라미터가 있는 필터링 함수를 만드는 데 유용해.
def make_filter(threshold):
def filter_func(value):
return value > threshold
return filter_func
filter_above_10 = make_filter(10)
data = [5, 10, 15, 20]
filtered_data = list(filter(filter_above_10, data))
print(filtered_data) # 출력: [15, 20]
설명:
필터 함수 (make_filter)
: 이 함수는 threshold
라는 인수를 받아들이고, 값이 이보다 큰지 확인하는 내부 함수 filter_func
를 리턴해.
클로저: 함수 filter_func
는 threshold
값을 저장하고 데이터를 필터링하는 데 사용해.
3.3 클로저의 장단점
클로저 사용의 장점
상태 캡슐화: 클로저는 전역 변수를 사용하지 않고도 함수 내 상태를 캡슐화할 수 있어, 코드의 가독성과 유지보수를 높여줘.
유연성: 클로저는 특정 설정이나 동작을 가진 함수를 생성하는 데 사용할 수 있어 코드가 더 유연하고 적응 가능해져.
함수형 프로그래밍: 클로저는 함수형 프로그래밍의 중요한 개념으로, 고차 함수나 다른 함수형 구조를 생성할 수 있어.
제한 사항 및 잠재적 문제
많은 장점에도 불구하고, 클로저는 몇 가지 제한 사항이 있어:
메모리 사용: 클로저는 더 이상 사용되지 않는 객체에 대한 참조를 유지할 수 있어 메모리 누수가 발생할 수 있어.
디버깅 난이도: 클로저는 코드의 디버깅을 어렵게 만들 수 있어, 왜냐면 변수의 상태가 명확하지 않을 수 있기 때문이야.
GO TO FULL VERSION