Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 클래스 변수 변경하기 – 클래스 변수와 인스턴스 변수의 차이

파이썬(Python) 객체 지향 프로그래밍에서는 변수를 클래스 수준(class level) 또는 인스턴스 수준(instance level)에서 사용할 수 있습니다. 여기서 변수란 프로그램 안에서 사용하는 값을 나타내는 기호(symbol)입니다.

클래스 수준에서 선언된 변수를 클래스 변수(class variable), 인스턴스 수준에서 선언된 변수를 인스턴스 변수(instance variable)라고 부릅니다. 간단한 예제를 통해 두 변수의 차이를 살펴보겠습니다.

# Shark 클래스 정의
class Shark:
    animal_type = 'fish'  # 클래스 변수

    def __init__(self, name, age):
        self.name = name  # 인스턴스 변수
        self.age = age    # 인스턴스 변수

# Shark 클래스의 객체(인스턴스) 생성
obj1 = Shark("Jeeva", 54)
obj2 = Shark("Roli", 45)

print("두 인스턴스로 클래스 변수 출력")
print("obj1.animal_type =", obj1.animal_type)
print("obj2.animal_type =", obj2.animal_type)

# 인스턴스를 통해 클래스 변수를 변경해 보기
obj1.animal_type = "BigFish"

print("\n한 인스턴스에 변경을 가한 후 클래스 변수 출력")
print("obj1.animal_type =", obj1.animal_type)
print("obj2.animal_type =", obj2.animal_type)

실행 결과

두 인스턴스로 클래스 변수 출력
obj1.animal_type = fish
obj2.animal_type = fish

한 인스턴스에 변경을 가한 후 클래스 변수 출력
obj1.animal_type = BigFish
obj2.animal_type = fish

왜 이런 결과가 나올까?

위 프로그램에서는 Shark 클래스를 정의한 뒤, 객체(obj1)를 통해 클래스 변수 animal_type을 변경하려고 시도했습니다. 하지만 실제로 일어난 일은 클래스 변수가 수정된 것이 아니라, 해당 객체에만 존재하는 새로운 인스턴스 변수가 생성된 것입니다.

이렇게 생성된 인스턴스 변수는 같은 이름의 클래스 변수를 가리게(shadowing) 됩니다. 따라서 obj1은 새로 만든 인스턴스 변수 "BigFish"를 반환하지만, obj2에는 아무런 변화가 없어 여전히 클래스 변수인 "fish"를 출력하게 됩니다.

올바른 방법: 클래스 이름으로 직접 변경하기

모든 인스턴스에 공통으로 적용되도록 클래스 변수를 변경하려면, 인스턴스가 아니라 클래스 이름 자체를 통해 접근해야 합니다. 앞선 프로그램을 올바르게 수정한 버전은 다음과 같습니다.

# Shark 클래스 정의
class Shark:
    animal_type = 'fish'  # 클래스 변수

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

# Shark 클래스의 객체 생성
obj1 = Shark("Jeeva", 54)
obj2 = Shark("Roli", 45)

print("두 인스턴스로 클래스 변수 출력")
print("obj1.animal_type =", obj1.animal_type)
print("obj2.animal_type =", obj2.animal_type)

# 클래스 이름을 통해 클래스 변수 변경
Shark.animal_type = "BigFish"
print("클래스 자체를 통해 변경된 새 값: %s" % (Shark.animal_type))

print("\n변경 후 각 인스턴스의 클래스 변수 출력")
print("obj1.animal_type =", obj1.animal_type)
print("obj2.animal_type =", obj2.animal_type)

실행 결과

두 인스턴스로 클래스 변수 출력
obj1.animal_type = fish
obj2.animal_type = fish
클래스 자체를 통해 변경된 새 값: BigFish

변경 후 각 인스턴스의 클래스 변수 출력
obj1.animal_type = BigFish
obj2.animal_type = BigFish

정리

핵심을 요약하면 다음과 같습니다.

  • obj1.animal_type = "BigFish" → obj1 객체에 새로운 인스턴스 변수를 만들어 클래스 변수를 가리므로, 다른 인스턴스에는 영향을 주지 않습니다.
  • Shark.animal_type = "BigFish" → 클래스 변수 자체를 변경하므로, 해당 클래스의 모든 인스턴스에 동일하게 적용됩니다.

따라서 파이썬에서 클래스 변수를 변경할 때는 의도에 따라 접근 방식을 신중하게 선택해야 합니다. 특정 객체에만 다른 값을 지정하려면 인스턴스를 통해, 모든 객체에 공통된 값을 적용하려면 클래스 이름을 통해 변경하는 것이 올바른 방법입니다.