클래스 (class) 첫번째 이야기. 클래스란 무엇인가?

포도·2021년 7월 11일
0
post-thumbnail

클래스를 두번째 공부하는데도 여전히 모르는게 많았다. 휴.. 그래도 첫번째 공부했을때 보다 내용이 머리속에 좀 더 정리된 것 같아서 글을 쓰면서 내용을 정리해 보고자 한다.

1. class 빠르게 살펴보기

간단한 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()

주의사항

  • class 의 'c'는 소문자. 클래스의 이름 첫자 'C'는 보통 대문자다. (보통 영문은 다 소문자를 쓰는데 클래스의 이름 첫자가 대문자라는게 눈여겨 볼만 하다.)
  • 클래스 이름 다음에 괄호가 ( ) 없다!!
  • def method 를 지정할때 method의 첫번째 변수는 self 가 와야 한다.

2. 속성 (attributes)

클래스 안에 속성을 지정해 줄 수 있다. 클래스를 배울때 다음과 같은 녀석을 마주하게 된다. 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가 첫번째 변수로 온다는 사실이다.

lola

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 변수에 저장됀 속성이 나오게 돼는거다. ('포도', '코리안숏헤어')

2.1 비공개 속성 (private attribute)

때로는 속성을 클래스 바깥에서는 접근할 수 없고 클래스 안에서만 사용할 수 있게 설정할 수 있다. 예를 들어 몸무게 같이 민감한 사항.

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 이렇게 호출을 해도 무게는 나오지 않는다! 하하! 아무도 포도의 무게를 알 수 없게. 하지만 다이어트 메세지는 날려주자.

주의사항

  • diet method 에서 () 안에 parameter는 self 하나뿐이다. 그리고 속성에 저장된 weight와 name을 가져다 써줬다. 그러므로 () 안에 따로 name과 weight를 써줄 필요없다. 여기서 비공개 속성인 weight를 가져다 쓸땐 앞에 __를 잊지 말자!
profile
문과로 한평생 살다가 현재 펜실베니아 주립대 (University of Pennsylvania) 에서 Computer and Information Technology 공부하고 있습니다.

0개의 댓글