오늘은 Python에서 "class"에 대해 이해하려고 고군분투한 하루였다.
단순히 문법을 외우는 단계를 넘어서,
객체가 생성되고 상태를 가지는 흐름을 구조적으로 이해하기 위해 노력해 보았다.
instance(객체)를 만들기 위한 도구.
비유하자면,
이라고 볼 수 있다.
class 클래스명:
def __init__(self, ...):
...
def method명(self, ...):
...
__init__: 객체가 생성될 때 자동으로 호출되는 초기화 함수....부분에 객체의 상태를 정의하기 위해 필요한 정보의 종류에 대해 먼저 정의해야 한다.method명: 객체가 수행할 수 있는 행동. 객체의 상태를 읽거나 변경하는 데 사용할 수 있다.self란?"이 메소드를 호출한 객체 자신"
self.name = name # 이 객체의 name이라는 속성에 값을 저장한다는 뜻
"객체나 클래스에 붙어 있는 이름 있는 값"
self.xxx 형태로 생성class Patient:
def __init__(self, name):
self.name = name
👉 객체의 상태(state) 를 표현
class Patient:
hospital = "서울병원"
👉 공통 규칙 / 공통 정보
정리하자면,
attribute란,
객체나 클래스에 소속된 모든 이름 있는 값이며, 데이터도 함수도 모두 attribute다.
과제는 단순했다.
하지만, 실행 버튼을 누르자 다음과 같은 에러가 떴다.

[캡쳐 1-1. 에러가 뜬 결과]
for i, person in enumerate({"name": "홍길동", "dept": "내분비내과"}):
위의 코드는 enumerate에 딕셔너리를 바로 넣어 key 값만 순회하도록 만든다.
enumerate를 사용하기 위해선 반드시 리스트 안에 딕셔너리가 있어야 한다.
__init__오타def _init_(self, name, dept):
겉보기에는 맞아 보이지만,
파이썬이 생성자로 인식하는 이름은 반드시 __init__이다.
이렇듯 앞 뒤로 언더바가 두 개씩 존재하는 메소드를 매직 메소드(= 던더 메소드, Double UNDERscore method)라고 부른다.
매직 메소드는 이미 파이썬 내에 정의되어 있으며, 직접 호출해서 사용하지 않고, 정해진 규칙에 따라 알아서 호출되는 특징이 있다.
언더바 하나의 차이로 객체가 정상 생성되기도 하고
아예 생성자가 없는 클래스가 되기도 한다는 점이 인상 깊었다.
__new__와 __init__에 대한 이해 확장매직 메소드에 대해 공부하면서 자연스럽게 이런 질문이 생겼다.
객체를 생성하는 메소드는 __new__라는데, 왜 우리는 __init__만 쓰는 걸까?
정리해보면 객체 생성은 두 단계다.
__new__: 객체 자체를 메모리에 생성__init__: 생성된 객체의 초기 상태 설정__new__를 사용하는 경우는 아래와 같다.
이번 Patient 클래스에서는
객체의 "생성과정을 통제"할 필요가 없었고,
단순히 “생성된 객체의 상태를 정의”하면 충분했다.
그래서 __init__만 사용하는 것이 가장 자연스러운 선택이었다.

[캡쳐 1-2. enumerate를 안쓰고 환자 정보 입력]

[캡쳐 1-3. enumerate를 사용하여 한번에 여러 환자 정보 입력]
결론적으로 환자 정보를 추가하는 방식을 고치고,
언더바를 두 개로 고쳐주자 정상적으로 실행되는 모습을 확인할 수 있었다.
[참고한 사이트 목록]