데이터와 기능을 묶어 관리하는 새로운 개념,세상을 객체(Object) 단위로 바라보는 방법

  • 객체지향 프로그래밍(OOP): 클래스는 이 거대한 프로그래밍 패러다임의 핵심 개념입니다.
  • 설계도와 실체: “붕어빵 틀(클래스)과 붕어빵(객체)“이라는 개념적 이해가 우선되어야 합니다.
  • 추상화: 복잡한 현실의 사물을 코드로 옮기는 ‘개념적 작업’이 주를 이룹니다.
  • 사용자가 언급하신 ‘슬라이싱’처럼 파이썬을 다루는 상위 차원의 규칙에 가깝습니다.

2. 다른 폴더들에 넣기엔 애매한 이유

  • reserved (예약어): class라는 단어 자체는 예약어가 맞지만, 예약어 폴더에는 보통 if, for, while처럼 문법을 구성하는 아주 기초적인 단어들을 넣습니다. 클래스는 이 단어 하나로 끝나는 게 아니라 거대한 체계입니다.

  • data (데이터/자료구조): 클래스를 사용해서 ‘스택’이나 ‘큐’ 같은 자료구조를 만들 수 있으니 관련은 있습니다. 하지만 클래스는 데이터를 담는 틀이지 데이터 그 자체는 아닙니다.

  • functions (함수): 클래스 안에 메소드(함수)가 포함되긴 하지만, 클래스는 함수보다 더 큰 범주입니다. (클래스 ⊃ 메소드)


개념

예제

# 1. 클래스 정의 (설계도 만들기)
class Robot:
    """
    이 클래스는 로봇의 이름과 배터리를 관리하고,
    인사와 충전 기능을 가진 설계도입니다.
    """
 
    # [중요] 초기화 메소드: 객체가 생성될 때(Robot()) 자동으로 실행됨
    def __init__(self, name):
        self.name = name      # self.name: 이 로봇만의 고유한 이름 저장
        self.battery = 100    # self.battery: 초기 배터리는 100으로 설정
        print(f" 알림: 로봇 '{self.name}'이(가) 탄생했습니다!")
 
    # [메소드] 로봇이 인사하는 기능
    def say_hello(self):
        # self를 통해 내 안에 저장된 name을 꺼내 씁니다.
        print(f"[{self.name}]: 안녕하세요! 현재 배터리는 {self.battery}%입니다.")
 
    # [메소드] 로봇이 움직이는 기능 (데이터 변경)
    def move(self):
        if self.battery >= 10:
            self.battery -= 10
            print(f"[{self.name}]: 한 칸 이동했습니다. (배터리 -10)")
        else:
            print(f"[{self.name}]: 배터리가 부족해서 움직일 수 없습니다!")
 
# --- 클래스 밖 (메인 코드 영역) ---
 
# 2. 일반 함수 (비교용: 특정 객체에 소속되지 않음)
def check_robot_status():
    print("시스템: 현재 모든 로봇의 상태를 점검합니다.")
 
# 3. 객체(인스턴스) 생성
# 설계도(Robot)를 호출하여 실제 로봇 p1, p2를 만듭니다.
# 이때 "알파", "베타"라는 값이 __init__의 name으로 전달됩니다.
 
# init덕분에 클래스 호출 할 때 넣어주면 그냥 이때 몸에 새겨짐
bot1 = Robot("알파")
bot2 = Robot("베타")
 
 
# 4. 메소드 호출 (점 '.' 연산자 사용)
check_robot_status()  # 일반 함수는 이름만 불러서 사용
 
bot1.say_hello()      # bot1(알파)에게 인사 시키기
bot1.move()           # bot1만 이동 (bot1의 배터리만 줄어듦)
 
bot2.say_hello()      # bot2(베타)는 여전히 배터리가 100임 (독립적!)

사용 방법

객체 (instance) 만들고, Class안의 함수를 정의할 때 가장 첫 인자는 Self (클래스 안의 본인을 지칭하기 위함)

  • __init__: 객체를 만들 때 딱 한 번 외부에서 값을 받아와서 내부에 저장.
  • 일반 메소드: 이미 init을 통해 내부에 저장된 값을 쓸 때는 괄호 안에 아무것도 넣지 않음.
  • self는 “이미 내 안에 저장된 정보를 가져오겠다”는 뜻 메소드 앞에 다 넣어줌

1. 모든 정보를 __init__에 넣는 방식 (고정형)

“이 로봇은 오직 주인님에게만 인사하도록 태어났어!”라고 설정하는 것과 같습니다.

Python

class Robot:
    def __init__(self, name, to_whom):
        self.name = name
        self.to_whom = to_whom  # 인사 대상이 아예 로봇의 속성으로 고정됨

    def say_hello(self):
        print(f"[{self.name}]: {self.to_whom}님, 안녕하세요!")

bot1 = Robot("알파", "주인님")
bot1.say_hello() # 괄호 안이 비어 있어서 호출하기는 아주 편함!
  • 장점: say_hello()를 호출할 때마다 인사를 누구에게 할지 고민할 필요가 없습니다. 코드가 짧아지고 호출이 간결해집니다.

  • 단점: 로봇이 ‘친구’나 ‘손님’을 만났을 때도 무조건 “주인님”이라고 부르게 됩니다. 대상을 바꾸려면 bot1.to_whom = "친구"처럼 내부 데이터를 매번 수정해야 해서 번거롭습니다.


2. 메소드에 매개변수를 넣는 방식 (유연형)

“이 로봇은 그때그때 만나는 사람에 맞춰서 인사할 수 있어!”라고 설정하는 것입니다.

Python

class Robot:
    def __init__(self, name):
        self.name = name

    def say_hello(self, to_whom): # 실행할 때마다 대상을 입력받음
        print(f"[{self.name}]: {to_whom}님, 안녕하세요!")

bot1 = Robot("알파")
bot1.say_hello("주인님")
bot1.say_hello("손님") # 하나의 로봇으로 여러 상황에 대응 가능!
  • 장점: 훨씬 유연합니다. 로봇 하나로 다양한 대상을 상대할 수 있습니다.

  • 단점: 호출할 때마다 매번 이름을 적어줘야 하므로 조금 더 귀찮을 수 있습니다.


그렇다면 어떤 기준을 써야 할까요? (꿀팁)

보통 프로그래밍을 할 때는 다음과 같은 기준으로 나눕니다.

  1. 변하지 않는 고유 속성 → __init__

    • 예: 로봇 이름, 모델명, 제조 일자, 초기 배터리 용량
  2. 행동할 때마다 바뀌는 조건 → 메소드 매개변수

    • 예: 이동할 거리, 인사할 대상, 계산할 숫자, 요리할 메뉴