1. 클래스와 인스턴스의 본질

프로그래밍에서 복잡한 시스템을 구축하기 위해서는 숫자나 문자열 같은 단순 데이터를 넘어, ‘상태(속성)’‘행동(메서드)’을 하나로 묶은 독립적인 생명체인 객체(Object)를 만들어내야 합니다. 이 객체들의 협력으로 돌아가는 시스템을 ‘객체지향(Object-Oriented)’ 시스템이라고 부릅니다.

  • 클래스(Class): 객체를 똑같이 찍어내기 위한 ‘설계도’ 혹은 ‘붕어빵 틀’입니다.
  • 인스턴스(Instance): 설계도를 통해 컴퓨터 메모리 상에 실체화된 개별 ‘객체(붕어빵)’를 말합니다.

1.1 객체가 가져야 할 3대 특징

완벽한 객체라면 다음의 세 가지 특성을 만족해야 합니다.

  1. 정체성 (Identity): 모든 객체는 고유한 메모리 주소(레퍼런스)를 가집니다. 완전히 똑같은 데이터를 가졌더라도, 쌍둥이처럼 서로 다른 존재로 취급받아야 합니다. 파이썬에서는 id() 함수를 통해 메모리 바코드(주소)를 확인합니다.
  2. 상태 (State / Data Type): 객체는 자신만의 고유한 정보를 품고 있습니다. (예: 자동차 객체의 ‘현재 속도’, ‘색상’ 데이터)
  3. 책임/반응성 (Responsibility / Behavior): 외부에서 특정 메시지(호출)를 받았을 때 스스로의 상태를 변화시키거나 응답하는 행동 지침(메서드)을 갖추고 있어야 합니다.
# 파이썬의 숫자도 사실은 int 라는 클래스로부터 태어난 완벽한 '객체'입니다!
a = int(10)
b = int(5)

# 객체의 '행동(Behavior)' 호출: 
# a.+(b) 와 본질적으로 같은 행위가 내장 스페셜 메서드 __add__를 통해 처리됩니다.
print(a.__add__(b)) # 15

1.2 사용자 정의 클래스 만들기 (class 키워드)

파이썬 내장 객체(int, str 등) 외에, 우리 비즈니스 상황에 딱 맞는 독자적인 틀을 만들 때는 class 키워드를 사용합니다.

클래스의 첫 글자는 대문자를 사용하는 파스칼 케이스(PascalCase) 표기법을 쓰는 것이 약속(PEP 8)입니다.

# '책' 이라는 추상적 사물의 설계도(클래스)를 정의
class Book:
    # 붕어빵이 갓 구워져 나왔을 때 초기 속성을 채워넣는 특별한 메서드
    def __init__(self, title, author):
        # self.속성명 = 매개변수
        # self는 '방금 태어난 나 자신(인스턴스)'을 가리킵니다.
        self.title = title
        self.author = author

# 설계도를 기반으로 메모리 상에 실물 객체 2개를 탄생시킴 (인스턴스화)
book1 = Book("어린왕자", "생텍쥐페리")
book2 = Book("파이썬 코딩", "귀도 반 로섬")

print(book1.title) # 어린왕자

# 두 책은 완전히 독립된 메모리 주소를 가짐 (정체성 확립)
print(id(book1) == id(book2)) # False

1.3 만물의 조물주: objecttype

파이썬 객체 생태계 피라미드의 꼭대기에는 두 명의 절대자가 존재합니다.

  1. object (최상위 부모 클래스) 파이썬의 세상의 모든 클래스(수치, 문자열, 사용자가 만든 Book 클래스 등)는 족보를 거슬러 올라가면 시조새 격인 object 클래스를 강제로 상속받고 있습니다. 이 때문에 어떠한 객체든 __str__이나 __dict__ 같은 공통 스페셜 속성들을 숨쉬듯 사용할 수 있는 것입니다.
  2. type (메타 클래스) ‘클래스 모양 자체’를 찍어내는 공장장의 공장입니다. 우리가 짠 class Book: 코드 블록마저도 사실은 파이썬 내부의 type이라는 설계도(메타 클래스)가 만들어낸 하나의 인스턴스에 불과합니다.
# 파이썬의 클래스는 object의 후손입니다.
print(issubclass(int, object))  # True
print(issubclass(Book, object)) # True

# 심지어 클래스(틀) 자신조차도 type 공장에서 찍힌 인스턴스 물건일 뿐입니다.
print(isinstance(Book, type))   # True
서브목차