본문 바로가기
Language/Python

[고등학생부터, 파이썬] 21. 생성자 (__init__) 와 메서드 (Method)

by kellis 2026. 9. 14.
반응형
고등학생부터, 파이썬 · 21화

생성자(Constructor)와 메서드(Method) — 객체에 데이터와 행동을 담기

지난 화에서는 객체를 만든 다음 점(.)으로 속성을 하나씩 넣어줬습니다.

학생 한 명 만드는 데만 4줄이 필요했죠.

이번에는 객체가 만들어지는 순간 자동으로 실행되는 생성자(Constructor)로 속성을 한 번에 채우고,

객체가 스스로 할 수 있는 행동인 메서드(Method)까지 이어서 배웁니다.

이 시리즈를 시작하며

요즘은 고등학교에서도 코딩을 정규 과목으로 가르치는 시대입니다. 전공자가 아니어도 바이브 코딩(Vibe Coding)이나 생성형 AI(Generative AI)를 활용하면 누구나 그럴듯한 코드 결과물을 만들어낼 수 있게 되었죠. 

개발 언어를 접하는, 전공자가 아닌 일반인 입문자가 많아진 것입니다.

이 시리즈는 글쓴이가 실제로 일반인, 고등학생 등 비전공자·입문자에게 파이썬을 가르치면서 정리한 내용들을 교재 형식으로 엮은 글입니다.최대한 쉽고 친절하게 설명하면서도, 컴퓨터와 프로그래밍 언어에 대한 기초 이론까지 함께 짚고 넘어가려 합니다.

 

고등학생, 비전공자, 완전 입문자도 따라올 수 있게끔 만든 시리즈이고, 실제 과외 수업 자료를 바탕으로 만들어서 학교 시험처럼 개념 확인 문제도 그대로 들어있어요.

중간중간 빈칸 채우기학교 시험 유형 문제가 나오는데, 정답은 바로 안 보이게 접어뒀습니다. 먼저 스스로 생각해본 다음 "보기"를 눌러서 확인해보세요.

Chapter 38
생성자(Constructor)와 __init__ · 만들면서 바로 채우기

지난 시간에는 학생을 만들 때 이렇게 했습니다.

python
class Student:
    pass

student = Student()
student.name = "김철수"
student.age = 17
student.score = 95

학생 한 명을 만드는 데 무려 4줄이나 필요합니다. 학생이 100명이면 student1.name = ..., student1.age = ... 식으로 300줄 넘게 길어져요.

선생님 설명 · 회원가입 이야기

회원가입을 생각해 봅시다. 회원가입할 때 이름, 나이, 이메일을 입력하면 회원이 만들어집니다. 학생도 마찬가지예요.

학생을 만들 때 처음부터 이름, 나이, 점수를 같이 입력하면 훨씬 편하겠죠?

이 기능을 하는 것이 생성자(Constructor)입니다.

생성자란, 객체가 만들어질 때 자동으로 실행되는 특별한 함수예요. 이 함수의 이름은 __init__으로 정해져 있습니다. (앞뒤로 언더바 두 개씩이에요.)

기본 문법
python
class Student:
    def __init__(self):
        print("학생이 생성되었습니다.")
객체 생성
python
student = Student()
학생이 생성되었습니다.

우리가 student.__init__()을 직접 호출하지 않았는데도 자동으로 실행됐어요. Student()라고 객체를 만드는 순간, 파이썬이 알아서 __init__을 호출해줍니다.

self란?

학생들이 가장 어려워하는 부분이에요. 입문 단계에서는 "지금 만들어지고 있는 객체 자신"이라고 이해하면 충분합니다.

예를 들어 student1 = Student()이면, __init__ 안에서 self는 곧 student1을 의미해요.

속성 저장하기
python
class Student:
    def __init__(self):
        self.name = "김철수"
python
student = Student()
print(student.name)
김철수
매개변수 받기

이제 학생마다 이름이 달라야 합니다.

python
class Student:
    def __init__(self, name):
        self.name = name
python
student = Student("김철수")
print(student.name)
김철수
여러 개의 값 받기
python
class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
python
student = Student("김철수", 17, 95)

print(student.name)
print(student.age)
print(student.score)
김철수 17 95
객체 여러 개 만들기
python
student1 = Student("김철수", 17, 95)
student2 = Student("이영희", 18, 88)

print(student1.name)
print(student2.name)
김철수
이영희
예전 방식 · 4줄

student = Student()
student.name = "김철수"
student.age = 17
student.score = 95

생성자 사용 · 1줄

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개만 넘기면 오류가 발생해요. 정의한 개수와 호출할 때 넘기는 개수가 같아야 합니다.
종합 예제 · 학생 관리 프로그램 (생성자 활용)
python
class Student:
    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()로 바로 추가하는 것도 가능해서, 코드가 훨씬 짧고 읽기 편해집니다.

빈칸 채우기
  1. 객체가 만들어질 때 자동으로 실행되는 함수는 입니다.
  2. 객체 자기 자신을 가리키는 변수는 입니다.
  3. 빈칸을 완성하세요.
    python
    class Dog:
        def __init__(, name):
            self.name = name
