본문 바로가기
코딩교육/Python 초등교육에서 전문가까지

2단계 : 1. 변수와 자료형 (feat. 변수와 메모리 구조 이해)

by 제리토리 2025. 2. 14.
728x90
반응형

 

Python에서 변수는 데이터 값을 직접 저장하는 것이 아니라 객체(Object)를 참조(Reference)합니다. 이 참조 모델은 Python의 메모리 관리 방식과 변수의 동작 원리를 이해하는 데 중요한 개념입니다. 특히, 불변 객체(Immutable)와 가변 객체(Mutable)의 차이를 이해하면 코드의 효율성을 높이고, 예기치 않은 동작을 예방할 수 있습니다. 이 장에서는 Python 변수의 메모리 구조와 값 복사 및 참조의 차이를 심도 있게 탐구합니다.

 

 

1. Python의 메모리 관리 개요

 

 

Python에서 모든 데이터는 **객체(Object)**로 표현됩니다. 변수는 이러한 객체를 참조하는 이름표(Tag) 역할을 합니다.

 

㉮ 변수와 객체

 

   • 변수: Python의 변수는 데이터를 저장하는 메모리 주소를 참조.

   • 객체: 데이터 자체를 의미하며, Python에서 모든 데이터는 객체로 구현.

 

   예제

x = 42

 

   • 42는 정수 객체로 메모리에 생성.

   • 변수 x42 객체를 참조.

 

 

㉯ 객체 ID

 

   Python의 id() 함수는 객체의 고유한 메모리 주소(참조 값)를 반환합니다.

 

   예제: 객체 ID 확인

x = 42
print(id(x))  # x가 참조하는 객체의 ID 출력

 

 

 

2. 불변 객체와 가변 객체

 

 

Python의 객체는 불변 객체(Immutable)가변 객체(Mutable)로 나뉩니다.

 

㉮ 불변 객체 (Immutable Objects)

 

   • 객체의 값이 생성된 이후 변경 불가능.

   • 새 값을 할당하면 새로운 객체가 생성되고 변수는 새로운 객체를 참조.

   • 주요 불변 객체:

      • 정수형 (int)

      • 실수형 (float)

      • 문자열형 (str)

      • 튜플 (tuple)

 

   예제: 불변 객체의 동작

x = 10
print(id(x))  # x가 참조하는 객체의 ID 출력

x = 20
print(id(x))  # 새로운 객체를 참조

 

   결과

140724269846784
140724269847104

 

 

㉯ 가변 객체 (Mutable Objects)

 

   • 객체의 값이 변경 가능하며, 변수는 동일한 객체를 계속 참조.

   • 주요 가변 객체:

      • 리스트 (list)

      • 딕셔너리 (dict)

      • 집합 (set)

 

   예제: 가변 객체의 동작

x = [1, 2, 3]
print(id(x))  # x가 참조하는 객체의 ID 출력

x.append(4)  # 객체 값을 수정
print(id(x))  # 동일한 객체 ID 유지

 

   결과

140720394781760
140720394781760

 

 

 

3. 값 복사와 참조

 

 

Python에서 변수 간 데이터 전달은 값 복사와 참조로 구분됩니다.

 

㉮ 값 복사 (Call by Value)

 

   • 불변 객체를 다른 변수에 할당하면 새로운 참조를 생성.

   • 두 변수가 동일한 값을 가리키지만, 객체는 독립적으로 관리.

 

   예제

x = 10
y = x
x = 20

print(x)  # 20
print(y)  # 10

 

 

㉯ 참조 (Call by Reference)

 

   • 가변 객체를 다른 변수에 할당하면 동일한 객체를 참조.

   • 하나의 변수에서 값을 수정하면 다른 변수에도 영향을 미침.

 

   예제

x = [1, 2, 3]
y = x

x.append(4)
print(y)  # [1, 2, 3, 4] (y도 동일 객체를 참조)

 

 

㉰ 얕은 복사 (Shallow Copy)

 

   • 새로운 객체를 생성하되, 내부 데이터는 기존 객체를 참조.

 

방법:

   • 슬라이싱:

x = [1, 2, 3]
y = x[:]

 

   • copy 모듈:

import copy
y = copy.copy(x)

 

   예제

import copy

x = [[1, 2], [3, 4]]
y = copy.copy(x)

x[0][0] = 99
print(y)  # [[99, 2], [3, 4]]

 

 

㉱ 깊은 복사 (Deep Copy)

 

   • 새로운 객체를 생성하며, 내부 데이터까지 복사.

 

방법:

   • copy.deepcopy 사용:

import copy
y = copy.deepcopy(x)

 

   예제

import copy

x = [[1, 2], [3, 4]]
y = copy.deepcopy(x)

x[0][0] = 99
print(y)  # [[1, 2], [3, 4]]

 

 

 

4. 메모리 관리와 참조 횟수

 

 

Python은 참조 카운트(reference count)를 기반으로 메모리를 관리합니다. 객체의 참조 횟수가 0이 되면 가비지 컬렉터(Garbage Collector)가 객체를 삭제합니다.

 

㉮ 참조 카운트 확인

 

   • sys.getrefcount() 함수로 객체의 참조 횟수 확인.

 

   예제

import sys

x = [1, 2, 3]
print(sys.getrefcount(x))  # 출력: 참조 횟수

 

 

 

5. 변수 사용 시 유의사항

 

 

㉮ 불변 객체 주의:

   • 값 변경 시 새로운 객체를 생성하므로 메모리 낭비에 주의.

 

㉯ 가변 객체 공유 주의:

   • 가변 객체를 함수나 변수 간 공유 시 예기치 않은 동작 가능.

 

㉰ 깊은 복사 활용:

   • 중첩 구조 데이터를 복사할 때는 깊은 복사를 사용.

 

 

6. 요약

 

 

Python 변수는 객체를 참조하며, 모든 데이터는 객체로 구현됩니다.

 

불변 객체가변 객체의 차이를 이해하면 변수 동작 방식을 명확히 알 수 있습니다.

 

Python의 메모리 관리 방식은 참조 모델을 기반으로 하며, 참조 횟수가 0이 되면 가비지 컬렉터가 객체를 자동으로 정리합니다.

 

복사와 참조의 차이를 이해하고 올바르게 활용하면 코드의 효율성과 안정성을 높일 수 있습니다.

 

 

 

 

 

 

728x90
반응형