오늘은 객체가 처음 만들어지는 순간을 봤다
중급 1일차에 클래스와 객체, 속성과 메서드, self를 배웠다면, 오늘은 그 다음 단계로 넘어갔다. 어제는 객체를 만든 뒤 init() 같은 메서드를 별도로 호출해 값을 넣는 흐름이었다. 그런데 오늘은 객체가 생성되는 순간부터 필요한 값이 함께 들어가는 구조를 배웠다.
바로 __init__ 생성자다.
이 개념이 중요한 이유는 단순히 문법이 하나 더 추가되기 때문이 아니다. 객체가 “만들어진 뒤 나중에 채워지는 것”이 아니라, “처음부터 의미 있는 상태로 시작한다”는 쪽으로 사고가 바뀌기 때문이다.
즉, 중급 2일차는 클래스가 실제로 더 실용적인 코드 구조로 보이기 시작한 날이었다.
1. __init__은 객체 생성 시 자동 실행된다
실습 코드에서는 아래처럼 생성자를 사용하는 클래스를 만들었다.
class CarI:
def __init__(self, c, s):
self.color = c
self.speed = s
def info(self):
return f"자동차 색상은 {self.color}, 속도는 {self.speed}"
이제 객체를 만들 때 바로 값을 넣는다.
car_red = CarI("Red", 80)
print(car_red.info())
여기서 핵심은 car_red = CarI("Red", 80) 한 줄 안에서 두 가지가 동시에 일어난다는 점이다.
- 객체가 생성된다.
__init__이 자동 실행되어 초기값이 들어간다.
즉, 더 이상 day1처럼:
car = Car()
car.init()
같이 두 단계로 나눌 필요가 없다.
2. 왜 생성자가 필요한가
day1 방식도 분명 객체를 만들 수는 있다. 하지만 객체를 만든 뒤 초기화 메서드를 호출하는 걸 잊어버릴 수도 있고, 어떤 속성은 넣고 어떤 속성은 빼먹을 수도 있다.
생성자를 사용하면 객체가 태어나는 순간 필요한 값이 함께 들어가므로 상태가 훨씬 명확해진다.
예를 들어 자동차를 만들 때:
- 색상은 무엇인지
- 속도는 얼마인지
가 처음부터 정해진다.
즉, 생성자는 “객체의 출발 상태를 보장하는 장치”라고 이해하면 좋다.
3. self.color = c는 무슨 뜻인가
생성자에서 가장 많이 보는 문장은 이런 형태다.
self.color = c
self.speed = s
처음에는 왼쪽과 오른쪽이 비슷해 보여서 헷갈릴 수 있다. 하지만 역할은 다르다.
- 오른쪽
c,s: 생성자에 전달된 입력값 - 왼쪽
self.color,self.speed: 객체가 실제로 가지게 될 속성
즉, “받은 값을 객체 속성에 저장한다”는 뜻이다.
이 구조가 익숙해지면 이후 어떤 클래스든 읽기가 쉬워진다.
self.name = name
self.title = title
self.age = age
이런 코드들은 전부 같은 패턴이다.
4. 생성자는 객체마다 다른 초기 상태를 만들 수 있게 해 준다
생성자를 배우면서 꼭 느껴야 하는 감각은 “같은 클래스라도 객체마다 다른 상태로 시작할 수 있다”는 점이다.
예를 들어:
car_red = CarI("Red", 80)
car_blue = CarI("Blue", 120)
이 두 객체는 같은 CarI 클래스로 만들어졌지만 시작 상태가 다르다.
car_red.color는"Red"car_blue.color는"Blue"
즉, 생성자는 하나의 틀을 가지고도 다양한 객체를 자연스럽게 만들 수 있게 해 준다.
이게 없으면 매번 객체를 만든 뒤 속성을 하나하나 바꾸는 번거로운 흐름이 반복된다.
5. 메서드는 생성자와 어떻게 이어질까
생성자를 배우면서 함께 다시 본 것이 메서드의 역할이다.
def info(self):
return f"자동차 색상은 {self.color}, 속도는 {self.speed}"
여기서 info()는 생성자에서 넣어둔 속성을 읽어서 결과를 만들어낸다.
즉, 생성자와 메서드는 분리된 개념이 아니라 연결돼 있다.
- 생성자: 객체의 초기 상태를 만든다
- 메서드: 그 상태를 바탕으로 기능을 수행한다
객체지향 코드는 이 둘이 계속 함께 움직인다.
6. 책 예제로 보면 더 분명해진다
오늘 글에 나온 또 다른 예제는 책 클래스다.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def get_title(self):
return self.title
def get_author(self):
return self.author
이 코드는 자동차 예제보다 더 “정보 중심 객체”에 가깝다.
여기서 중요한 포인트는:
- 책 객체는 제목과 저자를 반드시 가진다
- 그 정보를 꺼내는 메서드가 함께 정의된다
즉, 생성자는 필요한 정보를 빠뜨리지 않게 하고, 메서드는 그 정보를 객체 바깥에 적절한 방식으로 제공한다.
이런 구조는 나중에 회원, 주문, 게시글 같은 객체를 만들 때도 그대로 이어진다.
7. 생성자와 일반 메서드는 역할이 다르다
둘 다 def로 정의되기 때문에 헷갈릴 수 있지만, 생성자와 일반 메서드는 역할이 분명히 다르다.
생성자 __init__
- 객체가 생성될 때 자동 실행된다
- 초기 상태를 만든다
- 보통
return을 쓰지 않는다
일반 메서드
- 필요할 때 객체를 통해 호출한다
- 객체의 상태를 읽거나 바꾼다
- 결과를 반환할 수도 있다
예를 들어:
car_red = CarI("Red", 80)
print(car_red.info())
여기서 CarI("Red", 80)는 생성자 실행이고, car_red.info()는 일반 메서드 호출이다.
이 차이를 분명히 이해해야 객체지향 흐름이 깔끔하게 읽힌다.
8. day1의 init()와 day2의 __init__ 차이
중급 1일차와 2일차는 사실 연결해서 보면 이해가 더 쉽다.
day1 방식
car = Car()
car.init()
day2 방식
car = CarI("Red", 80)
day2 방식이 더 자연스러운 이유는 객체 생성과 초기화가 한 번에 끝나기 때문이다.
즉, day1이 “객체가 어떻게 값을 갖게 되는지”를 분리해서 보여 준 단계였다면, day2는 “실제로는 이렇게 한 번에 처리하는 편이 더 좋다”는 방향으로 넘어가는 단계였다.
그래서 day2는 단순한 새 문법 소개가 아니라, day1 내용을 더 실용적으로 다듬는 날이라고 볼 수 있다.
9. 설계 감각이 조금씩 들어오기 시작한다
오늘 정리하면서 가장 중요하게 느껴진 건, 생성자가 단순한 문법이 아니라 설계 도구라는 점이다.
예를 들어:
- 자동차 객체를 만들 때 색상과 속도를 꼭 받게 할 수도 있고
- 책 객체를 만들 때 제목과 저자를 반드시 받게 할 수도 있다
즉, 객체를 만들 때 “어떤 정보가 필수인가”를 생성자가 결정한다.
이건 중급으로 들어왔다는 느낌을 주는 포인트다. 이제는 값을 계산하는 문제를 넘어서, 객체를 어떤 구조로 시작하게 할지 생각하게 되기 때문이다.
10. 오늘 헷갈리기 쉬운 포인트
중급 2일차에서 특히 헷갈릴 수 있는 부분은 아래와 같다.
__init__ 철자
언더바가 앞뒤로 두 개씩 들어간다. 하나라도 틀리면 자동 실행되지 않는다.
매개변수와 속성 이름 연결
c, s 같은 짧은 이름을 쓰면 처음에는 self.color = c가 더 헷갈릴 수 있다. 하지만 “입력값을 속성에 저장한다”는 패턴을 익히면 괜찮아진다.
생성자와 메서드 구분
둘 다 함수처럼 생겼지만, 생성자는 자동 실행되고 메서드는 직접 호출해야 한다.
이 세 가지를 분명히 잡아두면 day3 상속으로 넘어갈 때도 훨씬 편하다.
11. 오늘의 실수 포인트
오늘 내용에서 실수하기 쉬운 부분은 아래와 같다.
__init__철자를 틀리면 생성자가 실행되지 않는다.- 생성자 매개변수와 객체 속성은 다를 수 있지만 연결 관계를 분명히 써야 한다.
- 객체 생성과 초기화는 다르지만, 생성자는 그 둘을 한 번에 처리해 준다.
- 메서드는 객체의 속성을 활용하는 기능이라는 점을 잊지 않아야 한다.
즉, 생성자를 배울 때는 “문법을 외운다”보다 “객체가 어떻게 시작 상태를 갖게 되는가”를 계속 생각하는 편이 좋다.
12. 오늘의 핵심 감각
12월 11일 실습에서 얻은 가장 중요한 감각은 이렇다.
“생성자는 객체가 처음부터 의미 있는 상태로 시작하게 해 주는 장치다.”
이 문장을 이해하면 __init__도 덜 복잡하게 느껴진다.
자동차 예제에서는 색상과 속도, 책 예제에서는 제목과 저자처럼, 객체가 태어날 때 꼭 필요한 정보를 바로 넣어 두는 것이다.
즉, 생성자는 코드 편의 기능이면서 동시에 객체 설계의 출발점이기도 하다.
복습용으로 남기는 질문
이 글만 읽고 아래 질문에 답할 수 있으면 중급 2일차 내용은 잘 정리된 것이다.
1. __init__은 언제 실행되는가?
객체가 생성되는 순간 자동으로 실행된다. 즉, CarI("Red", 80)처럼 객체를 만들 때 바로 초기화가 함께 일어난다.
2. 생성자와 일반 메서드의 차이는 무엇인가?
생성자는 객체 생성 시 자동 실행되어 초기 상태를 만드는 역할을 하고, 일반 메서드는 객체가 만들어진 뒤 필요할 때 직접 호출해 기능을 수행한다.
3. self.color = c에서 왼쪽과 오른쪽은 각각 무엇을 뜻하는가?
왼쪽 self.color는 객체가 실제로 가지게 될 속성이고, 오른쪽 c는 생성자에 전달된 입력값이다. 즉, 받은 값을 객체 속성에 저장하는 코드다.
4. 객체 생성 시 필요한 값을 생성자로 받는 이유는 무엇인가?
객체가 처음부터 의미 있는 상태로 시작하게 하기 위해서다. 필요한 값을 나중에 따로 넣는 것보다, 생성 순간에 함께 정해 두는 편이 더 명확하고 안전하다.
5. day1의 init() 방식과 day2의 __init__ 방식은 어떻게 다를까?
day1 방식은 객체를 만든 뒤 별도 메서드로 초기화해야 하고, day2 방식은 객체 생성과 초기화가 한 번에 끝난다. 그래서 __init__ 방식이 더 실용적이다.
6. 생성자는 왜 객체 설계와 연결된다고 볼 수 있을까?
객체를 만들 때 어떤 정보가 필수인지 생성자가 결정하기 때문이다. 즉, 생성자는 단순 문법이 아니라 객체의 시작 상태와 구조를 정하는 설계 도구다.
한 줄 정리
오늘은 객체가 만들어질 때 어떤 값을 가지고 시작할지 정하는 생성자 개념을 통해, 클래스가 더 실용적이고 설계적인 형태로 보이기 시작한 날이었다.
Community
Comments
Comments appear immediately. Use report if something needs review.
No comments yet.