객체지향에서 클래스란 가장 핵심적인 요소다. 하지만 여러 강의사이트에서 듣는다 한들 클래스란 쉽사리 이해되지 않는 존재다. 우습게도 C 계열 언어에서의 class 언어가 더 쉬워보이는 경우까지 생긴다. 실제로 본인은 C# 에서의 클래스는 쉽게 이해했지만 Python 에서의 클래스는 잘 이해하지 못했다.
클래스의 정의란 우리가 목표로 하는 과정 속에서 무엇인가가 필요할 것이다. 그 필요한 것들을 담아주는 보따리와 같은 존재다. 도라에몽 도와줘! 하면 도라에몽이 배의 주머니에서 무언가를 주섬주섬 꺼내는 것을 생각하면 이해가 빠를 것이다. 우리는 이 클래스 안에 오만가지 변수(str, int)와 데이터 형식(list, tuple, dict, set)과 함수(def) 등을 넣어놓고 원하는 때에 꺼내서 쓸 수 있다.
아래를 보자.
1
2
3
4
abList = []
for i in range(97, 123):
abList.append(chr(i))
print(a.abList)
코드가 조금 어수선하지만 신경쓰지 말자. 어차피 조금 이따가 지능형 리스트로 지울 것이다. 이 코드는 함수도 사용하지 않고 클래스도 사용하지 않은 일반적인 코드다. chr를 본다면 이해가 쉬울 테지만, 이 코드는 a부터 z까지 순서대로 나열해주는 코드다. 즉, ASCII 코드의 97에서 122까지를 불러와주는 것이다. 이것을 클래스에 넣는다면 어떻게 될까? 이왕 넣는 김에 지능형 리스트를 이용하여 저 코드의 길이도 줄여보자.
1
2
3
4
class Alphabet:
abList = [chr(i) for i in range(97, 123)]
a = Alphabet()
print(a.abList)
우리는 a를 Alphabet이란 클래스에 연동시켜두었다. 그럼 이제 a는 Alphabet에 들은 것들을 내가 원하는 때에 마음대로 꺼내서 쓸 수 있는 것이다. 이 클래스는 이제 제 겁… 그래서 우리는 Alphabet 안에 들은 abList를 꺼내 프린트를 했다.
이것을 그림으로 표현하면 위와 같다는 말이 되시겠다.
클래스 안에 들은 변수 또는 데이터형식 등은 Class Attribute라고 한다. 그럼 클래스 내의 함수 내에 들은 건 뭐라고 할까?
이제 클래스 내에 함수를 추가할 것이다. 함수는 다들 알다시피 def로 추가한다.
1
def opq(self):
놀랍게도, 괄호를 여는 순간 자동으로 self가 추가된다. 클래스 내에 들은 함수는 전부 self를 상속받는다. 우리는 여기서 멈추지 않고 song이라는 매개변수(parameter)를 하나 더 받아올 것이다. 물론 self가 추가된 이상 그냥 쓸 수는 없다.
1
2
def opq(self, song):
self.opq = song
여기서 추가된 song, 그러니까 함수 내에 들은 형식은 바로 Instance Attribute라고 한다.
이제 우리는 parameter를 받아왔다. 인풋이 있으니 아웃풋도 있어야겠지? argument도 만들어야 한다. 그 전에, song을 실행시키면 무엇이 실행될 것인지 또한 중요하다.
1
2
3
4
if song == ord("o"):
print("opqrstu~")
else:
pass
song이 o에 해당하는 ord일 경우 출력하고 아닐 경우 패스한다. o에 해당하는 ord는 111이다. 우리는 111을 입력하면 출력으로 노래를 이어 할 것이다.
1
2
a = Alphabet()
a.opq(int(input("111을 입력해주세요.")))
자. a.opq()부분을 주목해야 한다. 저기서 저 괄호 안이 song이 들어갈 자리. 다시 말해 argument다. a에 알파벳 클래스를 대응시켜놓았으니 아웃풋만 만들면 된다. 우리는 아웃풋 a.opq(song)을 만들었고, song에는 우리가 입력시켜두는 인풋을 대응시켜놓은 것이다.
1
2
3
4
5
6
7
8
9
10
class Alphabet:
#abList = [chr(i) for i in range(97, 123)]
def opq(self, song):
self.song = song
if song == ord("o"):
print("opqrstu~")
else:
pass
a = Alphabet()
a.opq(int(input("111을 입력해주세요.")))
이제 나머지는 실행만 시켜보면 된다. 우리는 클래스(1행)을 건너뛰어 11행과 12행으로 넘어온 것을 알 수 있다. 중간에 인풋을 넣으라고 한다. 111을 넣어보자.
우리가 아웃풋에서 넘긴 song, 그러니까 111이 4열의 의 함수 opq의 song 자리에 인풋되었다.
그리고 제대로 출력되는 것을 확인할 수 있다.