instance vs. static
- 인스턴스 필드 (instance field) : 객체 별로 "따로" 보관되는 데이터
- 스태틱 필드 (static field) : 모든 객체가 "공유" 하는 데이터
class Point:
def __init__(self, x = 0, y = 0):
self.x = x;
self.y = y;
ex1 = Point(1,2)
ex2 = Point(3,4)
인스턴스 필드 x,y 를 가진 Point 클래스 객체를 두 개 생성했다. 각 객체의 필드들은 객체의 __dict__ 어트리트뷰트에 저장된다.
스태틱 필드들은 모든 객체들의 타입을 관리하는 "타입 객체" 에 저장된다.
스태틱 필드의 문법
class Point:
count = 0
def __init__(self, x = 0, y = 0):
self.x = x;
self.y = y;
ex1 = Point(1,2)
ex2 = Point(3,4)
클래스의 필드들은 객체의 생성 시점에 일괄적으로 만드는 것이 좋다. 스태틱 필드는 클래스 생성자에서 만드는 것이 아니라 클래스 몸체에 선언된다.
스태틱 필드의 접근
스태틱 필드를 사용할 때는 항상 클래스 이름을 통해 접근하도록 하자.
class Point:
count = 0
def __init__(self, x = 0, y = 0):
self.x = x;
self.y = y;
ex1 = Point(1,2)
ex2 = Point(3,4)
#1. 클래스 이름으로 접근
Point.count = 100
#2. 객체 이름으로 접근
Print(ex1.count) # 100
ex1.count = 200
print(Point.count) # 100
print(ex1.count) # 200
print(ex2.count) # 100
스태틱 메소드
- 인스턴스 메소드(instance method) : 객체가 있어야만 호출 가능
- 스태틱 메소드(static method) : 객체가 없어도 호출 가능
class Point:
count = 0
def __init__(self, x = 0, y = 0):
self.x = x;
self.y = y;
#instance method
def foo(self):
print('foo func')
# static method. self가 없음!
def bar():
print('bar func')
p = Point()
p.foo() # 일반 메소드 호출. 내부적으로 인터프리터가 객체를 첫 번째 인자로 넘겨줌
Point.foo(t) # 일반 메소드 호출. 함수의 첫 번째 인자를 직접 넘겨줌
Point.bar() # 스태틱 메소드 호출. 클래스 이름으로 호출
❕ 참고
'Python 기초' 카테고리의 다른 글
14. continue, break (0) | 2022.07.15 |
---|---|
13. 자료구조의 변경 (0) | 2022.07.15 |
11. 클래스 (Class) - 1 (0) | 2022.03.30 |
10. for 문 (0) | 2022.01.25 |
9. if 조건문 (0) | 2022.01.24 |