함수 (Functions)와 메소드 (Methods)의 차이:
  • def를 밖에서 하면? → 함수를 만든 것.
  • def를 클래스 안에서 하면? → 그 클래스의 메소드를 만든 것.

함수: 독립적인 도구, 클래스에 속하지 않으며 어디서든 이름을 불러 쓸 수 있는 코드

  • 정의: 클래스 밖에서 def로 정의합니다.
  • 호출: 함수 이름만으로 호출합니다. (예: push(item))
  • 비유: 길거리에 놓인 공용 벤치 (누구나 가서 앉을 수 있음)

메소드 (Method): 객체의 기능을 정의 (클래스 안, 데이터와 기능 중 기능) 클래스 내부에 정의되어 있고, 그 클래스로 만든 객체(instance)를 통해서만 사용할 수 있는 함수입니다.

  • 정의: 클래스 안에서 def로 정의하며, 첫 번째 인자로 보통 self를 받습니다.
  • 호출: 점(.) 연산자를 사용해 객체를 거쳐서 호출합니다. (예: my_stack.push(item))
  • 비유: 내 가방의 지퍼 (내 가방이 있어야만 지퍼를 열고 닫을 수 있음
# 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으로 전달됩니다.
bot1 = Robot("알파")
bot2 = Robot("베타")
 
# 4. 메소드 호출 (점 '.' 연산자 사용)
check_robot_status()  # 일반 함수는 이름만 불러서 사용
 
bot1.say_hello()      # bot1(알파)에게 인사 시키기
bot1.move()           # bot1만 이동 (bot1의 배터리만 줄어듦)
 
bot2.say_hello()      # bot2(베타)는 여전히 배터리가 100임 (독립적!)

3. 왜 굳이 구분해서 부를까요?

사실 메소드도 넓은 의미에서는 함수에 포함됩니다. 하지만 굳이 이름을 나눠 부르는 이유는 **“주인이 누구냐”**가 중요하기 때문입니다.

구분함수 (Function)메소드 (Method)
소속없음 (독립적)클래스/객체에 소속됨
사용법함수명()객체명.메소드명()
첫 번째 인자제약 없음관례적으로 self를 사용
데이터 활용전달받은 매개변수만 사용self를 통해 객체 내부 데이터 접근 가능

요약하자면

  • def를 밖에서 하면? → 함수를 만든 것.
  • def를 클래스 안에서 하면? → 그 클래스의 메소드를 만든 것.

처음에 말씀하신 “점 찍는 메소드”들은 모두 어떤 클래스(리스트, 문자열 등) 안에 미리 만들어진 함수들이었던 셈이죠!

이제 클래스 안에서 메소드를 만들 때 꼭 붙는 self가 구체적으로 어떤 역할을 하는지 한 번 알아볼까요? 아니면 직접 메소드를 가진 간단한 클래스를 하나 만들어보시겠어요?