파이썬 변수의 개념과 메모리 관리

변수의 기본 개념

파이썬에서 변수는 데이터를 참조하기 위한 이름입니다. 프로그램 내부에서 특정 값을 쉽게 접근하고 조작할 수 있도록 하기 위해 사용됩니다. 단순히 데이터에 이름을 붙이는 것이라고 이해하면 됩니다.

변수 이름 작성 규칙

  • 영문자, 숫자, 언더스코어(_)로 구성되어야 합니다.
  • 숫자로 시작할 수 없습니다.
  • 예약어(키워드)는 사용 불가능합니다.
  • 대소문자를 구분합니다.

예약어 예시:

>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

키워드 여부 확인은 다음과 같이 가능합니다:

>>> keyword.iskeyword('if')
True

명명 규칙

  • 모듈 이름: 소문자 + 언더스코어 연결 (예: data_processor.py)
  • 패키지 이름: 모듈과 동일한 규칙
  • 클래스 이름: 단어 첫 글자 대문자 (예: DataAnalyzer, ConfigManager)
  • 전역 상수: 대문자 + 언더스코어 연결 (예: MAX_RETRY, DEFAULT_TIMEOUT)
  • 일반 변수: 소문자 + 언더스코어 연결 (예: user_data, file_path)
  • 인스턴스 변수: 언더스코어로 시작 (예: _value, _internal_state)
  • 비공개 인스턴스 변수: 두 개의 언더스코어로 시작 (예: __secret_key)
  • 내부 특수 변수: 양쪽에 언더스코어 (예: __doc__, __name__) – 직접 정의 금지

변수 할당 방식

단일 변수 할당

counter = 100           # 정수형
distance = 98.6         # 실수형
username = "Alice"      # 문자열

다중 변수 동시 할당

동일한 값으로 여러 변수 초기화:

a = b = c = 42

다른 값으로 별도 할당:

x, y, z = 10, "hello", True

메모리 저장 방식

파이썬은 전통적인 언어와 달리 변수 자체에 타입이 없으며, 변수는 객체에 대한 참조입니다. 즉, 변수는 메모리 주소를 가리키는 레이블에 불과합니다.

메모리 주소 확인:

>>> a = 5
>>> id(a)
1402345678904

>>> b = 5
>>> id(b)
1402345678904  # 동일한 값은 동일한 메모리 공간을 공유

객체 타입 확인:

>>> type(100)
<class 'int'>

객체 비교:

a = "test"
b = a
a is b        # True → 같은 객체 참조

c = "test"
d = "test"
c is d        # 보통 True (문자열 캐싱 때문)
c == d        # True → 값 비교

참조 카운트와 메모리 회수

파이썬은 자동 메모리 관리 시스템을 제공하며, 참조 카운트 기반의 가비지 컬렉션을 사용합니다.

참조 카운트 증가 사례:

  • 변수에 객체 할당 시
  • 함수 인자로 전달 시
  • 리스트/딕셔너리 등 컨테이너에 포함 시

참조 카운트 감소 사례:

  • 변수 재할당 시 (원래 객체 참조 제거)
  • 변수 범위 종료 시 (함수 종료 등)
  • del 문으로 삭제 시

참조 카운트 확인 예제:

>>> import sys
>>> text = "hello"
>>> sys.getrefcount("hello")
3
>>> another = "hello"
>>> sys.getrefcount("hello")
4
>>> another = 100
>>> sys.getrefcount("hello")
3

주의: 인터랙티브 환경에서는 참조 카운트가 항상 3 이상으로 나타나며, 실제 값과 다를 수 있습니다. 스크립트 실행 시에는 정확한 결과를 얻을 수 있습니다.

가비지 컬렉션

참조 카운트가 0이 되면 객체는 자동으로 회수됩니다. 하지만 순환 참조(두 객체가 서로를 참조하는 경우)는 참조 카운트가 0이 되지 않아 문제가 발생할 수 있습니다. 파이썬은 이를 해결하기 위해 참조 카운트 + 순환 가비지 컬렉터를 결합하여 운영합니다.

파이썬과 쉘 간 변수 전달

쉘 → 파이썬

import os
result = os.popen('ls -l').read()
print(result)

파이썬 → 쉘

import os
value = 42
os.environ['TEMP_VAL'] = str(value)
os.system('echo $TEMP_VAL')

간편한 쉘 명령 실행

import os
dir_path = "/tmp/test_dir"
os.system(f"mkdir {dir_path}")

커스텀 워드 카운터 (wc) 구현

#!/bin/bash
# wc.sh
case "$1" in
    -l) wc -l "$2" ;;
    -w) wc -w "$2" ;;
    -c) wc -c "$2" ;;
    *) wc "$2" ;;
esac

태그: 파이썬 변수 메모리 관리 참조 카운트 가비지 컬렉션

7월 25일 22:54에 게시됨