C
Python/객체지향/Lesson 17

클래스 기초

1시간·theory
이 챕터
1/3
Python

클래스 기초

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ __init__ · self · 인스턴스 메서드 기본
  • ✅ 클래스 변수 vs 인스턴스 변수 차이
  • ✅ __repr__ · __str__ · __eq__ 매직 메서드

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

class 6가지 핵심 — 코드 + 실행 결과

class = 데이터 + 행동을 묶은 설계도. 같은 모양의 객체를 여러 개 만들 때.


1. 가장 단순한 클래스

python
class 사람:
    pass                       # 일단 비어있는 클래스

# 객체 생성
홍 = 사람()
이 = 사람()

# 속성 동적 추가 (Python 만의 특징)
홍.이름 = "홍길동"
홍.나이 = 28
print(홍.이름)              # 홍길동

사람() 호출 시 객체 생성. 변수 = 그 객체를 가리킴.


2. __init__ — 생성자

python
class 사람:
    def __init__(self, 이름, 나이):
        # 객체 만들 때 자동 호출
        self.이름 = 이름           # self = 자기 자신
        self.나이 = 나이

홍 = 사람("홍길동", 28)            # __init__ 자동 실행
print(홍.이름, 홍.나이)            # 홍길동 28

self 무엇? = "이 메서드를 호출한 객체 자신" (Java 의 this). 모든 메서드의 첫 매개변수 로 필수.


3. 메서드 — 객체의 행동

python
class 계좌:
    def __init__(self, 주인, 잔액=0):
        self.주인 = 주인
        self.잔액 = 잔액

    def 입금(self, 금액):
        self.잔액 += 금액
        print(f"+{금액}원, 잔액 {self.잔액}원")

    def 출금(self, 금액):
        if 금액 > self.잔액:
            print("잔액 부족!")
            return
        self.잔액 -= 금액
        print(f"-{금액}원, 잔액 {self.잔액}원")

c = 계좌("홍길동", 1000)
c.입금(500)                # +500원, 잔액 1500원
c.출금(2000)               # 잔액 부족!
c.출금(800)                # -800원, 잔액 700원

메서드 호출 시 c.입금(500) 처럼 객체.메서드(인자)self 는 자동 전달.


4. __str__ — 출력 포맷

python
class 사람:
    def __init__(self, 이름, 나이):
        self.이름 = 이름
        self.나이 = 나이

    def __str__(self):
        return f"<사람: {self.이름}, {self.나이}살>"

홍 = 사람("홍길동", 28)
print(홍)                  # <사람: 홍길동, 28살>

__str__ 없으면 <__main__.사람 object at 0x...> 같은 의미 없는 출력. 반드시 정의 권장.


5. 클래스 변수 vs 인스턴스 변수

python
class 학생:
    학교 = "코드마스터"           # 클래스 변수 (모두 공유)

    def __init__(self, 이름):
        self.이름 = 이름           # 인스턴스 변수 (객체별)

홍 = 학생("홍길동")
이 = 학생("이몽룡")

print(홍.학교, 이.학교)            # 코드마스터 코드마스터
print(홍.이름, 이.이름)            # 홍길동 이몽룡

# 클래스 변수 변경 — 모두에게 영향
학생.학교 = "스카이"
print(홍.학교, 이.학교)            # 스카이 스카이

6. Java 와 비교 — 짧음

python
# Python — 5줄
class 사람:
    def __init__(self, 이름, 나이):
        self.이름 = 이름
        self.나이 = 나이
java
// Java — 동일 의미, 11줄
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() { return name; }
    public int getAge() { return age; }
}

한 줄 요약

개념문법
정의class 이름:
생성자def __init__(self, ...):
자기 자신self (모든 메서드 첫 매개변수)
출력def __str__(self):
객체 생성obj = 이름(인자)
메서드 호출obj.메서드(인자)

핵심: 같은 모양 객체 여러 개 만들 때. self 가 곧 그 객체.

