시험공부빅데이터분석
← 보드클래스와 상속 · 2/12

__init__과 self — 객체가 만들어질 때 일어나는 일 ★★★

클래스를 읽을 때 가장 먼저 만나는 두 가지가 __init__과 self예요.

s1 = Student("Kim", 95)가 실행될 때 컴퓨터 속에서는 이런 일이 차례로 일어나요.

순서일어나는 일
1비어 있는 새 Student 객체를 하나 만들어요
2그 객체의 __init__을 자동으로 호출해요. self에는 방금 만든 객체가 들어가고, name에는 "Kim", score에는 95가 들어가요
3self.name = name → 이 객체의 name 칸에 "Kim" 저장. self.score = score → score 칸에 95 저장
4완성된 객체에 s1이라는 이름표를 붙여요
self 사용 규칙

메서드를 정의할 때는 첫 번째 칸에 self를 쓰지만, 호출할 때는 self를 직접 넘기지 않아요. s1.introduce()라고 부르면 파이썬이 자동으로 s1을 self 자리에 넣어 줘요. 그래서 s1.introduce()는 Student.introduce(self=s1)과 같은 뜻이에요.

왜 self.name처럼 앞에 self.를 붙일까요? self.name은 "이 객체의 name 칸"이고, name은 그냥 함수 안에서만 쓰는 임시 변수라서 둘은 달라요. 메서드 안에서 self 없이 name만 쓰면 이름이 없다는 에러(NameError)가 나요. 교수님도 이 실수를 "흔한 실수"로 짚었어요. self.name = name에서 좌우 이름이 꼭 같아야 하는 것은 아니지만 보통 맞춰요.

객체마다 상태가 독립이라는 것도 코드로 확인해 볼게요.

s1 = Student("Kim", 95) s2 = Student("Lee", 88) s1.score = 100 print(s1.score, s2.score) s1.introduce()
100 88 이름: Kim, 점수: 100
코드 줄무슨 뜻
s1.score = 100s1의 score 칸만 100으로 바꿔요. s2는 그대로 88
print(s1.score, s2.score)100 88 (서로 독립)
s1.introduce()introduce 안의 self는 s1이라서 s1의 값(Kim, 100)이 나와요
외우기 팁

"self = 지금 부른 그 객체". s1.introduce()면 self는 s1, s2.introduce()면 self는 s2예요. 메서드 안의 self.xxx는 항상 그 객체의 값이에요.

시험엔 이렇게 써요 — 이렇게 고르세요

__init__()은 instance가 생성될 때 자동으로 실행되어 초기 상태를 저장하고, self는 현재 메서드를 호출한 instance 자신을 가리킨다. 메서드를 정의할 때는 self를 쓰지만 호출할 때는 직접 전달하지 않는다. 코드를 따라갈 때는 메서드 안의 self를 "지금 부른 객체 이름"으로 바꿔 읽으세요.

잠깐 확인 — s2.introduce()를 실행할 때 introduce 안의 self는 누구인가요?

s2예요. 점 앞의 객체가 self 자리에 자동으로 들어가요.

다음 카드 → 메서드와 상태 변화 따라가기 ★★

자료: 3~4주차 · Week03_Class_for_PyTorch(pdf, ipynb 업데이트본) · 빅데이터03(3주차)·빅데이터04(4주차) 녹취