프로그래밍 언어/파이썬

파이썬 25. 클래스-2

닉네임못짓는사람 2020. 11. 16. 15:49
반응형

저번 글에 이어서 클래스에 대해서 알아보도록 하겠습니다.

 

self


먼저, 저번 글에서 등장했지만 뒤로 미루어 둔 self라는 놈에 대해서 알아보겠습니다.

class TV():
    power = False

    def powerChange(self):
        self.power = not self.power

t1 = TV()
t2 = TV()
print("t1의 전원 : {}, t2의 전원 : {}".format(t1.power, t2.power))
t1.powerChange()
print("t1의 전원 : {}, t2의 전원 : {}".format(t1.power, t2.power))

저번 글에서 위와 같은 클래스를 정의했었는데, powerChange라는 함수를 정의했을 때 매개변수로

self가 자동으로 들어가는 것을 아마 다들 확인하셨을 겁니다.

그런데, 우리가 실제로 이 함수를 사용할 때는 self에 아무런 값도 넘겨주지 않았는데 함수가 제대로 작동했습니다.

대체 이 self는 무엇일까요?

 

일단 이름으로부터 알 수 있듯이 self는 자기 자신을 의미합니다.

그럼 이 함수의 매개변수 self가 의미하는 자기 자신은 무엇일까요?

그건 바로 객체 자신을 의미합니다.

 

예를 들어 t1객체에서 powerChange() 함수를 호출한다고 생각해봅시다.

이때 우리는 함수에 어떤 값도 넘겨주지 않지만, 프로그램에서는 t1이라는 객체 정보를 powerChange함수에 인수로 넘겨주게 됩니다.

그러면 함수에서 이 객체 정보를 토대로 함수를 동작시키고, 객체의 클래스 변수들을 조작하는 것입니다.

 

powerChange함수의 내용을 보면 self.power의 값을 반대로 바꾸는 동작을 하는데,

이 동작을 t1객체에서 실행시키면 t1.power의 값을 변경하라는 의미가 되는 것입니다.

만약 클래스 변수가 아닌 함수 내의 지역변수를 조작하고 싶을 때에는 self를 굳이 쓰지 않으셔도 됩니다.

왜냐하면 그 변수는 함수가 수행될 때만 메모리 공간에 존재하고 함수가 끝나면 어차피 사라지기 때문이죠.

TV()의 의미


self에 대해서 알아봤으니 이제 다음 단계로 넘어가 봅시다.

이전 글에서 우리는 TV 클래스의 인스턴스(객체)를 생성하려면 TV()와 같이 사용하면 된다는 걸 알았습니다.

그럼 이 TV()는 대체 무슨 의미를 가지고 있을까요?

 

눈치 빠르신 분들은 이 모양이 함수를 호출하는 방법과 동일하다는 것을 눈치채셨을 겁니다.

그대로 이 TV()는 객체를 생성할 때 클래스 내에 존재하는 '생성자'라는 함수를 자동적으로 실행합니다.

"어? 근데 나는 그런 걸 클래스에 정의한 적이 없는데?"라고 생각하시는 분들이 많으실 겁니다.

이 '생성자'는 사용자가 따로 정의하지 않으면 클래스 내에 자동적으로 빈 생성자가 만들어집니다.

 

그럼 이제 우리가 직접 생성자를 만들어서 사용해보도록 합시다.

def __init__(self):

생성자의 이름은 무조건 __init__이 되어야 하고, 우리가 따로 정의하지 않으면 위와 같이 비어있는 생성자가 실행됩니다.

class TV():
    def __init__(self):
        print("생성자 실행")
    power = False

    def powerChange(self):
        self.power = not self.power

t1 = TV()
t2 = TV()

이렇게 클래스를 생성할 때 자동적으로 생성자가 실행되어 "생성자 실행"이 출력된 것을 볼 수 있습니다.

이 생성자는 주로 클래스 생성 시에 클래스 변수들을 초기화하거나, 처음 필수적으로 수행할 작업들을 정의해놓습니다.

또한 생성자도 함수이기 때문에 당연히 매개변수를 사용하여 생성 시에 인수로 데이터를 넘겨받을 수 있습니다.

class TV():
    def __init__(self, volume):
        self.power = False
        self.volume = volume

    def powerChange(self):
        self.power = not self.power

t1 = TV(20)
print(t1.volume)

위의 코드를 이렇게 바꾸면, 객체 생성시에 power변수를 생성해서 False로 값을 초기화할 수 있습니다.

또한 생성자에도 맨 첫 매개변수로 self가 들어가며, 위에서 알아본 것과 의미는 동일합니다.

 

이제 클래스에 대해서 알아봤으니 TV 클래스를 수정해보고 글을 마치도록 하겠습니다.

class TV():
    def __init__(self):
        self.power = False
        self.channel = 0
        self.volume = 0
    def powerChange(self):
        self.power = not self.power
    def channelUp(self):
        if self.channel == 20:
            self.channel = 0
        else:
            self.channel += 1
    def channelDown(self):
        if self.channel == 0:
            self.channel = 20
        else:
            self.channel -= 1
    def volumeUp(self):
        if self.volume < 100:
            self.volume += 1
    def volumeDown(self):
        if self.volume > 0:
            self.volume -= 1

이렇게 TV 클래스에 볼륨, 채널을 추가해서 이와 관련된 메서드들을 추가시켜봤습니다.

간단한 클래스 작성이지만 한 번 작성해보시거나, 자신이 직접 다른 클래스를 작성해보시면 좋을 것 같습니다.

 

이번 글은 이 정도로 마치도록 하겠습니다.

감사합니다.

반응형

'프로그래밍 언어 > 파이썬' 카테고리의 다른 글

파이썬 27. 메서드 오버라이딩  (0) 2020.11.19
파이썬 26. 상속  (0) 2020.11.17
파이썬 24. 클래스-1  (0) 2020.11.11
파이썬 23. 파일 입출력  (0) 2020.11.10
파이썬 22. 함수-2  (0) 2020.11.04