Python

파이썬 클래스 변수 사용법

찐남 2022. 9. 30. 21:01

파이썬에서는 어떤 경우에 클래스 변수를

사용할 수 있을까요?

 

이번 포스팅에서는 클래스 및 인스턴스 변수에 대해

알아보겠습니다.

 

클래스 변수 정의

클래스의 모든 인스턴스가 공유하는 변수입니다. 

클래스 변수는 클래스 내에서 정의되지만 

클래스의 메서드 일부는 외부에서 정의됩니다.

 

클래스 변수는 인스턴스 변수만큼

자주 사용되지는 않습니다.

 

인스턴스 변수는 해당 특정 클래스에 대해

생성되는 각 인스턴스에 고유한 변수입니다.

 

반면에 클래스 변수는 해당 클래스에 대해

생성된 모든 인스턴스에 대해

일반적으로 동일하게 유지되는 변수로

생각할 수 있습니다.

 

용어 설명은 차치하고,

이해를 돕기 위해

몇 가지 코딩 예제를 살펴보겠습니다.

 

 

클래스 변수 사용법

class Employee:
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.email = first + '.' + last + '@email.com'
        self.pay = pay
        
emp1 = Employee('Brian', 'Ryu', 500000)

 

위 코드에서 self-keyword를 사용하여

선언되는 변수는 인스턴스 변수이고 고유하며,

일반적으로 해당 클래스에 대해 생성된

모든 인스턴스에 대해 변경됨을 알 수 있습니다.

 

여기서 emp1은 Employee 클래스에 대해

생성된 인스턴스입니다.

 

이미 언급했듯이 클래스 변수는 

해당 클래스에 대해 생성된 모든 인스턴스 간에 

공유되어야 합니다. 

 

아래의 코드를 보면,

클래스 변수를 별도로 갖아야 하는 이유에 대해

질문이 있을 수 있습니다.

 

class Employee:
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.email = first + '.' + last + '@email.com'
        self.pay = pay
        
    def apply_raise(self):
        self.pay = int(self.pay * 1.04)
        
emp1 = Employee('Brian', 'Ryu', 500000)
print(emp1.pay)
print(emp1.apply_raise())
print(emp1.pay)

 

클래스를 사용하기 전에

몇 가지 주의해야 할 사항이 있습니다.

 

첫 번째 문제는 raise amount(=1.04)가

인스턴스 및 클래스 변수로 선언되지

않는다는 것입니다.

 

따라서 pay, first, last name과 같은

다른 인스턴스 변수와 유사한 속성을 통해
호출할 수 없습니다.

 

두 번째 문제는 raise amount(=1.04)가

여러 곳에서 언급되는 경우

수동으로 업데이트하는 일종의 변경 사항을

두 곳 이상에서 변경해야 한다는 것입니다.

 

따라서 이러한 시나리오를 극복하기 위해

클래스 변수를 사용합니다.

 

class Employee:
    raiseAmount = 1.04 
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.email = first + '.' + last + '@email.com'
        self.pay = pay
        
    def apply_raise(self):
        self.pay = int(self.pay * raiseAmount)
        
emp1 = Employee('Brian', 'Ryu', 500000)
print(emp1.pay)
print(emp1.apply_raise())
print(emp1.pay)

 

위의 코드에서 클래스 변수(raise_amount)가

호출되는 방식으로 인해 오류가 발생하는 것을

볼 수 있습니다.

 

절대 혼동해서는 안됩니다!!!!

인스턴스 키워드(self)를 사용하거나

클래스 자체를 사용하여

클래스 변수를 호출해야 합니다.

 

다음 코드가 변수를 호출하는

올바른 방법입니다.

 

class Employee:
    raiseAmount = 1.04 
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.email = first + '.' + last + '@email.com'
        self.pay = pay
        
    def apply_raise(self):
        self.pay = int(self.pay * self.raiseAmount)
        
    def apply_raise(self):
        self.pay = int(self.pay * Employee.raiseAmount)
        
emp1 = Employee('Brian', 'Ryu', 500000)
print(emp1.pay)
print(emp1.apply_raise())
print(emp1.pay)

 

draise_amount는 클래스 변수이므로 

instance(self 키워드)를 사용하여 

어떻게 액세스 할 수 있는지 알아보았습니다.

 

명확하게 이해하기 위해서

아래 코드를 참고하세요.

 

class Employee:
    raiseAmount = 1.04 
    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.email = first + '.' + last + '@email.com'
        self.pay = pay
        
    def apply_raise(self):
        self.pay = int(self.pay * self.raiseAmount)
        
    def apply_raise(self):
        self.pay = int(self.pay * Employee.raiseAmount)
        
emp1 = Employee('Brian', 'Ryu', 500000)

print(emp1.__dict__)
print("==============================================================================")
print(Employee.__dict__)

 

위 코드의 핵심은 여기에서

인스턴스(emp1)를 사용하여

속성(raise_amount)에 액세스 하려고 할 때마다

먼저 해당 인스턴스에 해당 속성이 있는지 확인하고,

그렇지 않은 경우 해당 속성을 검색한다는 것입니다.

 

따라서 emp1에는 raise_amount 속성이 없지만

Employee 클래스에는 raise_amount 속성이 있습니다.

 

 

반응형