본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 인스턴스 변수와 클래스 변수의 완벽 이해 : 객체 지향 프로그래밍의 핵심 설계 전략

by Papa Martino V 2026. 2. 18.
728x90

인스턴스 변수와 클래스 변수
인스턴스 변수와 클래스 변수

 

파이썬(Python)은 명확하고 직관적인 문법을 가진 객체 지향 프로그래밍(OOP) 언어입니다. 파이썬에서 클래스를 설계할 때 초보 개발자와 숙련된 개발자를 가르는 가장 중요한 기준 중 하나는 바로 '데이터의 유효 범위(Scope)와 생명 주기(Lifecycle)'를 얼마나 정확하게 제어하느냐에 있습니다. 그 중심에는 인스턴스 변수(Instance Variable)클래스 변수(Class Variable)의 구분이 자리 잡고 있습니다. 이 글에서는 단순히 두 변수의 정의를 넘어, 메모리 구조적 관점에서의 차이, 실제 프로젝트에서 발생할 수 있는 안티 패턴(Anti-pattern), 그리고 효율적인 소프트웨어 설계를 위한 베스트 프랙티스를 심도 있게 다룹니다.


1. 클래스 변수와 인스턴스 변수의 근본적 정의

1.1 클래스 변수 (Class Variables)

클래스 변수는 클래스 정의 내에서 메서드 밖에 선언되는 변수입니다. 해당 클래스로부터 생성된 모든 인스턴스가 공유하는 데이터를 저장하는 데 사용됩니다. 특정 객체에 귀속되는 것이 아니라 클래스 자체에 귀속되므로, 모든 객체가 동일한 값을 참조해야 할 때 유용합니다.

1.2 인스턴스 변수 (Instance Variables)

인스턴스 변수는 보통 __init__ 메서드 내에서 self 키워드를 사용하여 정의됩니다. 각 객체(인스턴스)마다 독립적인 공간을 가지며, 객체 고유의 상태를 유지하는 데 사용됩니다. 하나의 인스턴스 변수 값이 변경되어도 다른 인스턴스에는 전혀 영향을 미치지 않습니다.


2. 메모리 구조와 가시성 비교

파이썬의 모든 것은 객체입니다. 클래스 자체도 객체이며, 인스턴스 또한 별도의 객체입니다. 클래스 변수는 클래스 객체의 네임스페이스(Namespace)에 저장되고, 인스턴스 변수는 각 인스턴스 객체의 네임스페이스에 저장됩니다.

항목 클래스 변수 (Class Variable) 인스턴스 변수 (Instance Variable)
선언 위치 클래스 내부, 메서드 외부 주로 __init__ 메서드 내부 (self 사용)
메모리 할당 클래스 로딩 시 1회 할당 인스턴스 생성 시마다 각각 할당
데이터 공유 모든 인스턴스가 공유함 인스턴스별로 독립적임
접근 방식 ClassName.variable 또는 self.variable self.variable 또는 instance.variable
주요 용도 전체 공유 설정, 상수, 인스턴스 카운팅 개별 객체의 고유 속성 (이름, 나이 등)
변경 영향 클래스 레벨 수정 시 모든 객체에 반영 해당 객체에만 국한됨

3. 실전 예제 (Sample Example)

다음은 온라인 게임의 캐릭터 시스템을 가정한 코드입니다. 모든 캐릭터가 공유하는 '서버 이름'은 클래스 변수로, 각 캐릭터의 '이름'과 '레벨'은 인스턴스 변수로 관리하는 예시입니다.

class GameCharacter:
    # 클래스 변수: 모든 캐릭터가 같은 서버에 접속함
    server_name = "Asia-Pacific_01"
    character_count = 0

    def __init__(self, name, level):
        # 인스턴스 변수: 각 캐릭터마다 고유함
        self.name = name
        self.level = level
        # 인스턴스가 생성될 때마다 클래스 변수 업데이트
        GameCharacter.character_count += 1

# 객체 생성
char1 = GameCharacter("전사", 10)
char2 = GameCharacter("마법사", 15)

print(f"캐릭터1 서버: {char1.server_name}, 이름: {char1.name}")
print(f"캐릭터2 서버: {char2.server_name}, 이름: {char2.name}")

# 클래스 변수 변경
GameCharacter.server_name = "Global_Alpha"

print(f"변경 후 캐릭터1 서버: {char1.server_name}")
print(f"현재 총 캐릭터 수: {GameCharacter.character_count}")

4. 주의해야 할 함정: 가변 객체(Mutable Objects)

클래스 변수를 사용할 때 가장 많이 하는 실수는 리스트(List)나 딕셔너리(Dict) 같은 가변 객체를 클래스 변수로 선언하고 인스턴스에서 수정하는 경우입니다. 이 경우 의도치 않게 모든 인스턴스의 데이터가 오염될 수 있습니다.

전문가의 조언: 만약 각 객체가 개별적으로 리스트를 가져야 한다면, 반드시 __init__ 안에서 인스턴스 변수로 초기화하십시오. 클래스 변수로 선언된 리스트는 모든 객체가 공유하는 하나의 통로와 같습니다.

5. 결론 및 설계 전략

효율적인 파이썬 프로그래밍을 위해서는 변수의 목적을 명확히 해야 합니다.

  • 클래스 변수는 전역 설정, 공통 상수, 또는 생성된 인스턴스의 개수를 추적하는 등의 메타 데이터 관리에 적합합니다.
  • 인스턴스 변수는 객체의 실제 데이터(State)를 담는 데 집중해야 합니다.

이러한 구분은 코드의 가독성을 높일 뿐만 아니라, 메모리 사용을 최적화하고 예기치 못한 버그를 방지하는 강력한 수단이 됩니다.


출처 및 참고 문헌

  • Python Software Foundation. "The Python Language Reference - Data Model." python.org.
  • Luciano Ramalho. "Fluent Python: Clear, Concise, and Effective Programming." O'Reilly Media.
  • Dusty Phillips. "Python 3 Object-Oriented Programming." Packt Publishing.
728x90