목 차
0. 들어가며
1. 변수란 무엇인가? 정말로?
2. Python의 모든 것은 객체이다.
3. 동적 타이핑과 변수의 자유.
4. 데이터 타입 ( 기본형과 복잡형 )
5. 변수, 객체, 참조
6. 타입 변환 ( Casting) 과 암묵적 형변환.
7. 불변(Immutable)과 가변(Mutable)
8. 타입 힌트 ( Type Hint )와 정적 검사
9. 내부 최적화와 인터닝(Interning)
10. 요약.
x = 10
이렇게 간단한 한 줄이 Python의 모든 기본을 내포하고 있습니다.
x는 변수, 10은 데이터, Python은 이 둘을 묶어 객체 모델로 처리합니다.
하지만 이걸 정말 깊게 이해하려면 "변수란 정확히 뭘 의미하는지", "값은 어디 저장되는지",
"int와 str은 어떻게 다르고, 실제로 메모리 상에서 어떤 식으로 동작하는지"를
차근히 짚고 넘어가야 합니다.
이 글에서는 Python의 변수와 데이터 타입을 완전히 딥하게 분석하며,
단순한 개념 소개에 그치지 않고 파이썬 내부 동작, 객체 모델, 성능적 시사점까지 함께 알아보겠습니다.
🧠 Python의 변수는 "객체에 대한 참조(Reference)를 저장하는 이름"입니다.
즉, Python에서 x=10 이라고 쓰면, x는 '10 이라는 객체'에 붙은 이름일 뿐입니다.
이걸 시각적으로 표현하면
x ──▶ [int 객체: 10]
변수 x는 메모리상에 있는 '10 이라는 값을 가진 int 객체'를 가리키고 있는 것입니다.
값 자체를 저장하고 있는 게 아니라, 그 값이 있는 위치를 가리키고 있는 포인터 역할을 하는 것입니다.
x = 10
print(id(x)) # 객체의 고유 ID (메모리 주소와 비슷한 역할)
Python은 철저하게 "객체지향적 설계"를 따르는 언어입니다.
"모든 것은 객체다" 라는 말은 단순한 문구가 아니라 실제 구조를 뜻합니다.
객체는 내부적으로 '클래스의 인스턴스'로 구성되어 있으며, 이 클래스는 내장 타입들입니다.
x = 10
print(type(x)) # <class 'int'>
print(x.__class__) # <class 'int'>
이처럼 파이썬에서는 어떤 값을 넣든
결국에 내부적으로는 '클래스 인스턴스'라는 객체 구조를 따르고 있습니다.
Python은 "동적 타이핑(Dynamic Typing)" 언어입니다.
즉, 변수에는 타입이 없고, 값(객체)만 타입을 가지고 있습니다.
x = 10 # x는 int 객체 참조
x = "Hello" # x는 이제 str 객체 참조
Python의 데이터 타입은 크게 두가지로 나눌 수 있습니다.
int : 정수형
float : 실수형
bool : 불리언(참/거짓)
str : 문자열
NomeType : 아무 것도 없음 ( None)
list: 리스트
tuple : 튜플
dict : 딕셔너리 (key-value)
set : 집합 (중복 없음)
frozenset, range, complex, bytes 등도 포함..
이 모든 타입들은 사실 'class'로 정의된 객체들이며,
내부에 여러 메서드와 속성을 가지고 있습니다.
이 두 연산자는 Python에서 매우 중요한 차이를 보입니다.
a = 1000
b = 1000
print(a == b) # True
print(a is b) # False (동일 객체 아님)
a = "42"
b = int(a) # str → int
x = 10 # int
y = 3.14 # float
z = x + y # float (자동 형변환)
파이썬은 손실이 없을 때만 암묵적으로 타입을 바꾸며, 필요시 명시적 캐스팅을 요구합니다.
불변형 (Immutable) | 가변형 (Mutable) |
---|---|
int , float , str , tuple , frozenset | list , dict , set , bytearray |
ex)
x = "hello"
x += " world"
str은 불변,
위 연산은 기존의 문자열을 수정하는 것이 아니라, 새로운 str 객체를 생성하고 x가 그 객체를 참조하게 되는 것.
Python은 기본적으로 동적 타입 언어지만, 3.5 버전부터는 타입 힌트(Type Hint) 를 지원합니다.
def greet(name: str) -> str:
return f"Hello, {name}"
a = 256
b = 256
print(a is b) # True
x = "hello"
y = "hello"
print(x is y) # True
개념 | 설명 |
---|---|
변수 | 객체에 대한 참조 이름 |
객체 | 클래스의 인스턴스로, 모든 데이터는 객체다 |
동적 타이핑 | 변수는 타입이 없고, 값이 타입을 가진다 |
불변 vs 가변 | 객체의 변경 가능 여부 |
is vs == | 객체 비교 vs 값 비교 |
인터닝 | 자주 쓰이는 객체를 캐시하여 재사용 |
타입 힌트 | 동적 언어의 한계를 보완하는 정적 분석 도구 |