💻 프로그래밍

메서드

Method

객체에 속한 함수. 클래스의 동작을 정의. 인스턴스 메서드, 클래스 메서드, 정적 메서드로 구분.

📖 상세 설명

메서드(Method)는 객체에 속한 함수로, 클래스가 수행할 수 있는 동작을 정의합니다. 일반 함수와 달리 메서드는 객체의 상태(필드)에 접근하고 수정할 수 있으며, 객체의 컨텍스트에서 실행됩니다.

메서드는 크게 세 종류로 나뉩니다. 인스턴스 메서드는 객체 인스턴스에서 호출되며 this/self를 통해 인스턴스 데이터에 접근합니다. 클래스 메서드는 클래스 자체에서 호출되며 cls를 통해 클래스 속성에 접근합니다. 정적 메서드는 인스턴스나 클래스와 무관하게 동작합니다.

메서드 오버로딩(같은 이름, 다른 파라미터)과 오버라이딩(상속받아 재정의)은 다형성을 구현하는 핵심 기법입니다. Java, C++은 오버로딩을 지원하지만, Python은 기본적으로 지원하지 않아 기본값이나 *args로 비슷한 효과를 냅니다.

getter/setter 메서드는 필드에 대한 접근을 제어합니다. Python의 @property 데코레이터나 Java의 접근자/설정자 패턴이 대표적입니다. 이를 통해 캡슐화를 유지하면서 값 검증이나 부가 로직을 추가할 수 있습니다.

💻 코드 예제

Python
class BankAccount:
    interest_rate = 0.02  # 클래스 변수

    def __init__(self, owner, balance=0):
        self.owner = owner
        self._balance = balance  # 보호된 속성

    # 인스턴스 메서드: self를 통해 인스턴스 접근
    def deposit(self, amount):
        if amount > 0:
            self._balance += amount
            return True
        return False

    def withdraw(self, amount):
        if 0 < amount <= self._balance:
            self._balance -= amount
            return True
        return False

    # Property: getter/setter 역할
    @property
    def balance(self):
        return self._balance

    # 클래스 메서드: cls를 통해 클래스 접근
    @classmethod
    def set_interest_rate(cls, rate):
        cls.interest_rate = rate

    # 정적 메서드: 인스턴스/클래스와 무관
    @staticmethod
    def validate_amount(amount):
        return isinstance(amount, (int, float)) and amount > 0

# 사용 예시
account = BankAccount("김개발", 1000)
account.deposit(500)
print(f"잔액: {account.balance}")  # 1500
BankAccount.set_interest_rate(0.03)  # 클래스 메서드 호출

🗣️ 실무 대화 예시

주니어 개발자
"이 유틸리티 함수를 어디에 둬야 할지 모르겠어요. 클래스 안에 넣어야 하나요?"
시니어 개발자
"인스턴스 상태를 사용하지 않는다면 정적 메서드나 모듈 레벨 함수로 두는 게 좋아요. 불필요하게 클래스에 묶을 필요 없습니다."
주니어 개발자
"정적 메서드와 클래스 메서드의 차이는 뭔가요?"
면접관
"메서드 오버로딩과 오버라이딩의 차이를 설명해주세요."
지원자
"오버로딩은 같은 이름의 메서드를 파라미터를 다르게 정의하는 것이고, 오버라이딩은 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것입니다."
면접관
"Python에서 private 메서드를 만드는 방법은?"
지원자
"언더스코어 두 개로 시작하면 네임 맹글링이 적용됩니다. __method처럼요. 하지만 진정한 private은 아니고 관례상 내부용임을 표시하는 것입니다."
리뷰어
"이 메서드가 20줄이 넘어가네요. 하나의 메서드는 하나의 일만 해야 합니다. 분리해주세요."
작성자
"검증, 변환, 저장 단계를 각각 private 메서드로 분리하겠습니다."
리뷰어
"그리고 self를 사용하지 않는 메서드는 @staticmethod로 표시해주세요. 의도가 명확해집니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기