OOP in Python - Classes, Objects, class methods, monkey patching & more!
OOP in Python - Classes, Objects, class methods, monkey patching & more!
객체지향 파이썬 완전 정복: 클래스, 객체, 클래스 메서드, 몽키 패칭까지
"클래스는 쿠키 커터, 객체는 쿠키다." — 코드에 철학을 더한 비유와 함께 파이썬 객체지향 프로그래밍을 제대로 배워보자.
클래스와 객체, 처음부터 제대로
파이썬에서 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 복잡한 코드를 구조화하고 재사용성을 높이기 위한 핵심 패러다임입니다.
클래스는 설계도, 객체는 실체
- 클래스는 로봇의 설계도처럼 청사진입니다.
- 이 클래스로부터 여러 개의 객체(로봇)를 만들 수 있습니다.
- 각 객체는 독립적인 속성(예: 이름, 색상 등)을 가집니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
__init__은 객체를 만들 때 자동 호출되는 생성자 메서드입니다. 첫 번째 인자인 self는 생성될 객체 자신을 가리킵니다.
속성, 메서드, 그리고 용어 정리
- Argument: 메서드 호출 시 전달하는 값
- Parameter: 메서드 정의에서 사용하는 변수
- Attribute: 객체 내부에 저장된 값
p = Person("Alice", 30)
print(p.name) # "Alice"
메서드는 객체의 동사다
속성이 명사라면, 메서드는 객체의 행동입니다.
class Person:
def introduce(self):
print(f"Hi, I'm {self.name}")
객체가 있어야 introduce()를 호출할 수 있습니다. 클래스 자체로는 호출 불가능합니다.
클래스 메서드 vs 인스턴스 메서드
클래스 메서드는 @classmethod 데코레이터를 사용하며 첫 번째 인자가 클래스 자신을 나타내는 cls입니다.
class Person:
counter = 0
def __init__(self, name):
self.name = name
Person.counter += 1
@classmethod
def population(cls):
print(f"Total people: {cls.counter}")
인스턴스 메서드는 객체마다 다르게 동작합니다.
클래스 메서드는 모든 객체가 공유하는 정보를 다룹니다.
p1 = Person("Alice")
p2 = Person("Bob")
p1.introduce() # 객체 메서드
Person.population() # 클래스 메서드
클래스 속성과 인스턴스 속성
- 클래스 속성: 모든 객체가 공유 (예:
counter) - 인스턴스 속성: 개별 객체만 보유 (예:
self.name)
몽키 패칭(Monkey Patching)
파이썬은 매우 유연한 언어입니다. 클래스나 객체에 동적으로 속성이나 메서드를 추가할 수 있습니다. 이를 ‘몽키 패칭’이라고 합니다.
p1.coin = 100 # 클래스에는 없던 속성을 추가
print(p1.coin) # 100
Person.version = "1.0"
print(p1.version) # "1.0"
print(p2.version) # "1.0"
하지만 함수(메서드)를 동적으로 붙이는 것은 좀 더 주의가 필요합니다. self와 cls 같은 참조가 올바르게 동작해야 하기 때문입니다.
파이썬 OOP의 철학: 유연성과 책임
파이썬의 객체지향은 다음과 같은 특징을 갖습니다.
- 명확한 네임스페이스 구조
- 속성과 메서드의 구분
- 클래스 기반 설계 + 동적 확장 가능성
- 높은 유연성
하지만 유연함은 곧 책임입니다. 지나친 동적 설계는 유지보수에 악영향을 줄 수 있으므로 주의해야 합니다.
마무리 요약
| 개념 | 설명 |
|---|---|
| 클래스 | 객체 생성의 설계도 |
| 객체 | 클래스에서 만든 실체 |
| 속성 (Attribute) | 객체의 데이터 |
| 메서드 | 객체가 할 수 있는 행동 |
| 클래스 메서드 | 클래스 차원에서 동작, 모든 객체에 공통 |
| 인스턴스 메서드 | 객체에 따라 다르게 동작 |
| 몽키 패칭 | 실행 중 속성/메서드를 동적으로 추가 |
(00:00) [음악 재생 중]
쿠키. 제대로 만들면 바삭하고 맛있는 간식이지만, 온라인에서 당신의 모든 움직임을 추적하기도 하죠.
하지만 쿠키를 잘 만들려면, 쿠키 커터가 필요합니다.
이제 고백하건대, 이것은 비유입니다.
쿠키 커터는 클래스와 같고, 쿠키는 객체와 같습니다.
객체지향 프로그래밍, 줄여서 OOP는 필드와 메서드를 책임감 있게 구성하는 방식입니다.
(00:27)
파이썬은 책임 있는 코딩을 지원하며, 이제 클래스와 객체를 책임감 있게 배워볼 겁니다.
객체지향 프로그래밍에서는 클래스와 객체를 구분하는 것이 필수입니다.
예를 들어봅시다.
공학에서, 로봇의 설계를 정의하는 설계도가 있다고 가정해 봅시다.
이 설계도를 바탕으로 여러 로봇을 만들 수 있습니다.
(00:52)
각 로봇은 동일한 핵심 설계를 기반으로 하지만, 색상이나 크기와 같은 고유한 특성을 가질 수 있습니다.
프로그래밍에서도 마찬가지로, 클래스는 설계도와 같습니다.
이 클래스를 사용하여 ‘객체’라는 소프트웨어 실체들을 만들 수 있습니다.
객체는 설계도를 바탕으로 만들어진 물리적 로봇과 유사합니다.
객체는 클래스에 고유한 값과 특성을 부여받아 자신의 독자적인 정체성을 갖습니다.
(01:22)
첫 번째 예제로, 우리는 person이라는 클래스를 만들겠습니다.
파이썬에서는 class 선언을 통해 클래스를 생성합니다.
단순히 class 키워드를 입력한 다음 클래스 이름을 쓰면 됩니다.
하나 이상의 클래스를 확장하려는 경우, 괄호 안에 포함시키면 됩니다.
그 외에는 괄호가 필요하지 않습니다.
콜론을 추가한 다음, 속성과 함수를 추가하기 시작합니다.
(01:45)
객체지향 프로그래밍 언어에서는, 객체는 생성자라 불리는 특별한 메서드로 생성됩니다.
파이썬도 마찬가지입니다. 여기서는 __init__ 메서드를 통해 객체를 초기화합니다.
이름 앞뒤에 밑줄 두 개가 있는 것은, 파이썬에서 이것이 특별한 메서드임을 의미합니다.
이중 밑줄이 있기 때문에, 흔히 ‘던더 메서드’라고 부르기도 합니다.
(02:13)
__init__ 메서드의 첫 번째 매개변수는 객체를 참조하는 변수입니다.
관례적으로 대부분의 사람들은 첫 번째 인자로 self를 사용합니다.
그 다음엔 추가적인 매개변수를 넣으면 됩니다.
__init__ 메서드의 본문에서는 객체를 사용할 수 있도록 초기화합니다.
일반적으로 각 매개변수를 별개의 속성에 할당하지만, 과감하거나 지루하다면 묶어서 사용할 수도 있습니다.
(02:39)
이제, 클래스 이름을 함수처럼 사용하여 객체를 생성할 수 있습니다.
이 구문은 __init__ 메서드를 호출하고 객체를 생성합니다.
인자의 수에 유의하세요.
여기서는 두 개를 전달했지만, 메서드는 세 개로 정의되어 있습니다.
파이썬은 self 인자를 자동으로 전달합니다.
그리고 꼭 알아야 할 세 가지 용어가 있습니다.
(03:02)
메서드에 값을 전달할 때, 이 값들은 인자(argument) 라고 합니다.
메서드를 정의할 때, 이 변수들은 매개변수(parameter) 라고 부릅니다.
그리고 매개변수를 객체 변수에 할당하면, 그것은 속성(attribute) 이 됩니다.
p는 이제 객체입니다.
생성자에서 우리는 세 개의 속성을 정의했습니다.
각 속성은 이름으로 접근할 수 있습니다.
(03:27)
실행. 이제 콜 투 액션의 룰렛, 줄여서 Wokta를 돌릴 시간입니다.
강좌들.
Socratica가 유튜브 외부에도 강좌를 만들고 있다는 걸 알고 계셨나요?
여러분이 이 영상을 보는 시점에는, 파이썬 3권 시리즈가 완성되었을 수도 있고 아닐 수도 있습니다.
일찍 보신다면 알림 신청을, 늦게 보셨다면 안심하세요.
(03:54)
배움에는 늦은 시점이란 없습니다.
각 객체에 고유한 속성이 있듯, 객체 고유의 정보를 사용하는 함수도 만들 수 있습니다.
속성이 객체의 명사라면, 메서드는 그 객체의 동사입니다.
간단히 말해, 속성은 객체의 명사, 메서드는 객체의 동사입니다.
(04:19)
이들은 메서드라고 불립니다.
왜 함수(function), 객체 함수, 행동 코드(action code)라고 하지 않았을까요?
그 이유는 간단합니다. 아무도 제게 물어보지 않았기 때문입니다.
클래스 내부의 함수는 객체 데이터를 사용할 수 있습니다.
첫 번째 매개변수는 객체를 참조할 이름입니다.
꼭 self를 써야 하는 건 아니지만, 대부분의 사람들은 그렇게 합니다.
(04:44)
여기서는 단순히 정중한 자기소개를 출력해보겠습니다.
객체를 만든 뒤에는 이 메서드를 호출할 수 있습니다.
생성자는 세 개의 매개변수로 정의되었지만, 실제로는 마지막 두 개만 전달하면 됩니다.
그리고 메서드는 하나의 매개변수로 정의되어 있으므로 아무것도 전달하지 않아도 됩니다.
실행. 훌륭한 출력입니다.
여기서는 객체를 생성하고, introduction 메서드를 호출했습니다.
(05:12)
만약 클래스를 대상으로 메서드를 호출하려고 하면 어떻게 될까요?
실행.
파이썬은 self가 전달되지 않았다고 명확하게 알려줍니다.
왜 그런 걸까요?
self는 객체를 참조하기 때문입니다.
우리가 이 메서드를 클래스에 대해 호출했기 때문에, 객체가 없어서 전달할 수 없었습니다.
그래서 이것은 객체 메서드라고 할 수 있죠.
(05:36)
하지만 대부분은 이것을 인스턴스 메서드라고 부릅니다.
자연스럽게 드는 질문은 이것입니다.
파이썬은 클래스 메서드를 지원하나요?
당연히 지원합니다.
클래스 메서드를 만들기 위해서는 @classmethod 데코레이터를 사용합니다.
클래스 메서드는 첫 번째 인자가 객체가 아니라 클래스입니다.
여기서는 관례적으로 cls를 사용합니다.
(06:02)
메시지를 출력하고 테스트해보겠습니다.
실행. 그건 정말 클래시(classy)한 메서드입니다.
질문. 객체에서 클래스 메서드를 호출할 수 있을까요?
한번 시도해봅시다.
객체 메서드를 호출하고, 클래스 메서드도 호출합니다.
실행. 두 메서드가 모두 성공적으로 실행되었습니다.
이유는, 객체는 자신이 어떤 클래스에서 왔는지 알고 있기 때문입니다.
하지만 클래스는 당신이 어떤 객체를 생각하고 있는지 알 수 없습니다.
(06:33)
이 차이를 좀 더 명확하게 하기 위해, self와 cls를 모두 출력해 봅시다.
실행.
객체 메서드를 호출할 때 첫 번째 인자인 self는 Person 타입의 객체입니다.
클래스 메서드를 호출할 때 첫 번째 인자는 클래스입니다.
이제 파이썬이 클래스와 인스턴스 속성을 어떻게 다루는지 더 깊이 파고들어야 합니다.
(아래는 분량상 나머지 번역이 이어집니다. 계속 이어서 보여드릴까요?)
'코딩' 카테고리의 다른 글
| 프로그램 백업 및 배포 : github + pythonanywhere (0) | 2025.07.05 |
|---|---|
| IMDB Poster Crawing (0) | 2025.07.03 |
| 파이썬 클래스 & 오브젝트 (한글 요약) (0) | 2025.06.29 |
| django, HTMX, Alpine, Tailwind (0) | 2025.06.26 |
| django-vite - HTMX, Alpine.js and TailwindCSS Plugin Installation (0) | 2025.06.26 |
