Python/파이썬 기초

파이썬 클래스에서 self가 붙어서 선언된 변수의 의미, 사용 이유

jimmy_AI 2022. 5. 3. 18:46
반응형

Python class self 역할, 일반 변수와 차이

파이썬에서 클래스 객체를 선언할 때, self를 이용하여 변수를 선언하는 경우가 많습니다.

혼동하기 쉬운 self 선언 변수의 의미와 일반 변수와의 차이를 간략히 살펴보겠습니다.

 

 

self로 선언된 변수 예시

이해를 돕기 위하여, '공격력' 정보와 '체력' 정보를 가지는 Unit이라는 객체를 생각해보겠습니다.

 

클래스 선언부와 내부 함수인 my_info로 Unit이라는 클래스가 구성되었음을 가정하겠습니다.

선언부에서는 self를 이용하여 att과 hp 변수를 다시 선언하고 있습니다.

class Unit:
    def __init__(self, hp, att = 0): # hp, att 변수를 input으로 받으면서 선언(att은 기본 값 0)
        # self 변수로 재선언 => 객체 속성으로 저장
        self.att = att
        self.hp = hp
    
    def my_info(self):
        print("공격력 : %d, 체력 : %d"%(self.att, self.hp)) # 내부 함수에서도 self로 사용 필수

참고로, 내부 함수에서도 해당 변수 값들을 사용하려면 self 변수 형태로 사용해야합니다.

 

해당 클래스의 선언hp, att 정보를 input으로 받는 상황을 가정하였으므로,

아래 코드처럼 진행이 가능할 것입니다.

u1 = Unit(hp = 20, att = 5)

이제 내부 함수인 my_info 함수 실행과 u1 객체 내의 hp, att 속성을 조회해보겠습니다.

u1.my_info() # 공격력 : 5, 체력 : 20
print(u1.att) # 5
print(u1.hp) # 20

선언 시 input으로 받았던 att, hp 정보가 u1 객체 내에 잘 저장된 것을 확인할 수 있습니다.

 

이렇게 u1 객체 내에 att, hp의 속성 값을 받아 저장하게 만들어주어 외부 호출 및

내부 함수에서 해당 변수들을 사용할 수 있게 만들어주는 것이 self의 역할입니다.

반응형

self로 선언되지 않은 변수 예시, 차이 비교

그렇다면 self로 변수를 선언하지 않게 된다면 어떻게될까요?

이 차이를 통하여 self의 역할을 확인해보겠습니다.

 

위의 예시 class 선언 코드를 아래처럼 변경해 보겠습니다.

class Unit_2:
    def __init__(self, hp, att = 0): # hp, att 변수를 input으로 받으면서 선언(att은 기본 값 0)
        # self로 선언하지 않은 경우(__init__ 함수 내의 지역 변수 효과)
        att = att
        hp = hp
        
    def my_info(self):
        print("공격력 : %d, 체력 : %d"%(att, hp)) # att, hp 변수 인식 불가

이제 마찬가지로 객체 선언 후, 내부 함수 및 직접 호출을 시도해보겠습니다.

u2 = Unit_2(hp = 20, att = 5)

u2.my_info() # NameError: name 'att' is not defined
print(u2.att) # AttributeError: 'Unit_2' object has no attribute 'att'
print(u2.hp) # AttributeError: 'Unit_2' object has no attribute 'hp'

att 및 hp 변수를 인식할 수 없다는 오류 메시지가 등장하며,

u2 객체 내에 att와 hp 속성이 정상적으로 부여되지 않은 것으로 보였습니다.

 

즉, self를 붙인 변수와 그렇지 않은 변수의 차이를 정리하면

self를 붙이지 않고 선언한 경우는 해당 함수 내에서만 사용 가능한 지역 변수로 보셔야 하며,

self를 통해 선언해야만 속성 정상 부여 및 다른 내부 함수에서 호출이 가능해지는 것입니다.