공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다. 틀린 부분에 대한 지적은 감사합니다. |
파이썬 클래스를 공부하며 많이 헷갈렸던 객체 변수(object variable)와 클래스 변수(class variable)에 대해 정리하자. 이제 클래스에 소속된 변수들을 멤버 변수 또는 필드(field)라고 부르는데 필드는 일반적인 변수와 똑같다.
한 가지 차이점이 있다면 네임스페이스(namespace)에 속해있기 때문에 필드는 해당 클래스 또는 객체 내부에서 의미가 있다. (해당 클래스 내부와 객체 내부를 네임스페이스라고 한다.) 다시 얘기해서 필드가 통용되는 공간을 의미한다.
필드에는 객체 변수와 클래스 변수가 존재한다. 필드를 소유하고 있는 대상이 클래스냐 객체냐에 따라 객체 변수인지 클래스 변수인지가 구별된다.
1. 클래스 변수(class variable)
클래스 변수는 해당 클래스에 속해있는 변수로 클래스로부터 인스턴스화를 거쳐 생성된 모든 객체들이 공유하는 변수이다. 클래스 변수는 1개만 존재하여 어떤 객체가 클래스 변수를 변경한다면 모든 객체들에게도 변경된 내용이 적용된다.
클래스명.변수를 통해 사용한다.
클래스로부터 만들어질 객체들이 공유하는 클래스 변수는 Test_num = 10 이 부분이다. 클래스 변수 Test_num을 200으로 변경했더니 객체 t1, t2가 가진 Test_num 또한 모두 변경된 것을 확인할 수 있다.
t1이 가진 클래스변수를 호출한다고 t1.Test_num을 하게 되면 이는 객체 변수 Test_num을 호출하게 되는 것이다. 변수명이 같다고 헷갈리면 안 된다. 위의 예시에서 t1.Test_num = 100을 사용하면 클래스 변수명과 같기 때문에 클래스 변수가 변할 것 같지만 클래스 변수는 값이 변하지 않고 두 개의 변수가 다른 값을 출력한다.
이는 객체에 객체 변수 Test_num을 생성하여 100이란 값을 가지도록 한것이기 때문이다.
2. 객체 변수(object variable)
객체 변수(인스턴스 변수)는 클래스로부터 생성된 각각의 객체(인스턴스)에 속해 있는 변수이다. 객체별로 객체 변수를 하나씩 따로 가지고 서로 공유하지 않는다. 따라서 어느 한 객체에서 동일한 이름의 객체 변수의 값을 변경하더라도 다른 객체에는 전혀 영향을 미치지 않는다.
객체가 가진 변수이므로 기본적으로 self.변수명 으로 생성자에서 초기화되거나 객체 메소드에서 self를 이용하여 사용되는 변수 또는 객체명.변수명을 통해 사용되는 변수라고 생각하면 된다.
t1의 객체 변수 num1을 70의 값으로 변경하여도 t2의 객체 변수 num1의 값은 변경되지 않는 것을 확인할 수 있다.
실수로 존재하지 않는 객체 변수 t1.Test_num을 사용하면 클래스는 먼저 객체변수에서 Test_num이란 변수가 존재하는지 찾는다. 찾는데 해당 이름의 변수가 없다면 클래스 변수에서 찾아 값을 호출하기 때문에 값이 출력된다. 따라서 객체 변수로 Test_num이란 변수가 존재한다고 착각하기 쉽기 때문에 주의해야 한다.
객체 변수와 클래스 변수 두가지의 변수를 혼용하여 사용하게 되면 원하는 동작을 하지 않으므로 주의해야 한다.
만약 모든 객체가 공통으로 가져야 하고 만약 값이 변경되어도 모든 객체에 적용돼야 하는 값이라면, 클래스 변수가 모든 객체마다 값을 적용하지 않고 클래스 변수 하나만 변경하면 되기 때문에 유용한 경우가 존재하지만 주로 객체 변수를 사용한다.
'언어 > Python' 카테고리의 다른 글
[Python 기본 공부정리] 10. 패키지(package) (0) | 2020.01.04 |
---|---|
[Python 기본 공부정리] 9. 모듈(module) (0) | 2020.01.03 |
[Python 기본 공부정리] 8-3. 클래스 - 상속(inheritance) (0) | 2020.01.01 |
[Python 기본 공부정리] 8-2. 클래스 - 생성자(constructor) (0) | 2019.12.30 |
[Python 기본 공부정리] 8-1. 클래스 - 클래스(class) 기본 (0) | 2019.12.29 |
댓글