[학습 일기 #12] Python Class, 객체 생성 과정의 이해

Ariel_Jeong·2025년 12월 23일

[학습 일기 시리즈]

목록 보기
12/44

오늘은 Python에서 "class"에 대해 이해하려고 고군분투한 하루였다.

단순히 문법을 외우는 단계를 넘어서,
객체가 생성되고 상태를 가지는 흐름을 구조적으로 이해하기 위해 노력해 보았다.




1. Class란?

instance(객체)만들기 위한 도구.

비유하자면,

  • class = 설계도
  • instance(객체) = 그 설계도로 만들어진 실제 대상

이라고 볼 수 있다.



1.1. class의 기본 구조

class 클래스명:
    def __init__(self, ...):
    ...

    def method명(self, ...):
    ...
  • __init__: 객체가 생성될 때 자동으로 호출되는 초기화 함수.
    객체를 만드는 함수가 아니라 이미 만들어진 객체를 주어진 정보를 토대로 세팅하는 함수이다.
    ...부분에 객체의 상태를 정의하기 위해 필요한 정보의 종류에 대해 먼저 정의해야 한다.
  • method명: 객체가 수행할 수 있는 행동. 객체의 상태를 읽거나 변경하는 데 사용할 수 있다.



1.2. self란?

"이 메소드를 호출한 객체 자신"

self.name = name    # 이 객체의 name이라는 속성에 값을 저장한다는 뜻



1.3. attribute란?

"객체나 클래스에 붙어 있는 이름 있는 값"


1.3.1. attribute의 종류

🔹 인스턴스 어트리뷰트 (instance attribute)

  • 객체 하나에만 속함
  • self.xxx 형태로 생성
  • 객체마다 값이 다를 수 있음
class Patient:
    def __init__(self, name):
        self.name = name

👉 객체의 상태(state) 를 표현


🔹 클래스 어트리뷰트 (class attribute)

  • 클래스 자체에 속함
  • 모든 인스턴스가 공유
class Patient:
    hospital = "서울병원"

👉 공통 규칙 / 공통 정보


정리하자면,

attribute란,
객체나 클래스에 소속된 모든 이름 있는 값이며, 데이터도 함수도 모두 attribute다.


2. class를 활용하여 문제 풀어보기

과제는 단순했다.

  • Patient 클래스를 만들고
  • 홍길동 환자를 생성한 뒤
  • 담당과를 변경하고 출력하기

하지만, 실행 버튼을 누르자 다음과 같은 에러가 떴다.

[캡쳐 1-1. 에러가 뜬 결과]



2.1. enumerate + dict 사용 실수

for i, person in enumerate({"name": "홍길동", "dept": "내분비내과"}):

위의 코드는 enumerate에 딕셔너리를 바로 넣어 key 값만 순회하도록 만든다.
enumerate를 사용하기 위해선 반드시 리스트 안에 딕셔너리가 있어야 한다.



2.2. 결정적 원인: __init__오타

def _init_(self, name, dept):

겉보기에는 맞아 보이지만,
파이썬이 생성자로 인식하는 이름은 반드시 __init__이다.

이렇듯 앞 뒤로 언더바가 두 개씩 존재하는 메소드를 매직 메소드(= 던더 메소드, Double UNDERscore method)라고 부른다.
매직 메소드이미 파이썬 내에 정의되어 있으며, 직접 호출해서 사용하지 않고, 정해진 규칙에 따라 알아서 호출되는 특징이 있다.

언더바 하나의 차이로 객체가 정상 생성되기도 하고
아예 생성자가 없는 클래스가 되기도 한다는 점이 인상 깊었다.



cf) __new____init__에 대한 이해 확장

매직 메소드에 대해 공부하면서 자연스럽게 이런 질문이 생겼다.

객체를 생성하는 메소드는 __new__라는데, 왜 우리는 __init__만 쓰는 걸까?

정리해보면 객체 생성은 두 단계다.

  • __new__: 객체 자체를 메모리에 생성
  • __init__: 생성된 객체의 초기 상태 설정

__new__를 사용하는 경우는 아래와 같다.

  • 불변 객체를 만들 때
  • 객체 생성을 통제하고 싶을 때
  • 객체 종류를 바꿔서 반환하고 싶을 때
  • 메타프로그래밍/프레임워크 레벨

이번 Patient 클래스에서는
객체의 "생성과정을 통제"할 필요가 없었고,
단순히 “생성된 객체의 상태를 정의”하면 충분했다.

그래서 __init__만 사용하는 것이 가장 자연스러운 선택이었다.



2.3. 결과


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


[캡쳐 1-3. enumerate를 사용하여 한번에 여러 환자 정보 입력]

결론적으로 환자 정보를 추가하는 방식을 고치고,
언더바를 두 개로 고쳐주자 정상적으로 실행되는 모습을 확인할 수 있었다.




[참고한 사이트 목록]

profile
R&D 분야의 경험을 토대로 커리어 확장에 도전중인 개발꿈나무입니다.

0개의 댓글