요약

image.png

image.png

객체 모델 - “모든 것은 객체”

Python은 정수, 함수, 클래스, 모듈, 타입 자체가 전부 객체 형태

Java처럼 int 같은 원시 타입(primitive)가 따로 없음

CPython 기준으로 모든 객체는 내부적으로 PyObject 구조체이고, 최소한 세 가지를 가짐

  1. 참조 카운트
  2. 타입 포인터

여기서 중요한 것은, 타입은 객체에 붙어있지 변수에 붙어있지 않음

Java는 int x 처럼 변수에 타입이 선언되지만, Python은 객체가 자기 타입을 들고 다님

이름 바인딩 모델

Java의 변수는 “값(또는 참조)을 담는 상자”

Python의 변수는 상자가 아니라 “객체에 붙인 이름표”

2가지를 예시로 들면 아래와 같음:

[가변성. int, float, str 등등]
a = [1, 2, 3]
b = a
# a --> [1, 2, 3] <-- b (객체 하나, **이름표 둘**)
[불변성. list, dict 등등]
a = [1, 2, 3]
b = a
print(id(a) == id(b))  # True <- 같은 객체
print(a is b)          # True <- is는 정체성 비교

그래서 Python에는 Java의 “primitive vs reference” 구분 자체가 없고, 모든 건 참조 의미론으로 동작

다만 불변 객체(int, str, tuple)는 재바인딩만 가능해서 마치 값처럼 보일 뿐