중급 파트의 시작은 클래스였다

기초 파트에서는 변수, 조건문, 반복문, 함수처럼 “값을 계산하고 흐름을 제어하는 법”을 중심으로 배웠다. 그런데 중급 파트에 들어오자마자 클래스가 나오면서 코드 보는 방식 자체가 조금 달라졌다. 이제는 단순히 값을 처리하는 것이 아니라, “하나의 대상을 어떻게 표현할 것인가”를 고민하게 된다.

처음에는 클래스가 너무 추상적으로 느껴질 수 있다. 하지만 실습 예제를 다시 보면 결국 클래스는 거창한 이론이라기보다 “관련 있는 데이터와 기능을 하나의 이름 아래 묶는 방법”에 가깝다.

즉, 중급 1일차는 문법이 하나 더 추가된 날이 아니라, Python 코드를 바라보는 관점이 바뀌기 시작한 날이었다.

1. 클래스는 설계도이고 객체는 실제 사용 대상이다

실습에서는 자동차 예제로 클래스를 만들었다.

class Car:
    def init(self):
        self.color = "black"
        self.speed = 100

    def info(self):
        print(f"자동차 색상은 {self.color}, 속도는 {self.speed}")

이 코드를 처음 보면 바로 실행 가능한 완성 프로그램처럼 보일 수 있다. 하지만 핵심은 아직 “틀”만 만들었다는 점이다. Car는 자동차라는 대상을 코드로 표현하는 설계도에 가깝다.

실제로 값을 가지는 대상을 만들려면 객체를 생성해야 한다.

redcar = Car()
redcar.init()
redcar.color = "red"
redcar.speed = 150
redcar.info()

여기서:

  • Car는 클래스
  • redcar는 객체

다시 말해, 클래스는 개념이고 객체는 실제로 메모리에 만들어져 사용하는 결과물이다.

이 구분이 객체지향의 출발점이다.

2. 왜 클래스가 필요할까

기초 단계에서는 자동차 정보를 아래처럼 따로 관리할 수도 있다.

car_color = "red"
car_speed = 150

그리고 출력 함수도 따로 만들 수 있다.

def show_car_info(color, speed):
    print(f"자동차 색상은 {color}, 속도는 {speed}")

그런데 자동차가 1대가 아니라 10대, 100대가 되면 이 방식은 점점 지저분해진다. 각각의 색상, 속도, 출력 기능이 흩어져 있기 때문이다.

클래스를 쓰면:

  • 자동차가 가져야 할 값
  • 자동차가 할 수 있는 기능

을 한 단위로 묶을 수 있다.

즉, 클래스는 코드를 “더 어렵게 만드는 문법”이 아니라, 관련 있는 것들을 정리해 주는 도구다.

3. 속성과 메서드는 클래스 안에서 함께 움직인다

중급 1일차에서 처음 같이 들어온 핵심 용어가 속성과 메서드였다.

  • 속성: 객체가 가지고 있는 값
  • 메서드: 객체가 수행하는 기능

자동차 예제로 보면:

  • color, speed는 속성
  • info()는 메서드
class Car:
    def init(self):
        self.color = "black"
        self.speed = 100

    def info(self):
        print(f"자동차 색상은 {self.color}, 속도는 {self.speed}")

이 구조가 중요한 이유는 데이터와 기능이 서로 연결되기 때문이다. 자동차의 색상과 속도를 따로 흩어놓는 대신, 자동차라는 하나의 대상 안에서 관리할 수 있다.

기초 단계에서 변수와 함수가 분리돼 있었다면, 객체지향에서는 그 둘을 하나의 단위로 묶기 시작한다고 이해하면 좋다.

4. 객체를 여러 개 만들 수 있다는 감각이 중요하다

클래스를 배우며 꼭 익혀야 하는 감각 중 하나는 “같은 클래스에서 객체를 여러 개 만들 수 있다”는 점이다.

예를 들어:

redcar = Car()
bluecar = Car()

