IT/언어

[python] python 인스턴스 변수와 클래스 변수

개발자 두더지 2020. 8. 23. 19:59
728x90

 클래스가 가지는 변수에는 클래스 변수와 인스턴스 변수 두 종류가 존재한다. 이 포스팅에서는 변수의 선언 방법이나 차이점에 대해 설명한다.

 

1. 인스턴스 변수란

 인스턴스변수란 각각의 인스턴스 마다 독립한 변수이다. 예를 들어, 클래스는 몇 개의 인스턴스를 생성하는 것이 가능하지만, 각각의 인스턴스 변수는 다른 것으로 취급하는 변수에 값을 대입해도, 인스턴스마다 각각의 값을 보존되어 있다. 

1) 인스턴스 변수의 선언과 접근 방법

 인스턴스 변수를 만드는 경우는 클래스 내의 메소드에 아래와 같이 작성한다. 일반적으로 인스턴스 변수의 생성은 생성자 클래스 __init__()내부에서 이루어진다.

self.인스턴스변수 = 값

 또한, 인스턴스 변수에 접근할 때는 아래와 같이 작성한다.

self.인스턴스변수

2) 인스턴스 변수의 사용예

 아래는 인스턴스 변수를 작성하고 그 변수를 표시하는 예이다.

class Myclass:
	def __init__(self, text) : # 초기화 : 인스턴스 작성시에 자동적으로 호출된다.
		self.vlaue = text # 인스턴스 변수 value를 선언한다.
        
    def print_value(self): # 인스턴스 변수 value의 값을 표시하는 함수
    	print(self.value) # 인스턴스 변수 value에 접근하고 표시한다.

if __name__ = "__main__":
	a = MyClass("123") # 인스턴스 a를 작성
    b = MyClass("abc") # 인스턴스 b를 작성
    
    print(a.value) # 123
    print(b.value) # abc
    
    a.print_value() # 123
    b.print_value() # abc

 위에서 예에서, 클래스 MyClass내의 변수 value는 인스턴스 변수로써 정의되어 있다. 인스턴스 a, b의 2개의 인스턴스가 작성되어 있지만, 각각의 인스턴스 변수 vlaue는 별도의 값을 보존하고 있다는 것을 확인할 수 있다.

 또한, Python에서는 클래스 내에 정의된 메소드로부터 인스턴스 변수로 접근하는 경우에 메소드(인스턴스 메소드)의 인수에 self를 전달하여 접근한다. (self가 아닌 다른 문자열도 동작하지만, Python에서는 관습적으로 self를 전달한다). 인수의 self로는 자동적으로 인스턴스 자체가 전달된다. 위 예의 print_value메소드는 인스턴스 변수 vlaue에 접근하고 그 값을 표시한다. 

 

2. 클래스 변수란

 클래스 변수는 인스턴스 변수와 달리 모든 인스턴스 사이에 공유된 값을 가진 변수이다. 클래스 변수는 인스턴스를 생성하는 것이 아닌 참고하는 것이 가능하다.

1) 클래스 변수의 선언과 접근 방법

클래스 변수를 선언할 때는 인스턴스 변수와 달리 self를 붙이지 않고 클래스 내에 선언한다.

class MyClass:
	클래스변수 = 값

또한, 클래스 변수에 접근할 때는 아래와 같이 기재한다.

클래스.클래스변수

2) 클래스 변수의 사용예

아래에 클래스 변수를 작성하고 그 변수의 값을 표시하는 예이다. 

class MyClass:
	value = "abc" # 클래스 변수를 선언

if __name__ == "__main__":
	print MyClass.value # abc

위의 예에서는 클래스의 인스턴스를 생성하는 것이 아닌 Myclass 의 클래스 변수 value에 접근하여 그 값을 표시하고 있다.

아래의 코드는 클래스의 인스턴스를 생성하고 클래스 변수를 표시하는 예이다.

class MyClass:
	vlaue = 0 # 클래스 변수를 선언

    def __init__(self): # 초기화 : 인스턴스 생성
    	MyClass.value += 1

if __name__ == "__main__":
	a = MyClass() # 인스턴스 a를 생성한다.
    print MyClass.vlaue # 1
    
    b = MyClass() # 인스턴스 b를 생성한다.
    print MyClass.value # 2

위 코드에서는 인스턴스를 생성할 때마다 클래스 변수 vlaue 를 +1하고 있다.

3) 클래스 변수 사용시 주의사항

클래스 변수에 접근할 때는 특별히 이유가 없다면 '인스턴스.클래스변수' 나 'self.클래스변수'와 같이 접근하는 것은 피해야한다. python에는 인스턴스 변수를 인스턴스 객체로부터 생성하는 것이 가능하므로 의도치 않게 클래스 변수를 인스턴스 변수로 은폐해버리는 경우가 있다.

 

3. 인스턴스 변수와 클래스 변수의 차이점 정리

차이점 클래스 변수 인스턴스 변수
사용 구분 모든 인스턴스에서 공유하는 값 그 인스턴스만 사용하는 값
정의하는 곳 클래스 정의문 바로 아래에 대입된 변수 함수 정의문 바로 아래에 대입된 self의 속성
클래스 객체로부터 참고 가능 불가능
인스턴스 객체로부터 참고 가능 가능
변경 모든 인스턴스가 변경 그 인스턴스의 속성만 변경

참고자료

https://www.atmarkit.co.jp/ait/articles/1907/30/news021.html

https://python.ms/attribute/#_1-%EF%BC%92%E3%81%A4%E3%81%AE%E5%B1%9E%E6%80%A7%E3%81%AE%E9%81%95%E3%81%84

https://uxmilk.jp/41600

728x90