클래스 : 객체를 만들기 위한 일종의 설계도
객체 : 클래스를 기반으로 만들어진 실제 사물
파이썬의 클래스와 객체에는 조금 독특한 부분이 있습니다. 아래의 예를 참고하시죠
class Simple:
def set_i(self, i):
self.i = i
def get_i(self):
return self.i
클래스 내에 들어갈 변수와 메소드를 결정하는 것
객체 내에서 해당 변수를 대상으로 대입 연산을 처음 진행하는 순간
s1 = Simple()
s1.set_i(200) # 이 메소드의 실행 과정에서 객체 내에 변수 i가 만들어집니다.
s1.get_i()
# 200 출력
__init__
메소드를 다음과 같이 정의하고 또 그 안에서 객체 내에 필요한 모든 변수를 초기화 해주기만 한다면 위에서 보인 오류 상황은 걱정하지 않아도 됩니다.class Simple:
def __init__(self):
self.i = 0
def set_i(self, i):
self.i = i
def get_i(self):
return self.i
s = Simple()
s.get_i() # 0
s.set_i(25)
s.get_i() # 25
class SoSimple:
def geti(self):
return self.i
ss = SoSimple()
ss.i = 27 # 이 순간 변수 ss에 담긴 객체에 i라는 변수가 생깁니다.
ss.geti() # ss에 담긴 객체에 i가 생겼으므로 geti 메소드 호출 가능
# 27
ss.hello = lambda : print('hi~')
ss.hello()
# hi~
del ss.i # ss에 담긴 객체에서 변수 i 삭제
del ss.hello # ss에 담긴 객체에서 메소드 hello 삭제
이와 같이 파이썬 클래스에 메소드와 클래스를 붙였다가 뗄 수 있습니다.
여기서 한 가지 의문이 드는 것은, 클래스는 객체와 달리 설계도일 뿐인데 어떻게 변수를 추가할 수 있을까?
변수 추가가 가능한 이유는 다음에 있습니다.
파이썬의 클래스는 클래스이자 객체이다.
프로그래머가 직접 정의하는 클래스들은 'type이라는 클래스'의 객체입니다.
그래서 객체에 변수를 추가하듯이 클래스에도 변수를 추가할 수 있습니다.
class Simple:
def __init__(self, i):
self.i = i
def set_i(self, i):
self.i = i
def get_i(self):
return self.i
Simple.n = 7 # Simple 클래스에 변수 n을 추가하고 7로 초기화
s1 = Simple(3)
s2 = Simple(5)
print(s1.n, s1.geti(), sep = ', ')
print(s2.n, s2.geti(), sep = ', ')
이 두 객체에는 n이 없습니다. 이 때 파이썬은 해당 객체의 클래스를 찾아가서 n을 찾습니다.
즉, 두 경우 모두 Simple 클래스에서 n을 찾습니다. 그래서 s1과 s2를 통해 n을 출력한 결과가 같습니다.
정리하자면,
type
# <class 'type'>
type([1, 2])
# <class 'list'>
type(list)
# <class 'type'>
정리하자면,
1. 클래스도 객체입니다.
2. 클래스는 type이라는 클래스의 객체입니다.
class Simple:
pass
simple2 = Simple
s1 = Simple()
s2 = simple2() # 변수 simple2로도 객체 생성할 수 있음