[ Python 3 ] 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드)
간단하게 클래스와 객체가 무엇인지는 다들 잘 아실 겁니다.
그러나 클래스 안의 데이터와 메소드들이 어떻게 메모리에 존재하는지는 잘모르실 겁니다.
또한 참조가 되는 것인지 아니면 독립적인 공간에 따로 있어서 서로 연동이 안되는 것인지 확실하게 알고 계신가요??
이 글에서는 관련된 내용을 중심으로 정리했습니다.
[ 클래스와 객체란 무엇일까요? ]
간단히 이해해 봅시다.
클래스는 붕어빵을 만드는 틀입니다.
객체는 붕어빵 한 개입니다.
좀 더 구체적으로 클래스는 데이터와 이를 처리하는 메서드(함수)로 구성됩니다.
[ 왜 클래스를 사용할까요? ]
간단합니다.
붕어빵을 매번 직접 손으로 만들려면 시간이 오래걸리죠.
반대로 붕어빵 틀을 잘 만들어 두면 쉽게 붕어빵을 만들 수 있습니다.
똑같은 원리 입니다.
클래스를 잘 정의해 두면, 객체를 여러개 만들기 쉽겠죠.
[ 구현 해보기 ]
class 라는 키워드로 새로운 타입을 생성할 수 있습니다.
앞에서 말했듯 클래스는 데이터와 메서드로 이뤄집니다.
그런데 클래스 내에서 특별한 이름(__로 시작해서 __로 끝나는)을 가진 메직 메소드들이 존재합니다.
__init__ 이라는 매직 메소드를 사용하게 되면, 객체가 생성될때 자동으로 호출됩니다.
이렇게 생성된 각 객체들은 모두 다른 메모리에 독립적으로 생성됩니다.
class Person:
def __init__(self):
print("객체 생성")
p1 = Person()
p2 = Person()
print(id(Person), id(p1), id(p2))
클래스 내에 정의된 메서드는 클래스 공간에 저장 됩니다.
즉, 객체에서 어떠한 메서드를 사용하고자 한다면 사전에 정의된 클래스 공간에서 참조하여 사용한다는 뜻입니다.
[ 예시 ]
객체 메소드는 동일한 함수를 참조함
Point 1) 클래스 속성(클래스 내부 속성 ex. count)은 클래스가 정의된 메모리에서 각 인스턴스가 참조합니다.
인스턴스의 count 는 모두 클래스 count를 참조하고 있음을 알 수 있습니다.
즉, Person.count 의 숫자를 바꾸면 모든 인스턴스의 count 또한 바뀌게 됩니다.
>>> print(Person.count, p1.count, p2.count)
2 2 2
>>> Person.count = 200
>>> print(Person.count, p1.count, p2.count)
200 200 200
만약 인스턴스의 count 의 값을 바꾸게 되면 어떻게 될까요?
>>> p2.count = 123
>>> print(Person.count, p1.count, p2.count)
200 200 123
새로 설정한 p2 만 인스턴스 속성의 값을 반환하게 됩니다. 나머지는 그대로 클래스 속성을 반환합니다.
>>> print(id(Person.count), id(p1.count), id(p2.count))
4301789648 4301789648 4301787184
id를 통해 메모리 주소를 확인해 보면, p2 인스턴스 속성이 새로 만들어 졌음을 알 수 있습니다.
그렇다고 p2 에서 클래스 속성이 없어진 건 아닙니다.
>>> p2.get_count()
200
get_count() 메소드를 사용하면 여전히 클래스 속성을 반환할 수 있습니다.
Point 2) __init__ 메서드는 객체 생성시 호출이 될때 생성됩니다.
Point 3) __init__ 메서드를 통해 객체 생성시 만들어진 변수들은 모두 독립된 메모리에 저장됩니다.
self 라는 항목이 붙은 것은 각 객체 안에서만 통용되는 인스턴스 속성라고 생각하시면 됩니다.
즉, 한 객체에서 self.age를 바꾸어도 다른 객체에서는 영향을 받지 않습니다.
[ 다음 글 ]
클래스 상속(inheritance)을 제대로 알아보자!
클래스의 super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치)
super(클래스, self).__init__() 에 대해 제대로 알아보자!!
[참고]
'컴퓨터 언어 > Python' 카테고리의 다른 글
[ Python 3 ] 클래스의 super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치) (3) | 2022.08.15 |
---|---|
[ Python 3 ] 클래스 상속(inheritance)을 제대로 알아보자! (0) | 2022.08.15 |
[ Python 3 ] 파이썬에선 정수 메모리를 어떻게 사용하는가? (0) | 2022.08.14 |
[ Python 3 ] 딕셔너리(dictonary) 메소드 methods(update, items, keys, values, fromkeys, clear, pop) (0) | 2022.08.14 |
[ Python 3 ] 딕셔너리(dictionary) 복사시 주의!! ( copy, deepcopy ) (0) | 2022.08.13 |