파이썬/클래스와 객체 지향

클래스 vs 함수: 어떻게 설계하고 구성할 것인가?

Data Jun 2025. 6. 22. 15:30

소프트웨어를 만들다 보면 우리는 기능을 코드로 추상화하게 됩니다. 이때 선택지는 보통 두 가지입니다:

  • 함수(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

 

 

정리하면

 

클래스는 잘 설계하면 강력한 구조지만,

잘못 설계하면 "재사용도 안 되고, 이해하기 어려운 코드"가 될 수 있습니다.

  • 작은 기능은 함수로,
  • 상태를 다루고 구조화된 기능은 클래스로!

이 균형을 잡는 감각이 바로 코드 설계력의 핵심입니다!