파이썬에서 클라스 내부 함수인 메소드를 정의하고 호출할 때 self와 __init__을 활용할 수 있습니다. 이는 정확히 어떤 의미와 용도인 것일까요? 예시를 통해 자세히 살펴보도록 하겠습니다.
self 설명
다음과 같이 식당에서 인원 수에 따라 메뉴를 주문하는 간단한 클라스가 하나 있다고 해보겠습니다.
class Cooking:
    def makingLunch(self, menu, people):
        print(menu + " " + people + "인분 준비 중입니다.")
order = Cooking()
order.makingLunch("김밥", "3")
# 김밥 3인분 준비 중입니다.위 makingLunch 함수는 첫 번째 인자로 self를 받고 두 번째, 세번 째 인자로 menu와 people을 받습니다.
여기서 menu와 people에는 사용자 지정 값인 "김밥과 "3"이 각각 대입되지만, "첫 번째 인자인 self에는 클라스를 호출한 order 인스턴스가 대입됩니다. 아래에서 이를 확인할 수 있습니다.
class Cooking:
    def makingLunch(self, menu, people):
        print(menu + " " + people + "인분 준비 중입니다.")
        print(self == order)
order = Cooking()
order.makingLunch("김밥", "3")
# 김밥 3인분 준비 중입니다.
# True정리하자면 클라스 내에서 self는 이를 호출한 인스턴스를 의미합니다. 따라서 self를 다음과 같이 활용해볼 수 있습니다.
class Cooking:
    def waiting(self, number):
        self.number = number
    def makingLunch(self, menu, people):
        print(self.number + "번 고객님, " + menu + " " + people + "인분 준비 중입니다.")
order = Cooking()
order.number = "1"
order.makingLunch("김밥", "3")
# 1번 고객님, 김밥 3인분 준비 중입니다.__init__ 설명
이제 __init__에 대해 알아보도록 하겠습니다. __init__은 클라스를 통해 인스턴스를 생성할 때 항상 실행되는 부분을 의미합니다.
예시를 들어 살펴보도록 하겠습니다. 이전의 Cooking 클라스 코드에서는 다음과 같이 출력 문구를 바꾸면 주문 번호(self.number)를 할당하지 않아도 주문을 진행할 수 있습니다.
class Cooking:
    def waiting(self, number):
        self.number = number
    def makingLunch(self, menu, people):
        print("고객님, " + menu + " " + people + "인분 준비 중입니다.")
order = Cooking()
order.makingLunch("김밥", "3")
# 고객님, 김밥 3인분 준비 중입니다.물론, 기존 코드에서 주문 번호를 입력하지 않으면 다음과 같이 에러가 발생합니다.
class Cooking:
    def waiting(self, number):
        self.number = number
    def makingLunch(self, menu, people):
        print(self.number + "번 고객님, " + menu + " " + people + "인분 준비 중입니다.")
order = Cooking()
order.makingLunch("김밥", "3")
# AttributeError: 'Cooking' object has no attribute 'number'그러나 앞서 살펴본 것처럼 출력 문구에 number가 사용되지 않는 경우, 사용자는 이를 입력하지 않아도 Cooking 클라스를 사용할 수 있습니다.
대기 번호가 없이는 주문을 할 수 없도록 할 수는 없을까요?
다음과 같이 waiting 함수의 이름을 __init__으로 대체하면, 클라스를 통해 인스턴스를 생성할 때 반드시 number 인자를 함께 넘겨줘야 호출이 가능합니다.
class Cooking:
    def __init__(self, number):
        self.number = number
    def makingLunch(self, menu, people):
        print("고객님, " + menu + " " + people + "인분 준비 중입니다.")
order = Cooking()
order.makingLunch("김밥", "3")
# TypeError: Cooking.__init__() missing 1 required positional argument: 'number'번호를 입력하지 않았더니 오류가 발생했습니다. 이번에는 번호를 입력해보겠습니다.
class Cooking:
    def __init__(self, number):
        self.number = number
    def makingLunch(self, menu, people):
        print(self.number + "번 고객님, " + menu + " " + people + "인분 준비 중입니다.")
order = Cooking("2")
order.makingLunch("김밥", "3")
# 2번 고객님, 김밥 3인분 준비 중입니다.예상했던 문구가 정상적으로 출력되었습니다. 마지막으로 다음과 같이 코드를 조금 수정하여 사용자로부터 대기 번호를 받고 문구를 출력할 수 있습니다.
class Cooking:
    def __init__(self, number):
        self.number = number
    def makingLunch(self, menu, people):
        print(self.number + "번 고객님, " + menu + " " + people + "인분 준비 중입니다.")
order = Cooking(input(str("주문 번호를 입력하세요: ")))
order.makingLunch("김밥", "3")
# 주문 번호를 입력하세요: 2
# 2번 고객님, 김밥 3인분 준비 중입니다.'개발 > Python' 카테고리의 다른 글
| 파이썬 클라스 설명 (2) 인스턴스와 메소드란? (0) | 2021.12.13 | 
|---|---|
| 파이썬 클라스 설명 (1) 클라스란? (0) | 2021.12.13 | 
| 파이썬 함수 설명 (2) 변수와 스코프 (0) | 2021.12.09 | 
