Python 클래스와 __init__
요약
Python 클래스의 기본 구조, __init__ 생성자, 인스턴스 메서드, 상속(super)까지. 정보처리기사 실기에 출제되는 클래스 관련 핵심 개념을 정리합니다.
클래스 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| class | 클래스 정의 키워드 | class Gamja: |
| init | 객체 생성 시 자동 호출되는 생성자 | def __init__(self, v): |
| self | 현재 인스턴스(객체)를 가리키는 매개변수 | self.v = v |
| 클래스 속성 | 클래스 자체에 속하는 속성, 모든 인스턴스가 공유 | class A: li = [1, 2, 3] |
| 인스턴스 속성 | __init__ 안에서 self로 정의하는 속성 | self.name = name |
| 인스턴스 메서드 | 첫 인자로 self를 받아 인스턴스를 조작 | def add(self, x): |
| 상속 / super | 부모 클래스 기능을 자식이 물려받음 | class B(A): super().__init__(v) |
클래스란? 쌩기초
클래스(Class) 는 객체를 만들기 위한 설계도입니다. class 키워드로 정의하며, 속성(데이터)과 메서드(동작)를 하나로 묶습니다.
클래스 이름은 대문자로 시작하는 것이 관례입니다. Gamja() 처럼 클래스 이름 뒤에 괄호를 붙여 인스턴스를 생성합니다.
init 생성자 기초
__init__ 은 인스턴스를 생성할 때 자동으로 호출되는 특별한 메서드입니다. 양쪽에 언더스코어 두 개(__)가 있어 던더(dunder) 메서드 라고도 부릅니다.
__init__의 첫 번째 매개변수는 반드시 self 입니다. self는 생성된 인스턴스 자신을 가리키며, Python이 자동으로 전달합니다. Node(10) 을 호출할 때 self에는 새로 만들어진 인스턴스가, v에는 10이 전달됩니다.
클래스 속성 vs 인스턴스 속성 기초
클래스 속성과 인스턴스 속성은 정의 위치가 다릅니다.
클래스 속성은 모든 인스턴스가 공유합니다. 인스턴스를 통해서도, 클래스 이름을 통해서도 접근할 수 있습니다.
인스턴스 속성은 각 인스턴스마다 별도로 존재합니다.
| 구분 | 정의 위치 | 공유 여부 | 접근 방법 |
|---|---|---|---|
| 클래스 속성 | 클래스 블록 (메서드 밖) | 모든 인스턴스가 공유 | 클래스명.속성 또는 인스턴스.속성 |
| 인스턴스 속성 | __init__ 안 (self.속성) | 인스턴스마다 독립 | 인스턴스.속성 |
인스턴스 메서드 기초
인스턴스 메서드는 클래스 블록 안에서 def로 정의하면서 첫 번째 매개변수로 self를 받는 함수입니다. self를 통해 해당 인스턴스의 속성(self.속성)을 읽거나 수정할 수 있으므로, 인스턴스의 상태를 바꾸는 용도로 씁니다.
b.add(10)을 호출하면 Python은 내부적으로 Bag.add(b, 10)처럼 첫 번째 자리에 인스턴스 b를 자동으로 넣어 줍니다. 그래서 메서드 안에서 self.items는 곧 b.items가 됩니다.
메서드 안에서 리스트 속성 조작하기
__init__에서 리스트로 초기화한 속성(self.items = [])은 인스턴스 메서드에서 append·+=·인덱싱으로 자유롭게 조작할 수 있습니다. 시험에 자주 나오는 형태는 메서드가 값을 저장하고, 다른 메서드가 합/평균 등을 반환하는 구조입니다.
클래스 활용 예제 심화
아래는 정보처리기사 실기에 출제된 것과 유사한 Node 클래스 활용 예제입니다.
각 Node 인스턴스는 v(값)와 c(자식 목록)를 독립적으로 가집니다. root.c에 자식 노드를 추가하면 트리 구조를 만들 수 있습니다.
클래스 상속과 super() 심화
상속(inheritance) 은 이미 만든 클래스를 확장하여 새 클래스를 만드는 기능입니다. class 자식(부모): 형태로 선언하면 자식 클래스는 부모 클래스의 속성과 메서드를 그대로 물려받습니다.
super().__init__() — 부모의 생성자 호출
자식 클래스에서도 __init__을 다시 정의하면, 부모의 __init__은 자동으로 호출되지 않습니다. 부모의 초기화 로직(여기서는 self.name = name)을 그대로 쓰고 싶다면 super().__init__(...)으로 직접 호출해 줘야 합니다.
| 표현 | 의미 |
|---|---|
class B(A): | B가 A를 상속 (A의 속성·메서드를 물려받음) |
super().__init__(...) | B 안에서 부모 A의 __init__ 을 호출 |
| 메서드 오버라이딩 | 자식 클래스에서 같은 이름의 메서드를 새로 정의하면 자식 버전이 우선 적용 |
상속 풀이 체크리스트
class 자식(부모):에서 부모가 누구인지 확인합니다.- 자식
__init__안에서super().__init__(...)을 호출하는지 확인합니다. 호출하지 않으면 부모의 초기화 로직은 실행되지 않습니다. - 같은 이름의 메서드가 부모·자식 양쪽에 있으면 자식 쪽이 우선 실행됩니다 (오버라이딩).
- 자식 인스턴스(
c = Circle(5))의 속성을 읽을 때 자식에 없으면 부모에서 찾습니다.c.name은 부모__init__이 넣어 준self.name을 읽은 결과입니다.