def func():
if not hasattr(func, "counter"):
func.counter = 0 # 초기화
func.counter += 1
print("Counter:", func.counter)
# 함수 호출
func()
func()
func()
func.counter
는 함수 속성으로 사용되어, 함수 호출 시마다 값을 유지합니다.class MyClass:
counter = 0 # 클래스 변수
def increment(self):
MyClass.counter += 1
print("Counter:", MyClass.counter)
# 인스턴스 생성 및 메서드 호출
obj1 = MyClass()
obj2 = MyClass()
obj1.increment()
obj2.increment()
obj1.increment()
MyClass.counter
는 클래스 변수로 사용되어, 모든 인스턴스가 공유하는 값을 유지합니다.Python에서 함수 내 상태를 유지하기 위한 몇 가지 다른 방법들도 있습니다. 예를 들어, 클로저(closure)를 사용할 수도 있습니다.
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter = make_counter()
print(counter())
print(counter())
print(counter())
이 예시에서 count
변수는 make_counter
함수가 호출될 때마다 상태를 유지하여 정적 변수처럼 동작합니다.
Python에서 변수는 메모리에 저장되는 방식에 따라 동적 메모리 할당과 정적 메모리 할당으로 구분할 수 있습니다. 그러나, Python의 변수는 대부분 동적 메모리 할당을 사용합니다. 그럼에도 불구하고, 변수의 용도와 특징에 따라 어떻게 메모리가 할당되는지 이해할 필요가 있습니다.
동적 메모리 할당은 프로그램 실행 중에 메모리 크기가 결정되는 변수들에 대해 사용됩니다. 이는 Python의 대부분의 변수에 해당합니다. Python은 내부적으로 동적 메모리 할당을 통해 변수의 크기와 타입을 관리합니다. 주요 변수 유형은 다음과 같습니다:
리스트 (List)
my_list = [1, 2, 3]
딕셔너리 (Dictionary)
my_dict = {'key1': 'value1', 'key2': 'value2'}
집합 (Set)
my_set = {1, 2, 3}
클래스 인스턴스 (Instance of Class)
사용자 정의 객체로, 속성과 메서드를 포함할 수 있습니다. 인스턴스 생성 시마다 메모리가 동적으로 할당됩니다.
예:
class MyClass:
def __init__(self, value):
self.value = value
obj = MyClass(10)
제너레이터 (Generator)
def my_generator():
yield 1
yield 2
yield 3
Python에서 대부분의 변수는 동적 메모리 할당을 통해 관리되지만, 일부 변수는 사실상 정적으로 할당된다고 볼 수 있습니다. 이는 주로 단순한 상수와 불변(immutable) 객체에 해당합니다:
불변 객체 (Immutable Objects)
정수 (Integer)
x = 10
문자열 (String)
name = "John"
튜플 (Tuple)
my_tuple = (1, 2, 3)
불변 집합 (Frozenset)
my_frozenset = frozenset([1, 2, 3])
상수 (Constant)
PI = 3.14159
정적 메모리 할당:
동적 메모리 할당:
Python의 동적 메모리 할당은 매우 유연하고 사용하기 쉬워서, 대부분의 경우에 유용합니다. 그러나 메모리 사용량을 최적화하고 성능을 향상시키기 위해 변수의 특성에 맞게 메모리 할당 방식을 이해하고 활용하는 것이 중요합니다.