이번 절에서는 클래스의 메소드를 어떻게 구현하는지에 대하여 자세히 살펴봅시다.
메소드는 클래스 안에 정의된 함수이므로 함수를 정의하는 것과 아주 유사합니다. 하지만 첫 번째 매개변수는 항상 self이어야 합니다.

하나의 예로 텔레비전을 나타내는 Television 클래스를 정의하여 봅시다. 클래스 이름의 첫 글자는 일반적으로 대문자로 합니다.
Television 클래스는 텔레비전에 관련된 속성과 동작을 묶은 것입니다. 텔레비전의 수많은 속성 중에서 채널번호, 볼륨, 전원상태 만을 기술하기로 합시다.
이렇게 불필요한 속성을 제거하는 과정을 추상화(abstraction)라고 하였습니다.
class Television:
def __init__(self, channel, volume, on):
self.channel = channel
self.volume = volume
self.on = on
def show(self):
print(self.channel, self.volume, self.on)
def setChannel(self, channel):
self.channel = channel
def getChannel(self):
return self.channel
생성자는 객체를 초기화하는 메소드로서 클래스로 객체를 생성할 때 디폴트로 호출됩니다. __init__과 같이 init 앞뒤로 반드시 __을 추가하여야 합니다.
또 항상 자신을 가리키는 self가 매개 변수에 포함됩니다. 인스턴스 변수는 생서자 안에서 외부값을 받아서 초기화됩니다.
텔레비전을 나타내는 클래스 Television은 3개의 인스턴스 변수와 3개의 메소드로 이루어집니다. channel은 현재 설정된 채널 번호를 저장합니다.
volume은 현재 설정된 음량을 나타내고 on은 텔레비전이 켜 있는지 꺼져 있는지를 나타내는 부울형 변수입니다.
show()는 현재 텔레비전 객체의 상태를 화면에 출력합니다. setChannel()은 텔레비전의 채널을 설정합니다. getChannel()은 현재의 채널 번호를 반환합니다.
앞에서도 이야기하였지만 클래스 정의는 단순히 객체를 찍어내기 위한 틀을 생성한 것입니다. 아직 실제 객체는 생성되지 않았습니다.
클래스는 객체를 만들기 위한 설계도에 해당됩니다. 설계도를 가지고 어떤 작업을 할 수는 없습니다.
예를 들어서 자동차 설계도를 운전하고 집에 갈 수는 없는 일입니다. 실제로 어떤 작업을 하려면 객체를 생성하여야 합니다.
파이썬에서는 클래스가 정의되면 생성자를 호출하여서 객체를 생성할 수 있습니다. 생성자는 객체를 메모리에 생성하고 객체를 초기화합니다.
t = Television(9, 10, True) # 객체를 생성합니다.
t.show()
t.setChannel(11) # 객체의 멤버에 접근할 때는 멤버 연산자(.)을 사용합니다.
t.show()
위의 파일을 실행하여 보면 다음과 같은 출력이 표시됩니다.
9 10 True
11 10 True
파이썬에서 메소드의 첫 번째 매개변수는 항상 self입니다. 왜 항상 첫 번째 매개 변수로 self를 넣어줄까요? self는 객체 자신을 참조하는 변수입니다. self가 있어야만 객체의 인스턴스 변수에 접근할 수 있습니다.
예를 들어서 객체의 인스턴스 변수에 접근할 때는 self.var와 같은 형식을 사용하고 객체의 메소드에 접근할 때는 self.sub()와 같은 형식을 사용합니다.
생성자 안에서 인스턴스 변수가 생성되면, 이 변수의 범위는 클래스 전체가 됩니다.
예를 들어 __init__() 메소드에서 생성된 변수 self.channel의 범위는 Television 클래스 전체입니다.
이것은 지역 변수와는 잘 구분하여야 합니다. 지역 변수는 메소드 안에서 생성된 변수인데, 지역 변수의 범위는 메소드입니다.
즉 지역 변수는 메소드를 벗어나면 사라지게 됩니다. 반면에 인스턴스 변수는 클래스 전체에서 사용할 수 있습니다.