파이썬에서 클라스 내부 함수인 메소드를 정의하고 호출할 때 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 |