이렇게 하면 같은 Car 클래스를 기반으로 하지만 서로 다른 상태를 가진 객체 두 개를 만들 수 있다.

redcar.color = "red"
bluecar.color = "blue"

즉, 클래스 하나가 객체 하나를 뜻하는 게 아니다. 클래스는 공통 구조를 정의하고, 객체는 그 구조를 바탕으로 각각 독립적인 상태를 가진다.

이걸 이해하지 못하면 나중에 생성자, 상속, 인스턴스 메서드까지 전부 헷갈리게 된다.

5. 메서드는 객체를 통해 호출한다

기초에서 배운 함수는 보통 이렇게 썼다.

print("hello")
len("python")

그런데 클래스 안에 들어 있는 메서드는 방식이 조금 다르다.

redcar.info()

즉, 메서드는 클래스 안에 정의되어 있지만 실제 사용은 객체를 통해 한다. 이 점이 중요하다. 왜냐하면 메서드는 특정 객체의 상태를 바탕으로 동작하기 때문이다.

자동차 메서드 info()가 어떤 색상과 속도를 출력할지는 redcar인지 bluecar인지에 따라 달라진다. 그래서 메서드는 객체를 기준으로 호출하는 것이 자연스럽다.

6. self는 왜 필요한가

중급 1일차에서 가장 낯선 문법은 거의 항상 self다.

def init(self):
    self.color = "black"
    self.speed = 100

그리고 메서드 안에서도 계속 보인다.

def info(self):
    print(f"자동차 색상은 {self.color}, 속도는 {self.speed}")

처음에는 self를 그냥 외워야 하는 문법처럼 느끼기 쉽다. 하지만 의미를 붙이면 훨씬 낫다.

self는 “지금 이 메서드를 호출한 객체 자신”을 가리킨다.

즉:

  • redcar.info()를 호출하면 selfredcar
  • bluecar.info()를 호출하면 selfbluecar

가 된다.

그래서 같은 info() 메서드라도 어떤 객체가 호출했느냐에 따라 다른 값을 사용할 수 있다.

7. self.color처럼 써야 하는 이유

왜 그냥 color라고 안 쓰고 self.color라고 쓸까? 이유는 “이 값이 객체의 속성”이라는 걸 분명하게 표시하기 위해서다.

예를 들어:

def info(self):
    print(self.color)

여기서 self.color는 이 객체가 가진 색상이다. 만약 color라고만 쓰면, 지역 변수인지 외부 변수인지 구분이 불명확해진다.

즉, self.이름은 “이 객체가 가진 값”이라는 뜻으로 읽는 습관이 중요하다.

8. day1 예제에서 init()가 의미하는 것

이날 글의 예제는 __init__이 아니라 init() 형태로 직접 초기화 메서드를 호출하는 흐름이다.

redcar = Car()
redcar.init()

이 방식은 조금 번거롭지만, 중급 1일차 입문 단계에서는 오히려 장점도 있다. 객체를 만든 뒤 속성이 어떻게 들어가는지 눈으로 따로 볼 수 있기 때문이다.

즉, 다음 날 __init__ 생성자를 배우기 전에:

  1. 객체를 만들고
  2. 초기값을 넣고
  3. 메서드로 상태를 사용하는 흐름

을 먼저 분리해서 이해하게 해 준다.

그래서 day1은 day2의 생성자 개념으로 넘어가기 위한 준비 단계라고 봐도 좋다.

9. 기초 단계의 함수와 중급 단계의 메서드는 어떻게 다를까

겉보기에는 메서드도 함수처럼 생겼다.

def info(self):
    ...

하지만 중요한 차이가 있다.

  • 함수: 독립적으로 존재할 수 있다
  • 메서드: 클래스 안에 있고, 객체와 연결되어 있다

이 차이 때문에 메서드는 보통 객체의 속성을 읽거나 바꾸는 역할을 자주 맡는다.

즉, 메서드는 “객체의 상태와 연결된 함수”라고 이해하면 가장 자연스럽다.