💻 클래스 기본 예제
# ============================================
# 📌 이 코드가 하는 일: 클래스로 '사람' 객체의 설계도를 만들고 사용합니다
# 📌 실생활 비유: 클래스는 '붕어빵 틀'입니다.
#    틀(클래스)로 여러 개의 붕어빵(인스턴스)을 찍어낼 수 있습니다.
#    각 붕어빵은 같은 모양이지만 속 재료(속성값)는 다를 수 있습니다.
# ============================================

# 🔹 클래스 정의: 객체의 속성과 동작을 설계합니다
class Person:
    # 🔹 클래스 변수: 모든 인스턴스가 공유하는 값 (하나의 메모리에 저장)
    species = "Homo sapiens"

    # 🔹 생성자(__init__): 인스턴스 생성 시 자동 호출, 초기값 설정
    def __init__(self, name, age):
        # 🔹 인스턴스 변수: 각 인스턴스마다 독립적으로 저장 (self.변수명)
        self.name = name  # 🔹 self = 생성되는 인스턴스 자신을 가리킴
        self.age = age

    # 🔹 인스턴스 메서드: 첫 번째 매개변수로 반드시 self를 받습니다
    def greet(self):
        return f"안녕하세요, {self.name}입니다."  # 🔹 self로 인스턴스 속성 접근

    def have_birthday(self):
        self.age += 1  # 🔹 인스턴스 변수 수정
        return f"{self.name}님, {self.age}세가 되셨습니다!"

# 🔹 인스턴스 생성: 클래스이름(인수) → __init__ 자동 호출
person1 = Person("철수", 25)  # 🔹 person1.name="철수", person1.age=25
person2 = Person("영희", 23)  # 🔹 person2는 person1과 완전히 독립적

# 🔹 메서드 호출: 인스턴스.메서드() → self 자동 전달
print(person1.greet())        # ✅ 실행 결과: 안녕하세요, 철수입니다.
print(person1.have_birthday()) # ✅ 실행 결과: 철수님, 26세가 되셨습니다!

# 🔹 클래스 변수 접근: 클래스명으로도, 인스턴스로도 접근 가능
print(Person.species)   # ✅ 실행 결과: Homo sapiens (클래스로 직접 접근)
print(person1.species)  # ✅ 실행 결과: Homo sapiens (인스턴스로 접근, 공유값)
# ❌ 흔한 실수: person1.species = "new" 하면 person1만의 인스턴스 변수가 새로 생깁니다

💡 핵심 포인트

1. self는 인스턴스 자신을 참조
2. __init__은 생성자 (자동 호출)
3. 클래스 변수 vs 인스턴스 변수 구분

Python의 OOP는 클래스(class)로 객체를 정의합니다. __init__은 생성자, self는 인스턴스 참조입니다. 상속은 class Child(Parent)로 구현하며, super()로 부모 메서드를 호출합니다. @property로 getter/setter 구현, @classmethod/@staticmethod로 클래스/정적 메서드를 정의합니다. 다중 상속과 MRO(Method Resolution Order)도 지원합니다.

🐍 실행해보기 — 클래스 기초

위 개념을 실제로 코드로 실행해보세요. 값을 바꿔가며 어떻게 동작하는지 직접 확인하는 게 가장 빠른 학습.
✏️ Python 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
🐍 Pyodide로 실제 Python 실행 — 첫 실행 시 로딩 3~5초 소요

🤖 AI 에게 이렇게 요청해보세요

이 lesson 의 개념을 알면 AI 에게 구체적으로 지시할 수 있습니다. 막연한 "고쳐줘" 가 아니라 어휘를 가진 요청 — 그게 토큰 절약의 출발점입니다.

  • "이 Python 코드에 클래스 기초 개념 적용해줘"
  • "이 코드에 type hint + pytest 단위 테스트 추가해줘"
  • "클래스 기초 관련 PEP 8 위반 점검해줘"

왜 이게 토큰을 줄이나

개념을 모를 땐 AI 답변을 받고도 "그게 뭐예요?" 를 다시 물어야 합니다. 그 "다시 물음" 이 토큰을 잡아먹습니다. 개념 한 번 익혀두면 대화가 한 번에 끝납니다.

먼저 읽으면 좋은 개념: 이터레이터 vs 이터러블
다음 추천: 상속
클래스 기초 - Python