본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] Mutable vs Immutable : 메모리 레이아웃의 3가지 핵심 차이와 최적화 방법

by Papa Martino V 2026. 2. 27.
728x90

Mutable vs Immutable
Mutable vs Immutable

 

파이썬을 다루는 개발자에게 Mutable(가변)Immutable(불변) 객체의 구분은 단순히 '값을 바꿀 수 있느냐'의 문제를 넘어섭니다. 이는 파이썬의 메모리 관리 시스템인 CPython이 객체를 어떻게 할당하고, 재사용하며, 가비지 컬렉션을 수행하는지에 대한 근본적인 아키텍처와 직결됩니다. 본 포스팅에서는 메모리 레이아웃의 구조적 차이점과 효율적인 코딩을 위한 4가지 실무 전략을 심도 있게 분석합니다.

1. 객체의 정의와 ID의 본질

파이썬의 모든 것은 객체입니다. 객체는 메모리에 생성될 때 고유한 id(메모리 주소)를 부여받습니다. 가변 객체는 생성 후 내부 상태를 변경해도 이 주소가 유지되지만, 불변 객체는 값이 바뀌는 순간 새로운 메모리 주소에 새로운 객체를 생성합니다. 이 메커니즘을 이해하는 것이 메모리 최적화의 첫걸음입니다.


2. 메모리 레이아웃 및 동작 비교

메모리 상에서 두 객체가 어떻게 관리되는지 명확하게 비교하기 위해 아래 표를 참조하십시오.

구분 항목 Immutable (불변 객체) Mutable (가변 객체)
해당 타입 int, float, str, tuple, bool list, dict, set, bytearray
메모리 수정 불가능 (새 객체 생성) 가능 (In-place 수정)
ID 변경 여부 값 변경 시 ID 변경됨 값 변경 시에도 ID 유지됨
메모리 효율 Interning 기법으로 재사용 가능 오버할당(Over-allocation) 전략 사용
안전성 멀티스레드 환경에서 안전함 사이드 이펙트 주의 필요

3. CPython의 비밀: Interning과 Over-allocation

파이썬은 메모리 효율을 극대화하기 위해 두 가지 독특한 전략을 취합니다.

  • Integer Interning: -5에서 256 사이의 정수는 메모리에 미리 로드되어 재사용됩니다. 이는 불변 객체이기에 가능한 최적화입니다.
  • List Over-allocation: list와 같은 가변 객체는 요소가 추가될 것을 대비해 실제 데이터보다 더 큰 메모리를 미리 예약합니다. 이를 통해 append 연산의 시간 복잡도를 $O(1)$로 유지합니다.

4. 실전 코드 예제 (Sample Example)

다음은 메모리 주소 변화를 통해 두 객체의 차이를 증명하는 예제입니다.


# 1. Immutable 객체 테스트 (String)
str_a = "Hello"
print(f"Original ID: {id(str_a)}")
str_a += " World"
print(f"Updated ID: {id(str_a)}") # 주소가 바뀜 (새 객체 생성)

# 2. Mutable 객체 테스트 (List)
list_a = [1, 2, 3]
print(f"Original List ID: {id(list_a)}")
list_a.append(4)
print(f"Updated List ID: {id(list_a)}") # 주소가 동일함 (내부 수정)
        

5. 성능 최적화를 위한 3가지 방법

  1. 문자열 결합 시 Join 사용: 반복적인 + 연산은 매번 새로운 불변 객체를 생성하므로 대량의 데이터 처리 시 "".join()을 사용하는 것이 훨씬 빠릅니다.
  2. 불변 객체를 키로 사용: Dictionary의 키는 해시 가능해야 하므로 반드시 Immutable 객체(str, tuple 등)를 사용해야 메모리 무결성이 유지됩니다.
  3. 기본 인자(Default Argument) 주의: 함수 정의 시 가변 객체를 기본값으로 설정하면, 함수 호출 시마다 해당 객체가 공유되어 예상치 못한 버그를 초래할 수 있습니다.

참조 및 출처

  • Python Software Foundation - Data Model (https://docs.python.org/3/reference/datamodel.html)
  • CPython Internal Source Code Analysis
  • Fluent Python by Luciano Ramalho
728x90