본문 바로가기
컴퓨터 언어/Python

[ Python 3 ] 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드)

by SuperMemi 2022. 8. 14.
반응형

[ 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)을 제대로 알아보자!

 

[ Python 3 ] 클래스 상속(inheritance)을 제대로 알아보자!

[ Python 3 ] 클래스 상속(inheritance)을 제대로 알아보자! [ 이전 글 ] 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드) [ Python 3 ] 파이썬의 클래스(Class)를 제대로 알아보자..

supermemi.tistory.com

클래스의 super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치)

 

[ Python 3 ] 클래스의 super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치)

[ Python 3 ] 클래스의 Super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치) [ 이전 글 ] 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드) [ Python 3..

supermemi.tistory.com

super(클래스, self).__init__() 에 대해 제대로 알아보자!!

 

[ Python 3 ] super(클래스, self).__init__() 에 대해 제대로 알아보자!!

[ Python 3 ] super(클래스, self).__init__() 에 대해 제대로 알아보자!! [ 이전 글 ] 파이썬의 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드) [ Python 3 ] 파이썬의 클래스(Class..

supermemi.tistory.com


[참고]

https://wikidocs.net/70861


 

반응형