본문 바로가기

Python

6-2. 생성자(__init__)와 인스턴스 변수

파이썬 생성자(init)와 인스턴스 변수

안녕하세요! 지난 시간에는 객체지향 프로그래밍(OOP)의 가장 기본적인 개념인 클래스(Class)와 객체(Object)에 대해 알아보았습니다. 클래스가 객체의 설계도라면, 객체는 그 설계도로 만들어진 실제 사물이었죠.

하지만 지난번 Person 클래스로 객체를 만들었을 때는 모든 객체가 똑같았습니다. 각각의 붕어빵(객체)이 팥 붕어빵, 슈크림 붕어빵처럼 서로 다른 속성(데이터)을 가질 수 있도록 하려면 어떻게 해야 할까요?

이번 시간에는 클래스로 객체를 만들 때 초기값을 설정하는 특별한 메서드인 **생성자(__init__)**와, 객체 고유의 데이터를 저장하는 **인스턴스 변수(Instance Variable)**에 대해 자세히 알아보겠습니다. 이 둘은 객체의 개성을 부여하는 핵심 요소입니다.


Part 1: 인스턴스 변수(Instance Variable) - 객체 고유의 데이터

인스턴스 변수는 클래스로부터 생성된 각 객체(인스턴스)마다 독립적으로 값을 가지는 변수입니다. 모든 붕어빵이 붕어빵 틀에서 나왔지만, 어떤 붕어빵은 팥을 넣고 어떤 붕어빵은 슈크림을 넣는 것처럼, 각 객체는 자신만의 고유한 데이터를 가질 수 있습니다.

  • 특징:
    • 각 객체마다 별도로 생성되고 관리됩니다.
    • 객체의 속성(property) 또는 상태(state)를 나타냅니다.
    • 메서드 안에서 self.변수이름 형태로 접근하고 사용합니다.

Part 2: 생성자(__init__) - 객체 초기화 메서드

생성자는 클래스로부터 객체(인스턴스)가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 생성자의 주된 목적은 객체가 만들어지자마자 필요한 초기값들을 설정하여 인스턴스 변수를 초기화하는 것입니다.

1. 생성자 __init__ 정의하기

파이썬에서 생성자는 __init__ 이라는 특별한 이름의 메서드로 정의합니다. 이름 앞뒤로 언더바(_)가 두 개씩 붙어있습니다.

기본 형식:

Python
 
class 클래스이름:
    def __init__(self, 매개변수1, 매개변수2, ...):
        # self.인스턴스_변수 = 매개변수
        # 객체가 생성될 때 실행될 초기화 코드
  • self 매개변수:
    • __init__ 메서드를 포함하여 모든 인스턴스 메서드의 첫 번째 매개변수는 반드시 self여야 합니다.
    • self는 현재 생성되고 있는 객체(자기 자신)를 가리킵니다. 파이썬이 함수를 호출할 때 자동으로 이 self에 현재 객체의 참조를 전달해줍니다. 우리는 이 self를 통해 객체 고유의 인스턴스 변수에 접근하거나 다른 메서드를 호출할 수 있습니다.
    • self는 예약어가 아니므로 다른 이름으로 사용해도 문법적 오류는 없지만, self를 사용하는 것이 파이썬의 표준이자 강력한 관례입니다.
  • 다른 매개변수들: 객체를 초기화하는 데 필요한 값들을 받기 위한 매개변수들입니다.
  • self.인스턴스_변수 = 매개변수: 이렇게 self를 사용하여 할당한 변수가 바로 해당 객체의 인스턴스 변수가 됩니다.

예시: Person 클래스에 생성자와 인스턴스 변수 추가

Python
 
# 파일 이름: person_with_init.py

class Person:
    # 생성자 정의
    def __init__(self, name, age): # self는 현재 객체, name과 age는 초기화할 값
        self.name = name # name 인스턴스 변수 생성 및 초기화
        self.age = age   # age 인스턴스 변수 생성 및 초기화
        print(f"{self.name}님이 {self.age}세로 생성되었습니다.")

# 객체 생성 시 생성자 자동 호출 및 초기값 전달
person1 = Person("김철수", 30) # "김철수"는 name으로, 30은 age로 전달됨
person2 = Person("이영희", 25) # "이영희"는 name으로, 25는 age로 전달됨

# 각 객체의 인스턴스 변수에 접근하기
print(f"\nPerson1의 이름: {person1.name}, 나이: {person1.age}")
print(f"Person2의 이름: {person2.name}, 나이: {person2.age}")

# 객체는 서로 다른 인스턴스 변수를 가집니다.
person1.age = 31 # person1의 age만 변경
print(f"\nPerson1의 변경된 나이: {person1.age}")
print(f"Person2의 나이 (변화 없음): {person2.age}")

 

[VS Code 터미널 출력]

파이썬 생성자(__init__)와 인스턴스 변수 사용 예시

