1. 클래스는 왜 써야 할까?

박태정·2025년 12월 24일

Python Deep Dive

목록 보기
2/3

면접장에서 "클래스와 함수의 차이가 뭐죠?"라는 질문을 받으면 머리속에서는 어느정도 추상적으로 알고는 있지만 잘 정리해서 설명하기에는 어려움이 있는것 같다.

사실 테디노트 같은 LangChain 강의를 보면서 따라할 때도 Class를 사용해서 객체지향적으로 코드를 설명해주기 보다는 기능 위주로 설명을 해주고 그걸 실습하다 보니까 파이썬에서의 Class가 그렇게 친숙하지는 않다.

Java(Spring Boot)를 갖고 백엔드 구조를 만들 때는 다들 객체지향적 구조로 작성하다 보니까 이게 왜 필요하고 어떤 장점이 있다는 것을 이론적으로만 알고 구조를 만들어왔지, 이게 정말 필요하다는 생각이 들어서 사용하지는 않았던 기억이난다.


왜 함수나 리스트만으로는 부족할까?

자동차 정보를 관리한다고 가정해보자. 아래 코드처럼 리스트딕셔너리로 관리하면 이런 문제들이 생긴다.

  • 리스트 구조: del car_company_lit[1] 처럼 하나를 삭제하면 다른 리스트와의 인덱스 싱크를 맞추리 어렵다.
  • 딕셔너리 구조: 코드 반복이 계속되고, 키 이름을 중복해서 쓰거나 오타가 나면 에러를 잡기 힘들어진다.

그래서 '데이터'를 중심에 두고 이를 '객체'로 관리하는 '클래스'를 사용해야한다.


클래스의 기본 구조와 매직 메서드

파이썬 클래스를 깊게 이해하려면 __로 시작하는 매직 메서드)를 알아야 한다. 이 매직메서드들은 특정 상황에서 자동으로 호출이 된다.

  1. __init__: 객체를 생성할 때 초기값을 설정(생성자)
  2. __str__: print()문으로 객체를 출력할 때 사용자에게 보여줄 문자열을 정의(객체에 대한 간단한 설명 느낌)
  3. __repr__: 이건 __str__의 개발자용 출력이다. 객체의 타입 정보 등을 포함해 더 상세한 정보를 담을 때 사용
class Car():
    """
    Car class
    Author : 박태정
    Description : 클래스 기초 및 매직 메서드 활용
    """
    car_count = 0
    def __init__(self, company, details):
        self._company = company
        self._details = details
        Car.car_count += 1

    def __str__(self):
        return f'str : {self._company} - {self._details}'

    def __repr__(self):
        return f'repr : {self._company} - {self._details}'

car1 = Car('Ferrari', {'color': 'white', 'price': 8000})
print(car1) # __str__이 호출됨

print(Car.car_count)

인스턴스 변수 vs 클래스 변수

클래스를 공부하면서 가장 헷갈렸던 변수 범위다.

  • 인스턴스 변수(self._company): 각 객체(인스턴스)마다 별도로 가지고 있는 고유한 값.
  • 클래스 변수(car_count): 모든 인스턴스가 공유 하는 변수

Car.car_count라는 클래스 변수를 통해 생성된 자동차의 총 대수를 관리한다. 하나 알게된 사실은 파이썬은 변수를 찾을 때 '인스턴스 -> 클래스 -> 상위클래스' 순서로 이름을 검색한다.


메서드의 세 가지 종류 (Instance, Class, Static)

오픈소스 코드(LangChain 같은 라이브러리)를 보다 보면 메서드 위에 @classmethod@staticmethod가 붙어있는거를 가끔 본적이 있다.

처음에 '자바에서 사용되는 어노테이션 느낌의 기능을 파이썬에서도 하나보다'라고 생각했었는데 다른 것 같다.

이 표시는 데코레이터고, 이를 아는 것이 파이썬 중급자로 가는 핵심이라고 한다.

인스턴스 메서드

  • 데코레이터: 없다
  • 첫 번째 인자: self
  • 용도: 객체의 고유 속성을 다룰 때 사용

클래스 메서드

  • 데코레이터: @classmethod
  • 첫 번째 인자: cls
  • 용도: 클래스 변수를 수정하거나 클래스 전체에 영향을 줄 때

이걸 알기 전에는 클래스 변수를 수정할 때는 그냥 직접 접근해서 수정하려고 했는데 이 방법은 되게 위험한 방법이라고 한다.

스테틱 메서드

  • 데코레이터: @staticmethod
  • 첫 번째 인자: 없다
  • 용도: 클래스/인스턴스 정보가 필요없는 공용 유틸 함수라고 하는데 굳이 사용안하고 인스턴스 메서드로 충분히 대체 가능하다고 한다.
# 클래스 메서드로 전체 가격 인상률 수정
@classmethod
def raise_price(cls, per):
    cls.price_per_raise = per

# 스테틱 메서드로 특정 로직 체크 (객체 데이터와 무관)
@staticmethod
def is_bmw(inst):
    return inst._company == "BMW"

마치며

공부하다 보니 파이썬은 클래스 메서드에서 잠깐 언급 했듯이 직접 접근 하는 것을 방지하는 private 키워드가 따로 없다는 점이 흥미로웠다. 대신에 약속이 있다는게 신기했다.

  • _variable: 이렇게 변수명 앞에 언더바를 입력해서 만들면 "이건 내부용이니까 밖에서 직접 건들지 말아줘."(암묵적 약속)
  • __variable: 네임 맹글링 이라는 것을 통해서 이름을 찾지 못하도록 만들 수도 있다.

직접 car1._details['price'] = 0 처럼 값을 바꾸는 건 지양해야한다. 대신 raise_price() 같은 메서드를 통해서 데이터를 변경하는 습관을 들여야 코드가 안전해진다.

내가 파이썬으로 개발자를 하려고 했는데 이렇게 까지 모르는게 많았었는지 알게되고 처음 프로그래밍을 할 때 느꼈던 재미를 다시 느끼게 되는 순간이다.

0개의 댓글