10. 오늘 가장 헷갈리기 쉬운 포인트

중급 1일차에서 많이 헷갈리는 지점은 대체로 세 가지다.

클래스와 객체를 같은 의미로 읽는 것

Carredcar를 같은 층위로 이해하면 구조가 흐려진다.

self를 그냥 장식처럼 보는 것

self는 문법 장식이 아니라, 각 객체의 상태를 구분하는 기준이다.

메서드를 일반 함수처럼만 보는 것

메서드는 객체를 통해 호출되고, 그 객체의 속성을 바탕으로 동작한다.

이 세 가지를 분명히 구분하면 day2의 __init__, day3의 상속도 훨씬 자연스럽게 연결된다.

11. 오늘의 실수 포인트

오늘 내용에서 특히 실수하기 쉬운 부분은 아래와 같다.

  • 클래스 자체와 객체를 구분하지 않으면 구조 이해가 무너진다.
  • 속성은 self.이름 형태로 다뤄야 객체 상태라는 점이 분명해진다.
  • 메서드는 클래스 안에 정의되지만 실제 호출은 객체를 통해 한다.
  • 객체를 생성했다고 바로 속성이 생기는 것은 아니고, day1 예제에서는 init() 호출이 필요하다.

즉, 문법보다 “누가 틀이고 누가 실제 대상인지”를 계속 의식하는 것이 중요하다.

12. 오늘의 핵심 감각

12월 10일 실습을 통해 얻은 가장 중요한 감각은 이것이다.

“객체지향은 거창한 이론이 아니라, 관련 있는 값과 기능을 하나의 대상 안에 묶는 방식이다.”

이 문장을 이해하면 클래스도 덜 무섭고, 객체도 덜 추상적으로 느껴진다.

자동차 예제에서:

  • 색상과 속도는 따로 흩어져 있지 않고
  • 자동차라는 단위로 묶이고
  • 그 정보를 출력하는 기능도 함께 붙어 있다

이 구조가 바로 객체지향의 가장 기초적인 형태다.

복습용으로 남기는 질문

이 글만 읽고 아래 질문에 답할 수 있으면 중급 1일차 내용은 잘 정리된 것이다.

1. 클래스와 객체의 차이는 무엇인가?

클래스는 설계도나 틀이고, 객체는 그 클래스를 바탕으로 실제로 만들어진 대상이다. 예를 들어 Car가 클래스라면 redcar는 실제 객체다.

2. 속성과 메서드는 각각 무엇을 의미하는가?

속성은 객체가 가진 상태나 데이터이고, 메서드는 그 객체가 수행할 수 있는 동작이나 기능이다.

3. 메서드는 왜 객체를 통해 호출해야 할까?

메서드는 객체의 상태와 연결되어 동작하기 때문이다. 어떤 객체의 속성을 기준으로 실행할지 알아야 하므로 보통 객체.메서드() 형태로 호출한다.

4. self는 왜 필요한가?

self는 지금 다루는 객체가 누구인지를 가리킨다. 같은 클래스에서 여러 객체를 만들었을 때도 각 객체의 상태를 구분해 사용할 수 있게 해 준다.

5. self.color처럼 쓰는 이유는 무엇인가?

단순한 지역변수가 아니라 그 객체가 가진 속성이라는 점을 분명히 하기 위해서다. self.color는 현재 객체의 color 값을 뜻한다.

6. 같은 클래스에서 여러 객체를 만들 수 있다는 것은 어떤 뜻인가?

하나의 설계도로 서로 다른 상태를 가진 여러 실제 대상을 만들 수 있다는 뜻이다. 예를 들어 같은 Car 클래스에서 빨간 차, 파란 차처럼 여러 객체를 만들 수 있다.

한 줄 정리

오늘은 Python 중급의 시작점에서, 객체지향을 거창한 이론보다 “데이터와 기능을 하나로 묶는 방식”으로 받아들이는 연습을 한 날이었다.

Community

Comments

0 comments

Comments appear immediately. Use report if something needs review.

No comments yet.