Part 3: 인스턴스 변수 접근 및 수정

인스턴스 변수는 객체이름.변수이름 형태로 접근하고 수정할 수 있습니다.

1. 인스턴스 변수 접근

Python
 
# 파일 이름: access_instance_var.py

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

product1 = Product("노트북", 1200000)
product2 = Product("마우스", 25000)

print(f"제품1 이름: {product1.name}, 가격: {product1.price}원")
print(f"제품2 이름: {product2.name}, 가격: {product2.price}원")

 

[VS Code 터미널 출력]

파이썬 인스턴스 변수 접근 예시

2. 인스턴스 변수 수정

Python
 
# 파일 이름: modify_instance_var.py

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
        self.is_read = False # 초기값 설정

my_book = Book("파이썬의 정석", "김코딩", 500)
print(f"원본 책 정보: {my_book.title}, {my_book.author}, {my_book.pages}쪽, 읽음 여부: {my_book.is_read}")

# 인스턴스 변수 값 변경
my_book.pages = 520 # 페이지 수 변경
my_book.is_read = True # 읽음 상태로 변경

print(f"변경된 책 정보: {my_book.title}, {my_book.author}, {my_book.pages}쪽, 읽음 여부: {my_book.is_read}")

# 새로운 인스턴스 변수를 동적으로 추가할 수도 있습니다. (권장되지는 않음)
my_book.rating = 4.5
print(f"평점 추가: {my_book.rating}")

 

[VS Code 터미널 출력]

파이썬 인스턴스 변수 수정 및 동적 추가 예시

Part 4: 생성자(__init__)의 활용과 중요성

생성자는 객체지향 프로그래밍에서 다음과 같은 이유로 매우 중요합니다.

  • 객체 초기화: 객체가 생성되는 시점에 필요한 모든 초기값(속성)을 설정하여, 객체가 항상 유효한 상태로 시작하도록 보장합니다.
  • 코드의 일관성: 모든 객체가 동일한 방식으로 초기화되도록 강제하여 코드의 일관성을 유지합니다.
  • 필수 데이터 주입: 객체가 동작하는 데 반드시 필요한 데이터(예: Person의 name, age)를 생성자 매개변수로 받아 강제로 주입할 수 있습니다. 이를 통해 불완전한 객체 생성을 방지합니다.

생성자 없이 인스턴스 변수를 설정하는 경우 (비권장):

__init__ 없이도 객체 생성 후 인스턴스 변수를 직접 할당할 수 있지만, 이는 권장되지 않습니다.

Python
 
# 파일 이름: no_init_caution.py

class Item:
    pass

item1 = Item()
item1.name = "연필"
item1.price = 500 # 객체 생성 후 수동으로 속성 할당

item2 = Item()
# item2는 아직 name과 price 속성이 없습니다.
# print(item2.name) # AttributeError: 'Item' object has no attribute 'name' (오류 발생!)

print(f"item1 이름: {item1.name}, 가격: {item1.price}원")
  • __init__을 사용하지 않으면, 개발자가 수동으로 모든 속성을 설정해야 하며, 실수로 누락하면 AttributeError가 발생할 수 있습니다. __init__은 이러한 실수를 방지하고 객체 초기화의 안정성을 높여줍니다.

 

[VS Code 터미널 출력]

파이썬 생성자 없이 인스턴스 변수 할당 시 주의점

마무리하며

이번 시간에는 객체지향 프로그래밍에서 객체의 개성을 부여하는 핵심 요소인 **생성자(__init__)**와 인스턴스 변수에 대해 자세히 알아보았습니다.

  • __init__: 객체가 생성될 때 자동으로 호출되어 초기값을 설정하는 특별한 메서드. 첫 매개변수는 항상 self입니다.
  • 인스턴스 변수: self.변수이름 형태로 정의되며, 각 객체마다 고유한 값을 가집니다. 객체의 속성이나 상태를 나타냅니다.

이제 여러분은 클래스라는 설계도로 단순한 붕어빵을 넘어, 팥 붕어빵, 슈크림 붕어빵처럼 자신만의 속성을 가진 다양한 붕어빵(객체)을 만들 수 있게 되었습니다!

다음 포스팅에서는 객체가 특정 행동을 수행할 수 있도록 정의하는 **메서드(Method)**의 정의와 호출 방법에 대해 자세히 알아보겠습니다.


궁금한 점이 있다면 언제든지 질문해주세요! 다음 포스팅에서 만나요!

반응형

'Python' 카테고리의 다른 글

6-6. 오버라이딩과 super()  (0) 2025.07.01
6-5. 상속과 다형성  (0) 2025.07.01
5-5. raise와 사용자 정의 예외  (0) 2025.06.29
5-4. 예외 처리 try-except 구문  (0) 2025.06.28
5-3. CSV 파일 다루기  (0) 2025.06.27