Python 클래스와 __init__
선수학습(1개)
요약
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 키워드로 정의하며, 속성(데이터)과 메서드(동작)를 하나로 묶습니다.

클래스(설계도)로 만든 실제 객체 하나하나를 인스턴스(instance) 라고 합니다. 위 코드의 g와 h는 모두 Gamja 클래스의 인스턴스입니다. 이처럼 같은 클래스로 인스턴스를 여러 개 만들 수 있습니다.
클래스 이름은 대문자로 시작하는 것이 관례입니다. Gamja() 처럼 클래스 이름 뒤에 괄호를 붙여 인스턴스를 생성합니다.
init 생성자
__init__ 은 인스턴스를 생성할 때 자동으로 호출되는 특별한 메서드입니다. 양쪽에 언더스코어 두 개(__)가 있어, double underscore를 줄인 던더(dunder) 메서드 라고도 부릅니다.

__init__의 첫 번째 매개변수는 반드시 self 입니다. self는 생성된 인스턴스 자신을 가리키며, Python이 자동으로 전달합니다. Node(10) 을 호출할 때 self에는 새로 만들어진 인스턴스가, v에는 10이 전달됩니다.
클래스 속성 vs 인스턴스 속성
클래스 속성과 인스턴스 속성은 정의 위치가 다릅니다.
클래스 속성은 모든 인스턴스가 공유합니다. 인스턴스를 통해서도, 클래스 이름을 통해서도 접근할 수 있습니다.
![s.li는 인스턴스 s에 li가 없어 class Gamja의 클래스 속성 영역에서 찾고, Gamja.li는 클래스로 바로 들어가 두 경로가 같은 리스트 [1, 2, 3]에 도착하는 다이어그램](/_next/image?url=%2Fcoding%2Fpython%2Fclass%2Fclass-attr-shared.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
인스턴스 속성은 각 인스턴스마다 별도로 존재합니다.

| 구분 | 정의 위치 | 공유 여부 | 접근 방법 |
|---|---|---|---|
| 클래스 속성 | 클래스 블록 (메서드 밖) | 모든 인스턴스가 공유 | 클래스명.속성 또는 인스턴스.속성 |
| 인스턴스 속성 | __init__ 안 (self.속성) | 인스턴스마다 독립 | 인스턴스.속성 |
인스턴스 메서드
인스턴스 메서드는 클래스 블록 안에 def로 정의한 함수입니다. 인스턴스로 호출하면 Python이 첫 번째 매개변수에 그 인스턴스를 자동으로 넣어 주기 때문에, 첫 매개변수를 self로 받아 두는 것이 규칙입니다. self를 통해 해당 인스턴스의 속성(self.속성)을 읽거나 수정할 수 있으므로, 인스턴스의 상태를 바꾸는 용도로 씁니다. 이름에 "인스턴스"가 붙는 이유는 메서드가 호출한 그 인스턴스에 묶여 동작하기 때문입니다. b.add(10)은 b의 속성을, 다른 인스턴스 b2.add(10)은 b2의 속성을 바꿉니다.
b.add(10)을 호출하면 Python은 내부적으로 Bag.add(b, 10)처럼 첫 번째 자리에 인스턴스 b를 자동으로 넣어 줍니다. 그래서 메서드 안에서 self.items는 곧 b.items가 됩니다.
![b = Bag() 인스턴스와, b.add(10)·b.add(20)·b.add(30)·b.total() 호출이 Bag.add(b, x)·Bag.total(b)로 바뀌어 self에 b가 들어가면서 items가 [ ]→[10]→[10, 20]→[10, 20, 30]으로 바뀌고 sum이 60을 반환하는 과정을 나타낸 표](/_next/image?url=%2Fcoding%2Fpython%2Fclass%2Fbag-instance-method.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
메서드 안에서 리스트 속성 조작하기
__init__에서 리스트로 초기화한 속성(self.items = [])은 인스턴스 메서드에서 append·+=·인덱싱으로 자유롭게 조작할 수 있습니다. 시험에 자주 나오는 형태는 메서드가 값을 저장하고, 다른 메서드가 합/평균 등을 반환하는 구조입니다.
![실선 테두리의 Grade g 인스턴스(name 감자, scores [90, 80, 70])와, g.put(90)·g.put(80)·g.put(70)·g.avg() 호출이 Grade.put(g, s)·Grade.avg(g)로 바뀌어 self에 g가 들어가면서 scores가 [ ]→[90]→[90, 80]→[90, 80, 70]으로 늘고 avg가 240 / 3 = 80.0을 반환하는 과정을 나타낸 표](/_next/image?url=%2Fcoding%2Fpython%2Fclass%2Fgrade-list-attr.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
클래스 활용 예제
아래는 정보처리기사 실기에 출제된 것과 유사한 Node 클래스 활용 예제입니다.
![Node root의 c 리스트 칸 [0], [1]에 child1, child2가 들어 있고, root.c[0].v를 따라가면 child1의 v 값 2에 도착하는 트리 다이어그램](/_next/image?url=%2Fcoding%2Fpython%2Fclass%2Fnode-tree.webp&w=3840&q=75&dpl=dpl_ALinWL5oQc9uopQwdKtTaoaNYcLW)
각 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을 읽은 결과입니다.