생성자(Constructor)와 메서드(Method) — 객체에 데이터와 행동을 담기
지난 화에서는 객체를 만든 다음 점(.)으로 속성을 하나씩 넣어줬습니다.
학생 한 명 만드는 데만 4줄이 필요했죠.
이번에는 객체가 만들어지는 순간 자동으로 실행되는 생성자(Constructor)로 속성을 한 번에 채우고,
객체가 스스로 할 수 있는 행동인 메서드(Method)까지 이어서 배웁니다.
요즘은 고등학교에서도 코딩을 정규 과목으로 가르치는 시대입니다. 전공자가 아니어도 바이브 코딩(Vibe Coding)이나 생성형 AI(Generative AI)를 활용하면 누구나 그럴듯한 코드 결과물을 만들어낼 수 있게 되었죠.
개발 언어를 접하는, 전공자가 아닌 일반인 입문자가 많아진 것입니다.
이 시리즈는 글쓴이가 실제로 일반인, 고등학생 등 비전공자·입문자에게 파이썬을 가르치면서 정리한 내용들을 교재 형식으로 엮은 글입니다.최대한 쉽고 친절하게 설명하면서도, 컴퓨터와 프로그래밍 언어에 대한 기초 이론까지 함께 짚고 넘어가려 합니다.
고등학생, 비전공자, 완전 입문자도 따라올 수 있게끔 만든 시리즈이고, 실제 과외 수업 자료를 바탕으로 만들어서 학교 시험처럼 개념 확인 문제도 그대로 들어있어요.
중간중간 빈칸 채우기랑 학교 시험 유형 문제가 나오는데, 정답은 바로 안 보이게 접어뒀습니다. 먼저 스스로 생각해본 다음 "보기"를 눌러서 확인해보세요.

