1. 변수와 상수의 기본 개념
변수는 프로그램 실행 중에 값이 변경될 수 있는 메모리 공간을 말합니다. 반면 상수는 실행 중에 값이 고정되어 변하지 않는 대상을 의미합니다. 두 개념 모두 생성 시 메모리에 특정 공간을 할당받아 값을 저장한다는 공통점이 있습니다.
2. 변수의 특징과 사용법
2.1 타입 선언 없이 사용 가능
Python은 동적 타입 언어이므로 변수를 사용할 때 타입을 미리 선언할 필요가 없습니다. 아래 예시에서 x, y, z, w는 각각 정수, 문자열, 리스트, 표현식의 결과를 담고 있지만, C나 Java처럼 int x, str y와 같은 선언 없이 바로 사용됩니다.
x = 4
y = "hello"
z = []
w = 9 - 5
2.2 할당 연산자(=) 사용
= 기호는 "할당"을 의미하며, 수학에서의 "같음"과는 다릅니다. 할당은 변수에 값을 저장하는 동작이고, 같음 비교는 == 연산자를 사용합니다.
value = 100
2.3 사용 전 반드시 할당 필요
변수는 값을 할당받아야 메모리에 생성됩니다. 할당 없이 참조하면 오류가 발생합니다.
data # 오류 발생: NameError
data = 1 # 정상 실행
items.append(1) # items가 정의되지 않음: NameError
위 코드에서 data와 items는 할당 전에 사용되어 NameError가 발생합니다.
2.4 변수 자체는 타입이 없음
Python에서 변수는 단순히 객체를 가리키는 참조(reference)이며, 타입은 변수가 가리키는 객체에 속합니다. 따라서 동일한 변수가 여러 타입의 값을 가질 수 있습니다.
a = 1
a = "hello"
a = [1, 2, 3]
a = {"key": "value"}
변수 a는 처음에는 정수, 이후 문자열, 리스트, 딕셔너리로 자유롭게 변경됩니다. 이것이 동적 언어의 특징입니다.
2.5 할당 연산은 오른쪽에서 왼쪽으로 진행
a = 1
b = 2
result = a + b # a + b가 먼저 계산된 후 result에 할당
print(result)
2.6 다중 할당 지원
한 줄에서 여러 변수에 값을 할당할 수 있습니다.
x = y = z = 1 # 세 변수 모두 1
a, b, c = 1, 2, 3 # a=1, b=2, c=3
2.7 할당과 수학적 등식의 차이
count = 1
count = count + 2
수학적으로 count = count + 2는 성립하지 않지만, 프로그래밍에서는 오른쪽 표현식 count + 2를 먼저 계산하여 3을 얻고, 이를 변수 count에 새로 할당합니다. 따라서 count는 최종적으로 3이 됩니다.
2.8 변수 할당의 실제 동작
name = 'Jack'을 실행하면 Python 인터프리터는 두 가지 작업을 수행합니다:
- 메모리에 문자열 'Jack' 객체 생성
- 변수
name을 생성하고, 이를 'Jack' 객체를 가리키도록 설정
변수를 다른 변수에 할당할 때는 참조가 복사됩니다.
name = 'Jack'
alias = name
name = 'Tom'
print(alias) # 'Jack' 출력
print(name) # 'Tom' 출력
alias = name은 alias가 name이 가리키는 'Jack' 객체를 동일하게 가리키도록 만듭니다. 이후 name이 'Tom'을 가리키도록 변경되어도 alias는 여전히 'Jack'을 가리킵니다.
핵심 원칙: Python에서 모든 것은 객체이며, 변수는 단지 객체에 대한 참조(reference)입니다.
3. 상수
상수는 값이 변하지 않는 변수로, 주로 전역에서 사용합니다. Python은 언어 차원에서 상수를 강제하지 않지만, 관례적으로 변수명을 모두 대문자로 작성하여 상수임을 나타냅니다.
PI = 3.14159265359
하지만 Python 문법적으로 PI는 일반 변수이므로 PI = 10처럼 값을 변경해도 오류가 발생하지 않습니다. 대문자 표기법은 개발자 간의 약속일 뿐이며, 실제 불변성을 보장하지 않습니다. 상수는 보통 코드 상단에 위치하여 전역에서 참조됩니다.