클래스를 두번째 공부하는데도 여전히 모르는게 많았다. 휴.. 그래도 첫번째 공부했을때 보다 내용이 머리속에 좀 더 정리된 것 같아서 글을 쓰면서 내용을 정리해 보고자 한다.
간단한 class의 예를 살펴보자.
class Cat: # 클래스 이름
def greeting (self):
print('야옹')
podo = Cat()
podo.greeting()
결과 '야옹'
Step 1. class Cat: Cat 이라는 클래스를 만들어준다.
Step 2. def greeting(self): greeting 이라는 method를 만들어준다.
Step 3. podo = Cat(): podo는 Cat의 instance다.
Step 4. podo.greeting(): instance.method로 method 안에 있는 함수를 불러온다.
class 를 배울정도면 method는 익숙하다. 내가 헷갈렸던건 인스턴스 (instance). 이것이 무엇인고?
파이썬 독스에 따르면 클래스는 새로운 타입의 객체 (object)를 만들고 관련된 새로운 instance를 만든다. 어렵다. 난 이렇게 생각했다. class 로 새로운 집단을 만든다. 위에선 고양이 집단을 만들었다. 그리고 거기에 이것저것 넣고 싶은 내용들을(속성, 함수 등) 넣는다. class 집단에 속할 새로운 변수를 만들자. 위에선 podo를 만들어서 Cat class에 종속시켰다. 이것을 instance 를 만든다라고 얘기한다. 즉, class를 통해서 새로운 객체를 만드는 것을 instance 만든다라고 얘기 할 수 있겠다.
그럼 클래스를 왜 쓸까? 예를 들어 Cat 클래스 안에 50가지의 속성과 method 들이 있고, 나는 5개의 다른 변수들이 (고양이 이름들) 클래스 안에 들어있는 내용을 공통적으로 썼으면 좋겠다고 생각할때 다른 instance 를 5개 생성한다. podo (포도)는 첫번째 고양이. 두번째 instace로 다홍이를 만들자. dahong = Cat()
주의사항
클래스 안에 속성을 지정해 줄 수 있다. 클래스를 배울때 다음과 같은 녀석을 마주하게 된다. def __init__(self):
class Cat:
def __init__(self, name, type):
self.name = name
self.type = type
podo = Cat('포도','코리안숏헤어')
podo.name, podo.type
결과 ('포도', '코리안숏헤어')
Step 1.
__init__(self, name, type)
: init 은 initialize (초기화하다)의 줄임말이다. podo라는 instance를 만들때 Cat 클래스의 속성을 초기화하고 '포도', '코리안숏헤어'라는 속성을 podo 라는 변수에 저장해 준다. 예를 들어 `lola = Cat('롤라', '스코티시폴드') 이렇게 두번째 instance 를 저장할 수도 있다. 여기서 중요한건 항상 self가 첫번째 변수로 온다는 사실이다.
Step 2. self.name, self.type = name: 왜 self가 첫번째 변수로 올까? 나는 이게 정말 헷갈렸다. 그리고 왜 밑에 줄줄이 self.을 해주는 걸까? self는 자기자신이라는 뜻. podo라는 인스턴스를 만들었을때 파이썬은 Cat 클래스를 초기화 시켜서 self.name 은 podo.name 이고 그 값은 '포도', self.type은 podo.type 이며 그 반환값은 '코리안숏헤어'라고 저장한다.
Step 3. podo.name, podo.type: 그래서 이렇게 호출했을때 podo 변수에 저장됀 속성이 나오게 돼는거다. ('포도', '코리안숏헤어')
때로는 속성을 클래스 바깥에서는 접근할 수 없고 클래스 안에서만 사용할 수 있게 설정할 수 있다. 예를 들어 몸무게 같이 민감한 사항.
class Cat:
def __init__(self, name, type, weight):
self.name = name
self.type = type
self.__weight = weight # 비공개속성
def diet(self):
if self.__weight > 7:
print(self.name, "님은 다이어트가 시급합니다.")
podo = Cat('포도','코리안숏헤어', 7.2)
podo.diet()
결과: 포도 님은 다이어트가 시급합니다.
self.__weight 으로 몸무게 (weight) 를 비공개로 추가해줬다. 누가 podo.__weight 이렇게 호출을 해도 무게는 나오지 않는다! 하하! 아무도 포도의 무게를 알 수 없게. 하지만 다이어트 메세지는 날려주자.
주의사항