지난 시간에는 학생을 만들 때 이렇게 했습니다.
pass
student = Student()
student.name = "김철수"
student.age = 17
student.score = 95
학생 한 명을 만드는 데 무려 4줄이나 필요합니다. 학생이 100명이면 student1.name = ..., student1.age = ... 식으로 300줄 넘게 길어져요.
회원가입을 생각해 봅시다. 회원가입할 때 이름, 나이, 이메일을 입력하면 회원이 만들어집니다. 학생도 마찬가지예요.
학생을 만들 때 처음부터 이름, 나이, 점수를 같이 입력하면 훨씬 편하겠죠?
이 기능을 하는 것이 생성자(Constructor)입니다.
생성자란, 객체가 만들어질 때 자동으로 실행되는 특별한 함수예요. 이 함수의 이름은 __init__으로 정해져 있습니다. (앞뒤로 언더바 두 개씩이에요.)
def __init__(self):
print("학생이 생성되었습니다.")
우리가 student.__init__()을 직접 호출하지 않았는데도 자동으로 실행됐어요. Student()라고 객체를 만드는 순간, 파이썬이 알아서 __init__을 호출해줍니다.
학생들이 가장 어려워하는 부분이에요. 입문 단계에서는 "지금 만들어지고 있는 객체 자신"이라고 이해하면 충분합니다.
예를 들어 student1 = Student()이면, __init__ 안에서 self는 곧 student1을 의미해요.
def __init__(self):
self.name = "김철수"
print(student.name)
이제 학생마다 이름이 달라야 합니다.
def __init__(self, name):
self.name = name
print(student.name)
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
print(student.name)
print(student.age)
print(student.score)
student2 = Student("이영희", 18, 88)
print(student1.name)
print(student2.name)
이영희
student = Student()student.name = "김철수"student.age = 17student.score = 95
student = Student("김철수", 17, 95)
이 한 줄이면 끝납니다.
- self를 빼먹음 —
def __init__(name):처럼 self가 없으면 오류가 납니다. 반드시def __init__(self, name):처럼 첫 번째 자리에 self가 있어야 해요. - self.name을 안 씀 —
name = name처럼 쓰면 매개변수 name 값이 그냥 사라져 버려요. 반드시self.name = name이어야 객체 안에 값이 저장됩니다. 왼쪽의self.name은 객체의 속성이고, 오른쪽의name은 매개변수로 전달받은 값이에요. 이 둘을 연결하는 작업이 바로self.name = name입니다. - 매개변수 개수가 안 맞음 —
def __init__(self, name, age):처럼 매개변수가 2개(self 제외)로 정의되어 있으면,Student("김철수")처럼 값을 1개만 넘기면 오류가 발생해요. 정의한 개수와 호출할 때 넘기는 개수가 같아야 합니다.
def __init__(self, name, score):
self.name = name
self.score = score
students = []
students.append(Student("김철수", 95))
students.append(Student("이영희", 88))
students.append(Student("박민수", 76))
print("===== 학생 목록 =====")
for student in students:
print(student.name, "-", student.score)
김철수 - 95
이영희 - 88
박민수 - 76
생성자 덕분에 Student("김철수", 95)처럼 객체를 만들면서 바로 값을 채워 넣을 수 있어요. 리스트에 append()로 바로 추가하는 것도 가능해서, 코드가 훨씬 짧고 읽기 편해집니다.
- 객체가 만들어질 때 자동으로 실행되는 함수는 입니다.
- 객체 자기 자신을 가리키는 변수는 입니다.
- 빈칸을 완성하세요.
class Dog:
def __init__(, name):
self.name = name
정답
2. self
3. self
- 다음 코드의 실행 결과를 작성하시오.
class Cat:
def __init__(self, name):
self.name = name
cat = Cat("나비")
print(cat.name) self.name = name에서 왼쪽self.name과 오른쪽name의 차이를 서술하시오.
정답
2. 왼쪽 self.name은 객체(self)의 속성이고, 오른쪽 name은 생성자가 매개변수로 전달받은 값입니다. self.name = name은 전달받은 값을 객체의 속성으로 저장하는 연결 작업입니다.
Student 객체에 이름, 나이, 점수와 같은 정보를 저장했습니다. 그런데 학생은 정보만 가지고 있는 것이 아니에요.
학생은 자기 정보를 출력할 수도 있고, 공부를 할 수도 있고, 시험을 볼 수도 있습니다.
이처럼 객체가 할 수 있는 행동(기능)을 메서드(Method)라고 합니다. 메서드는 한마디로 클래스 안에 만든 함수예요.
사람을 생각해 봅시다. 사람은 이름, 나이만 가지고 있는 것이 아니라 걷기, 먹기, 공부하기도 할 수 있습니다.
Student도 같아요 — 이름·나이·점수 같은 속성과, 정보 출력·공부하기·시험 보기 같은 메서드를 함께 가집니다.
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
지금은 데이터만 저장하고 있어요. 여기에 "할 수 있는 행동"을 추가해봅시다.
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def show_info(self):
print("이름 :", self.name)
print("나이 :", self.age)
print("점수 :", self.score)
메서드도 함수처럼 def로 만들지만, 클래스 안에 들여쓰기해서 정의하고, 첫 번째 매개변수로 항상 self를 받아요. self가 있어야 "누구의 이름/나이/점수인지" 알 수 있기 때문입니다.
student.show_info()
나이 : 17
점수 : 95
학생이 공부하면 점수가 10점 오른다고 가정합니다.
self.score += 10
print("열심히 공부했습니다.")
student.study()
student.show_info()
이름 : 김철수
나이 : 17
점수 : 105
여기서 "객체 안의 값이 바뀌네!"를 처음 느끼게 돼요. self.score += 10은 객체 자신이 가지고 있는 score 값을 직접 변경하는 것입니다. 메서드를 호출하고 나면 그 객체의 속성 값이 실제로 바뀌어 있어요.
self.score = score
print("시험을 봤습니다.")
student.show_info()
이름 : 김철수
나이 : 17
점수 : 88
exam은 self 말고도 score라는 매개변수를 하나 더 받아요. 메서드도 일반 함수처럼 매개변수를 여러 개 가질 수 있습니다 — 다만 맨 앞자리는 항상 self라는 점이 다릅니다.
student2 = Student("이영희", 18, 80)
student1.study()
student2.exam(100)
student1.show_info()
print()
student2.show_info()
나이 : 17
점수 : 105
이름 : 이영희
나이 : 18
점수 : 100
학생들이 가장 헷갈리는 부분이에요. student1.study()를 호출하면, 그 메서드 안의 self는 student1이 됩니다. student2.study()를 호출하면, 이번에는 self가 student2가 돼요.
즉, 같은 메서드 코드를 쓰더라도 누가 호출했는지에 따라 self가 가리키는 객체가 달라집니다. 그래서 student1.study()는 student1의 점수만 바꾸고, student2의 점수는 그대로 남아있는 거예요.
이전에 만든 함수 hello()와, 지금 만든 메서드 student.study(), student.show_info()는 근본적으로 같아요 — 둘 다 def로 만든 코드 묶음입니다.
차이점은, 메서드는 클래스 안에 정의되어 특정 객체에 속한 함수라는 것이에요. 그래서 호출할 때도 student.study()처럼 어떤 객체의 것인지 .으로 표시해서 부릅니다.
- self를 빼먹음 —
def study():처럼 self가 없으면 오류가 납니다. 반드시def study(self):예요. - self.score 대신 score 사용 —
score += 10이라고 쓰면 객체의 속성이 아니라 지역변수로 취급돼요. 객체의 속성을 사용할 때는 반드시self.score += 10처럼self.을 붙여야 합니다. - 메서드 호출 시 괄호를 빼먹음 —
student.study처럼 괄호가 없으면 메서드 자체를 가리키기만 할 뿐 실제로 실행되지 않아요. 반드시student.study()처럼 괄호를 붙여야 합니다.
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def show_info(self):
print(f"이름 : {self.name}")
print(f"나이 : {self.age}")
print(f"점수 : {self.score}")
def study(self):
self.score += 10
def exam(self, score):
self.score = score
student = Student("김철수", 17, 95)
student.show_info()
print()
student.study()
student.show_info()
print()
student.exam(88)
student.show_info()
나이 : 17
점수 : 95
이름 : 김철수
나이 : 17
점수 : 105
이름 : 김철수
나이 : 17
점수 : 88
- 클래스 안에 정의된 함수를 (이)라고 합니다.
- 메서드의 첫 번째 매개변수로 항상 들어가는 것은 입니다.
student1.study()를 호출하면 self는 무엇을 가리키나요?
정답
2. self
3. student1
- 다음 코드의 실행 결과를 작성하시오.
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(self.name, "멍멍!")
dog = Dog("콩이")
dog.bark() - 메서드와 일반 함수의 공통점과 차이점을 서술하시오.
정답
2. 공통점은 둘 다 def로 만든 코드 묶음이라는 것입니다. 차이점은 메서드는 클래스 안에 정의되어 특정 객체에 속한 함수이며, 첫 번째 매개변수로 항상 self를 받고, object.method() 형태로 호출한다는 점입니다.
'Language > Python' 카테고리의 다른 글
| [고등학생부터, 파이썬] 20. 클래스 (Class) (0) | 2026.09.14 |
|---|---|
| [고등학생부터, 파이썬] 19. 예외처리(Exception) (0) | 2026.09.07 |
| [고등학생부터, 파이썬] 18. 파일 입출력 (1) | 2026.09.04 |
| [고등학생부터, 파이썬] 17. 모듈 ( + random , math, datetime ) (0) | 2026.09.04 |
| [고등학생부터, 파이썬] 16. 함수 종합 프로젝트 (0) | 2026.09.01 |
댓글