정답
1. __init__
2. self
3. self
학교 시험 유형
  1. 다음 코드의 실행 결과를 작성하시오.
    python
    class Cat:
        def __init__(self, name):
            self.name = name

    cat = Cat("나비")
    print(cat.name)
  2. self.name = name에서 왼쪽 self.name과 오른쪽 name의 차이를 서술하시오.
정답
1. 나비 — Cat("나비")로 객체를 만드는 순간 __init__이 자동 실행되어 self.name에 "나비"가 저장되고, cat.name으로 그 값을 꺼낼 수 있습니다.

2. 왼쪽 self.name은 객체(self)의 속성이고, 오른쪽 name은 생성자가 매개변수로 전달받은 값입니다. self.name = name은 전달받은 값을 객체의 속성으로 저장하는 연결 작업입니다.

 

Chapter 39
메서드(Method) · 객체가 할 수 있는 행동

Student 객체에 이름, 나이, 점수와 같은 정보를 저장했습니다. 그런데 학생은 정보만 가지고 있는 것이 아니에요.

학생은 자기 정보를 출력할 수도 있고, 공부를 할 수도 있고, 시험을 볼 수도 있습니다.

이처럼 객체가 할 수 있는 행동(기능)메서드(Method)라고 합니다. 메서드는 한마디로 클래스 안에 만든 함수예요.

선생님 설명 · 사람 이야기

사람을 생각해 봅시다. 사람은 이름, 나이만 가지고 있는 것이 아니라 걷기, 먹기, 공부하기도 할 수 있습니다.

Student도 같아요 — 이름·나이·점수 같은 속성과, 정보 출력·공부하기·시험 보기 같은 메서드를 함께 가집니다.

지금까지 만든 Student
python
class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

지금은 데이터만 저장하고 있어요. 여기에 "할 수 있는 행동"을 추가해봅시다.

첫 번째 메서드 · 학생 정보 출력
python
class Student:
    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가 있어야 "누구의 이름/나이/점수인지" 알 수 있기 때문입니다.

사용하기
python
student = Student("김철수", 17, 95)
student.show_info()
이름 : 김철수
나이 : 17
점수 : 95
두 번째 메서드 · 공부하기

학생이 공부하면 점수가 10점 오른다고 가정합니다.

python
def study(self):
    self.score += 10
    print("열심히 공부했습니다.")
python
student = Student("김철수", 17, 95)

student.study()
student.show_info()
열심히 공부했습니다.
이름 : 김철수
나이 : 17
점수 : 105

여기서 "객체 안의 값이 바뀌네!"를 처음 느끼게 돼요. self.score += 10객체 자신이 가지고 있는 score 값을 직접 변경하는 것입니다. 메서드를 호출하고 나면 그 객체의 속성 값이 실제로 바뀌어 있어요.

세 번째 메서드 · 시험 보기
python
def exam(self, score):
    self.score = score
    print("시험을 봤습니다.")
python
student.exam(88)
student.show_info()
시험을 봤습니다.
이름 : 김철수
나이 : 17
점수 : 88

examself 말고도 score라는 매개변수를 하나 더 받아요. 메서드도 일반 함수처럼 매개변수를 여러 개 가질 수 있습니다 — 다만 맨 앞자리는 항상 self라는 점이 다릅니다.

여러 객체 사용
python
student1 = Student("김철수", 17, 95)
student2 = Student("이영희", 18, 80)

student1.study()
student2.exam(100)

student1.show_info()
print()
student2.show_info()
이름 : 김철수
나이 : 17
점수 : 105
이름 : 이영희
나이 : 18
점수 : 100
self는 누구일까?

학생들이 가장 헷갈리는 부분이에요. student1.study()를 호출하면, 그 메서드 안의 selfstudent1이 됩니다. student2.study()를 호출하면, 이번에는 selfstudent2가 돼요.

즉, 같은 메서드 코드를 쓰더라도 누가 호출했는지에 따라 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()처럼 괄호를 붙여야 합니다.
종합 예제
python
class Student:
    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
빈칸 채우기
  1. 클래스 안에 정의된 함수를 (이)라고 합니다.
  2. 메서드의 첫 번째 매개변수로 항상 들어가는 것은 입니다.
  3. student1.study()를 호출하면 self는 무엇을 가리키나요?
정답
1. 메서드(Method)
2. self
3. student1
학교 시험 유형
  1. 다음 코드의 실행 결과를 작성하시오.
    python
    class Dog:
        def __init__(self, name):
            self.name = name

        def bark(self):
            print(self.name, "멍멍!")

    dog = Dog("콩이")
    dog.bark()
  2. 메서드와 일반 함수의 공통점과 차이점을 서술하시오.
정답
1. 콩이 멍멍! — bark() 안의 self는 dog를 가리키므로 self.name은 "콩이"입니다.

2. 공통점은 둘 다 def로 만든 코드 묶음이라는 것입니다. 차이점은 메서드는 클래스 안에 정의되어 특정 객체에 속한 함수이며, 첫 번째 매개변수로 항상 self를 받고, object.method() 형태로 호출한다는 점입니다.

 

다음 화 예고 — 22화에서는 지금까지 배운 클래스·속성·생성자·메서드를 모두 모아, Book 클래스로 도서 대출 관리 프로그램을 직접 만드는 객체지향 종합 과제를 다룹니다.
반응형

댓글