본문 바로가기
카테고리 없음

객체지향 프로그래밍(OOP) 입문: 클래스와 인스턴스

by BOOST YOUR INFORMATION 2026. 7. 17.

객체지향 프로그래밍(OOP) 입문: 클래스와 인스턴스
객체지향 프로그래밍(OOP) 입문: 클래스와 인스턴스

1. 기본 개요

파이썬 공식 문서(Python 3 Tutorial, "9. Classes")에 따르면, 클래스는 새로운 타입의 객체를 만들기 위한 설계도이며, 클래스로부터 만들어진 각각의 객체를 인스턴스(instance)라고 부릅니다. 클래스는 class 키워드로 정의합니다.

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        return f"{self.name}가 짖습니다!"

__init__은 인스턴스를 생성할 때 자동으로 호출되는 초기화 메서드이며, 공식 문서는 이를 "클래스 인스턴스 객체가 생성된 직후 실행되는 특수 메서드"라고 설명합니다. 첫 번째 매개변수인 self는 관례적인 이름일 뿐 파이썬 언어 자체가 강제하는 키워드는 아니지만, 거의 모든 파이썬 코드에서 관행적으로 사용됩니다.

2. 기능과 스펙

클래스와 관련된 핵심 개념은 다음과 같습니다.

  • 속성(attribute): 인스턴스나 클래스가 가지는 데이터. self.name처럼 인스턴스별로 값이 다를 수 있는 인스턴스 속성과, 모든 인스턴스가 공유하는 클래스 속성이 있다
  • 메서드(method): 클래스 안에 정의된 함수로, 첫 번째 인자로 인스턴스 자신(self)을 받는다
  • 상속(inheritance): 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)가 물려받는 것. class Puppy(Dog):처럼 괄호 안에 부모 클래스를 지정한다
  • 메서드 오버라이딩: 자식 클래스가 부모 클래스의 메서드를 같은 이름으로 재정의하는 것

파이썬 공식 문서는 클래스 속성과 인스턴스 속성을 구분할 때 흔히 발생하는 함정도 언급합니다. 클래스 속성으로 리스트 같은 가변 객체를 선언하면, 모든 인스턴스가 그 객체를 공유하게 되어 한 인스턴스에서의 변경이 다른 인스턴스에도 영향을 줄 수 있습니다.

파이썬의 모든 클래스는 기본적으로 object를 상속하며, 다중 상속(여러 부모 클래스를 동시에 상속)도 지원한다는 점이 문서에 명시되어 있습니다.

3. 장단점

장점

  • 데이터(속성)와 그 데이터를 다루는 로직(메서드)을 하나의 단위로 묶어 코드를 구조화할 수 있다
  • 상속을 통해 공통 기능을 재사용하고, 자식 클래스에서 필요한 부분만 확장·수정할 수 있다
  • 여러 인스턴스를 만들어 같은 구조를 가진 서로 다른 데이터를 독립적으로 관리할 수 있다

단점

  • 클래스 계층 구조가 복잡해지면(특히 다중 상속) 어떤 메서드가 실제로 호출되는지 추적하기 어려워질 수 있다
  • 작은 스크립트나 단순한 데이터 처리 작업에는 클래스 설계가 오히려 불필요한 복잡도를 더할 수 있다
  • 클래스 속성과 인스턴스 속성을 혼동하면 가변 객체 공유로 인한 예상치 못한 버그가 발생하기 쉽다

개인적 견해 및 비판: 파이썬 입문자들이 OOP를 배울 때 가장 자주 겪는 어려움은 "언제 클래스를 써야 하는가"에 대한 감각 부족이라고 봅니다. 파이썬은 함수형 스타일과 절차형 스타일도 잘 지원하는 언어이기 때문에, 모든 문제를 클래스로 풀려는 시도(과도한 설계, over-engineering)는 오히려 코드를 읽기 어렵게 만드는 경우가 많습니다. 개인적으로는 "상태를 가진 객체가 여러 개 필요하거나, 관련된 데이터와 동작을 하나로 묶어야 할 명확한 이유가 있을 때"만 클래스를 도입하는 것이 실용적이라고 생각합니다. 반대로 다중 상속은 파이썬이 문법적으로는 허용하지만, 메서드 해석 순서(MRO)를 정확히 이해하지 못한 채 사용하면 유지보수 지옥에 빠지기 쉬운 기능이라, 실무에서는 신중하게 접근해야 한다고 봅니다.

4. 추천 대상

  • 절차형 코드에서 벗어나 객체지향적 사고를 익히고 싶은 파이썬 입문자
  • 게임, 시뮬레이션, GUI 프로그램처럼 상태를 가진 여러 객체를 다뤄야 하는 개발자
  • 코드 재사용성과 확장성을 고려한 설계를 연습하려는 중급 개발자

5. FAQ

Q1. self는 반드시 그 이름을 써야 하나요?
아닙니다. self는 관례일 뿐이며 다른 이름을 써도 문법적으로는 동작합니다. 다만 파이썬 커뮤니티 전반의 관행이므로 다른 이름을 쓰면 협업 시 혼란을 줄 수 있습니다.

Q2. 클래스 속성과 인스턴스 속성의 차이는 무엇인가요?
클래스 속성은 클래스 몸체에 직접 선언되어 모든 인스턴스가 공유합니다. 인스턴스 속성은 보통 __init__ 안에서 self.속성명 = 값으로 정의되며, 인스턴스마다 독립적인 값을 가집니다.

Q3. 상속과 컴포지션(composition) 중 무엇을 써야 하나요?
이는 설계 철학의 문제로, 파이썬 공식 문서가 특정 답을 규정하고 있지는 않습니다. 일반적으로 "is-a" 관계(강아지는 동물이다)에는 상속을, "has-a" 관계(자동차는 엔진을 가진다)에는 컴포지션을 사용하는 것이 널리 알려진 설계 가이드라인입니다.

6. 출처


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 ⚡ 정보 부스터 🚀