클로저라는 개념을 올바르게 이해했는지 확인하고자 문의드립니다.
"함수 counter()를 변수C에 저장함으로써
함수 호출이 끝나도 환경정보(지역변수 등)은 소실되지 않고
변수C를 통해 유지(보존)되고
변수C를 for로 반복호출해도
counter()의 마지막 호출시점의 환경정보를 불러오고
counter()내부 함수인 count()를 동작시켜 결과값을 환경정보에 반영하고 외부로 반환(return)한다."
살짝 드는 느낌은
함수를 변수C라는 공간에 가상화 환경으로 구축한 느낌인데
내용을 잘못 이해했거나 틀렸다면 지적 부탁드립니다.
상단 고정글을 참고해서 직접 코드를 단계별로 실습하면서 보는 게 이해에 더 도움이 됩니다.
추상적으로 이해하기보단 시각화 도구를 사용해서 자세히 이해하고 싶은 부분을 살펴보는 게 좋습니다.
연습문제 답안을 시각화도구에 넣고 과정을 확인했습니다.
클로저 개념을 제대로 이해를 못한 상태에서
시각화도구 결과를 토대로
클로저 개념을 끼워맞춰가며 도출했기에
올바르게 이해한 건지 질문을 드렸던 것입니다.
다른 질문을 검색해보니 실무에 크게 쓰이지 않는다하니
스스로 이해한대로 숙지하고 넘어가겠습니다.
일단 답변은 감사합니다.
클로저는 지역 변수와 코드를 묶어서 함수로 생성해서 사용할 때 사용합니다.
데이터와 엮이는 함수'만' 만들 때 사용합니다.
하지만, 클래스가 더 유용한 구조이기 때문에 클로저 자체의 활용성은 낮습니다.
클래스는 데이터 + 함수들을 묶어서 구성하니까 클래스를 더 자주 사용합니다.
def counter():
i = 0
def count():
nonlocal i
i += 1
return i
return count
c = counter()
for i in range(10):
print(c(), end=' ')
print()
print(c.__closure__)
print(dir(c.__closure__[0].cell_contents))
print(c.__closure__[0].cell_contents)
이와 같이 실행해보면 됩니다.
클로저는 __closure__에 저장되고, 그 안의 변수 값은 cell_contents에 저장됩니다.
1 2 3 4 5 6 7 8 9 10
(<cell at 0x00000187FF041BD0: int object at 0x00000187FE200210>,)
__closure__를 보면 cell이 있고, int 객체가 들어 있습니다. 클로저에서 사용하는 변수에 저장된 데이터에 따라 타입이 결정됩니다. 문자열이면 str object일 겁니다.
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
셀 안의 내용입니다.
10
cell_contents를 출력해보면 클로저에 저장된 데이터의 값이 들어 있음을 알 수 있습니다.
본문에 설명이 있지만, 이 이상의 용도는 없습니다.
입문서의 특성상 문법을 알기 쉽게 설명하는 것에 중점을 두고 있습니다. 입문서 이상의 내용을 학습하면서 코드의 의도, 용도, 언제, 왜, 어떻게 사용해야 하는지를 알고 싶다면 <파이썬 코딩의 기술>(개정2판) 같은 책을 보는 게 좋습니다.
Better way 21 변수 영역과 클로저의 상호작용 방식을 이해하라
21번 항목이 좀 더 깊이 있는 설명과 이해에 도움이 될 것입니다.
답변 감사합니다.
답글 내용을 차근차근 살피며 책 본문도 복습해보니
조금은 이해 된 것 같습니다.
하단에 추천해주신 도서는
코딩도장을 복습하면서 항목별로 덧붙여 공부해보겠습니다.