클래스와 인스턴스
인스턴스 변수
- 인스턴스의 속성(attribute)
- 각 인스턴스들의 고유한 변수
- 메서드에서
self.<name> 으로 정의
- 인스턴스 생성 이후
<instance>.<name> 으로 접근 및 값 할당 가능
클래스 변수
- 클래스의 속성(attibute)
- 모든 인스턴스가 공유함
- 클래스 선언 내부에서 정의
<classname>.<name> 으로 접근 및 할당
class Circle:
pi = 3.14
c1 = Circle()
print(Circle.pi)
print(c1.pi)
=> 3.14
=> 3.14
인스턴스와 클래스 간의 이름 공간(namespace)
- 클래스를 정의하면, 클래스와 해당하는 이름공간 생성
- 인스턴스를 만들면, 인스턴스 객체가 생성되고 이름 공간 생성
- 인스턴스에서 특정 속성에 접근하면, 인스턴스-클래스 순으로 탐색
- 클래스에서 인스턴스 변수에 접근할 수는 없음
class Person:
name = 'None'
# Person 클래스의 인스턴스를 생성하고 name 확인
p1 = Person()
print(p1.name)
=> 'None'
# p1의 name 속성을 지정하과 확인
p1.name = 'sun'
print(p1.name)
print(Person.name)
=> 'sun'
=> 'None'
메서드의 종류
인스턴스 메서드
- 인스턴스가 사용할 메서드
- 인스턴스가 가진 변수, 속성을 조작하기 위함
- 클래스 내부에 정의되는 메서드의 기본
- 호출 시, 첫 번째 인자로 인스턴스 자기자신(self)이 전달됨
클래스 메서드
- 클래스가 사용할 메서드
- 클래스가 가진 변수, 속성을 조작하기 위함
@classmethod 데코레이터를 사용하여 정의
- 호출 시, 첫 번째 인자로 클래스(cls)가 전달됨
# 정의
class MyClass:
...
@classmethod
def class_method(cls, ar1, ...):
...
# 호출 시
MyClass.class_method(..)
스태틱 메서드
- 클래스가 사용할 메서드
- @staticmethod 데코레이터를 사용하여 정의
- 호출 시, self나 cls 인자가 전달되지 않음 (즉, 클래스 정보에 접근이나 수정 불가)
# 정의
class MyClass:
...
@staticmethod
def class_method(ar1, ...):
...
# 호출 시
MyClass.static_method(..)
메서드 정리 (주의사항)
- 클래스에 의해 생성된 인스턴스는 스태틱 메서드를 호출할 수 있음
- 마찬가지로, 인스턴스는 클래스 메서드를 호출할 수 있음
- 하지만, 일반적으로 인스턴스에서 스태틱 메서드와 클래스 메서드는 되도록 호출하지 않아야 한다.
- 클래스는 클래스 속성 접근 여부에 따라 클래스 메서드나 정적 메서드로 정의
댓글