소프트웨어를 만들다 보면 우리는 기능을 코드로 추상화하게 됩니다. 이때 선택지는 보통 두 가지입니다:
- 함수(function): 입력을 받아 결과를 반환하는 독립적인 블록
- 클래스(class): 상태와 동작을 하나의 객체로 묶는 설계 도구
이번 글에서는 함수와 클래스의 차이를 짚어보고,
특히 클래스를 쓸 때 설계를 잘하지 않으면 어떻게 비효율적으로 변하는지까지 살펴보겠습니다.
1. 함수 구성: 명확하고 빠른 기능 단위 설계
함수는 입력 → 처리 → 출력이라는 직관적인 흐름을 가집니다.
def add(a, b):
return a + b
함수의 특징
- 단일 책임 원칙(SRP)에 충실
- 테스트 및 사용이 쉬움
- 상태(state)가 없음 → 순수 함수가 되기 쉬움
- 간단한 데이터 처리, 유틸리티 기능, 변환 로직 등에 적합합니다.
2. 클래스 구성: 상태 + 동작의 집합
클래스는 데이터를 담는 **속성(attribute)**과, 동작을 담당하는 **메서드(method)**가 함께 있는 구조입니다.
class Calculator:
def __init__(self):
self.total = 0
def add(self, value):
self.total += value
def get_result(self):
return self.total
클래스의 특징
- 상태 유지가 가능 (예: self.total)
- 여러 동작을 묶어 구조화할 수 있음
- 재사용성과 확장성이 높음
- 객체 지향 설계에 적합
- 복잡한 로직, 여러 기능 조합, 상태 관리가 필요한 곳에 적합합니다.
3. 클래스 설계, 잘못하면 오히려 비효율적
클래스는 강력한 구조이지만, 잘못 설계하면 아무도 재사용하지 못하는 유틸성 없는 코드가 됩니다.
예: 단순 기능에 클래스 오버엔지니어링
class StringAdder:
def __init__(self):
pass
def add(self, a, b):
return a + b
- 굳이 상태도 없고, 한 번 쓰고 말 기능인데 클래스?
- 이럴 바엔 함수로 충분함
def add(a, b):
return a + b
4. 클래스 설계 시 주의할 점
| 체크 항목 | 설명 |
| 상태를 정말 유지해야 하는가? | 상태가 없다면 클래스는 과한 설계일 수 있음 |
| 기능이 확장될 가능성이 있는가? | 클래스는 기능의 묶음과 확장에 적합 |
| 테스트와 재사용이 쉬운가? | 과도한 의존성, 커플링은 클래스의 단점 |
| 내부 속성과 메서드가 잘 분리됐는가? | 역할이 명확하지 않으면 유지보수가 여려움 |
5. 언제 함수, 언제 클래스?
| 설명 | 함수가 적합 | 클래스가 적합 |
| 로직이 단순하다 | V | X |
| 상태를 유지할 필요가 없다 | V | X |
| 여러 기능이 하나로 묶여 있다 | X | V |
| 기능 확장 가능성이 크다 | X | V |
| 유지보수 및 테스크가 필요하다 | 경우에 따라 선택 | V |
정리하면
클래스는 잘 설계하면 강력한 구조지만,
잘못 설계하면 "재사용도 안 되고, 이해하기 어려운 코드"가 될 수 있습니다.
- 작은 기능은 함수로,
- 상태를 다루고 구조화된 기능은 클래스로!
이 균형을 잡는 감각이 바로 코드 설계력의 핵심입니다!
'파이썬 > 클래스와 객체 지향' 카테고리의 다른 글
| 파이썬 정적 메소드(Static Method) 이해하기 (0) | 2025.08.31 |
|---|---|
| 파이썬에서 클래스, 객체, 인스턴스, 개체 개념 정리 (0) | 2025.08.31 |
| _getitem__ 매직 메서드란? (0) | 2025.06.07 |
| 래핑(Wrapping)이란? (0) | 2025.06.06 |
| Python 생성자 함수: 가변 객체 사용 (0) | 2025.06.01 |