728x90
인스턴스 변수 :
- 인스턴스를 생성해야 비로소 사용할 수 있는 변수
- 독립적인 메모리 공간을 차지하고 있으며 해당 인스턴스에게만 영향을 끼친다.
클래스 변수 :
- 클래스가 로딩 되면서 미리 메모리 공간을 할당하고 저장되는 변수
- 모든 인스턴스에게 공유되는 변수이다.
- 클래스 변수의 접근 방법 : 클래스명.클래스 변수명 (권장사항)
- 클래스 변수 값의 변경은 모든 인스턴스에게 영향을 끼친다.
- 클래스 변수는 인스턴스 생성 없이도 접근 가능!
class Car:
# Car 클래스의 필드
# 클래스 변수는 반드시 필드로 선언해줘야 한다. (중요)
# 인스턴스 변수의 경우 생성자 내부에서 선언해줘도 됨.
count = 0
# 기본 생성자
def __init__(self):
# 인스턴스 변수 생성
# 얘네는 필드로 선언해 주지 않아도 된다.
self.color = "노랑"
self.speed = 0
# 클래스 변수는 반드시 필드로 선언해줘야 한다. (중요)
# 그렇지 않으면 "has no attribute 'count'" 오류가 발생한다.
Car.count += 1
def __str__(self):
print("color : ",self.color)
print("speed : ",self.speed)
print("Car.count : ", Car.count)
print(Car.count) # 0
print(id(Car.count))
# 인스턴스 생성
car1 = Car()
car1.__str__() # 1
print(id(Car.count))
print(id(car1.count))
# 인스턴스가 생성될 때마다 주소가 새로 할당된다.
# 클래스 변수의 경우 해당 주소를 모든 인스턴스가 공유한다.
car2 = Car()
car2.__str__() # 2
print(id(Car.count))
print(id(car1.count))
print(id(car2.count))
# 중요 사항 #
클래스 변수는 반드시 필드로 선언해야 한다!!
인스턴스가 새로 생성될 때마다 클래스 변수의 주소가 새로 할당된다.
단, 클래스 변수의 메모리 주소를 인스턴스가 모두 공유하므로 서로 다른 인스턴스로 클래스 변수를 호출하더라도 같은 값과 같은 주소가 출력된다!
class Car:
# Car 클래스의 필드
count = 0
count += 1
# 클래스 변수는 반드시 필드로 선언해줘야 한다. (중요)
# 기본 생성자
def __init__(self):
# 인스턴스 변수 생성
# 얘네는 필드로 선언해 주지 않아도 된다.
self.color = "노랑"
self.speed = 0
#Car.count += 1
# 클래스 변수는 반드시 필드로 선언해줘야 한다. (중요)
# 그렇지 않으면 "has no attribute 'count'" 오류가 발생한다.
def __str__(self):
print("color : ",self.color)
print("speed : ",self.speed)
print("Car.count : ", Car.count)
# 이처럼 "count += 1" 을 생성자에 넣지 않은 경우 #
클래스 변수가 되지만, Car.count = 1 로 고정된 채, 값이 변하지 않는다.
왜냐하면 인스턴스가 생성될 때, 클래스의 전체가 로딩되는 것이 아니라,기본생성자 함수만 로딩되기 때문이다!
클래스 변수는 필드로, 인스턴스 변수는 생성자 내부에 정의하는 것이 가장 깔끔하다!
'Python > 객체지향 프로그래밍' 카테고리의 다른 글
(Python) 파이썬 변수 종류 / None / 오버로딩 & 오버라이딩 (0) | 2024.01.15 |
---|---|
(Python) 객체지향 프로그래밍 - 인스턴스가 함수의 인자값인 경우 (0) | 2024.01.15 |
(Python) 객체지향 프로그래밍 - self (0) | 2024.01.10 |
(Python) 객체지향 프로그래밍 - 매개변수가 있는 생성자 (0) | 2024.01.10 |
(Python) 객체지향 프로그래밍 - 은닉화, 캡슐화 (0) | 2024.01.06 |