콘텐츠로 이동

02. 클래스 기본 문법 (Self 이해하기)

"클래스 안의 함수들은 항상 첫 번째 재료로 self를 받습니다. '나 자신'을 챙겨야 하기 때문입니다."

1. __init__ (태어날 때 하는 일)

학생이 전학을 오면 이름과 출석번호를 받듯이, 인스턴스가 생성될 때 초기 상태(변수)를 설정해주는 약속된 함수(생성자)입니다.

class Student:
    def __init__(self, name):
        # "들어온 재료(name)를 내 뱃속(self.name)에 저장해라"
        self.name = name  
        self.attendance = 0 # 출석 횟수는 0부터 시작

2. 메서드 (행동 정의)와 self의 정체

클래스 안에 만든 함수를 메서드(Method)라고 부릅니다. 일반 함수와 다른 점은, 주어(Subject)가 있다는 점입니다.

    def attend(self):
        # "내(self) 출석 횟수를 1 늘린다"
        self.attendance += 1
        print(f"{self.name} 학생 출석 완료! (총 {self.attendance}회)")

🧠 멘탈 모델: self는 자동 전달된다

우리가 코드를 쓸 때와 파이썬이 실제로 처리하는 방식은 다릅니다.

  • 우리가 쓰는 코드: s1.attend() (괄호가 비어있음)
  • 실제 동작: Student.attend(s1) (주어가 첫 번째 인자로 들어감)
graph LR
    UserCode["s1.attend()"] --"자동 변환"--> RealAction["Student.attend(s1)"]
    RealAction --"s1이 self 자리로 쏙!"--> Def["def attend(self):"]

    style UserCode fill:#e1f5fe,stroke:#01579b
    style RealAction fill:#fff9c4,stroke:#fbc02d
    style Def fill:#e8f5e9,stroke:#2e7d32

3. 객체끼리의 만남 (Interaction)

클래스 하나만으로는 재미가 없습니다. 클래스가 다른 클래스를 재료로 쓸 때 진짜 프로그래밍이 시작됩니다.

class Classroom:
    def __init__(self):
        self.students = []  # 빈 리스트 (여기에 학생을 담자!)

    def add_student(self, student):
        self.students.append(student)  # Student 객체를 리스트에 추가

    def roll_call(self):
        # 반에 있는 모든 학생의 이름을 부른다 (attend 시키기)
        for s in self.students:
            s.attend()

"반(Classroom) 클래스는 학생(Student) 클래스를 담는 그릇이 됩니다."

graph TD
    Classroom["🏫 Classroom 객체: 파이썬반"]
    S1["👤 Student 객체: 지민"]
    S2["👤 Student 객체: 태형"]

    Classroom --"students 리스트에 포함"--> S1
    Classroom --"students 리스트에 포함"--> S2

    style Classroom fill:#fff9c4,stroke:#fbc02d

4. [Tip] pass로 스켈레톤 코딩하기

코드를 짤 때 세부 내용은 나중에 하고, 전체 구조(설계)부터 잡고 싶을 때 pass를 씁니다. 이것은 AI와 협업할 때 최고의 전략입니다.

  1. 사람이 pass를 써서 껍데기(설계)만 만듭니다.
  2. AI에게 "이 pass 부분 채워줘"라고 시킵니다.
class Student:
    def attend(self):
        pass  # TODO: AI야, 출석 로직 채워줘

    def get_score(self):
        pass  # TODO: AI야, 성적 계산 로직 채워줘