변수의 기본 개념
파이썬에서 변수는 데이터를 참조하기 위한 이름입니다. 프로그램 내부에서 특정 값을 쉽게 접근하고 조작할 수 있도록 하기 위해 사용됩니다. 단순히 데이터에 이름을 붙이는 것이라고 이해하면 됩니다.
변수 이름 작성 규칙
- 영문자, 숫자, 언더스코어(_)로 구성되어야 합니다.
- 숫자로 시작할 수 없습니다.
- 예약어(키워드)는 사용 불가능합니다.
- 대소문자를 구분합니다.
예약어 예시:
>>> 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