이야기 형식으로 클래스의 기초를 쌓아보자
class Service:
secret = "학범이는 몽고반점이 있다."
위 클래스의 이름은 Service
이 Service 클래스를 유용한 정보를 제공하는 인터넷 서비스 제공업체라고 가정.
이 업체는 가입한 고객에게만 정보를 제공함. 가입을 해보자.
pgono = Service()
이제 pgono 라는 아이디로 인터넷 서비스 업체인 Service 클래스를 이용가능
pgono 라는 아이디로 업체가 제공하는 정보를 얻어보자.
pgono.secret
"학범이는 몽고반점이 있다."
아이디 이름에 서비스 업체가 제공하는 secret이라는 변수를
'.' (도트연산자)를 이용해 호출했더니 기밀정보를 얻음.
서비스 업체는 사람들을 더 유입시키기 위해 더하기를 해주는 서비스를 제공하기로 함.
아래와 같이 클래스를 업그레이드함.
class Service:
secret = "학범이는 몽고반점이 있다."
def sum(self, a, b):
result = a + b
print("%s + %s = %s 입니다." (a, b, result))
업그레이드 된 서비스를 이용하려면 회원이 아니면 일단 회원가입을 해야함
pgono = Service()
그 후 더하기 서비스를 이용
pgono.sum(1, 1)
1 + 1 = 2 입니다.
이제 반대로 서비스 업체 입장에서 생각을 해보자
업체는 오직 가입한 사람들에게만 서비스를 제공하고 싶어함.
그래서 그들은 더하기 서비스에 가입했는지를 확인하기 위한 장치를 추가함.
그것이 바로 위에 있는 self 임.
서비스 업체는 sum 함수의 첫 번째 입력값을 통해 가입 여부를 판단함.
그렇다면 입력인수가 3개니까 3개의 입력값이 필요하지 않을까? 라는 의문이듬.
pgono.sum(pgono, 1, 1)
이런식으로 쓰여야 된다고 생각하지만
pgono.sum(1, 1) 처럼 pgono 를 중복해서 사용하지 않아도 문제가 없음.
Why??
pgono.sum(1, 1)라는 호출이 발생하면 self 는 호출시 이용했던 인스턴스
즉, pgono 라는 아이디로 바뀜. 편함잼 ㅎㅎ
★ pgono.sum(1, 1)은 Service.sum(pgono, 1, 1) 과 동일한 결과
시간이 흘러 사람들이 서비스 업체에 색다른 서비스를 요구가 시작함.
바로 더하기 연산에 자신의 이름을 넣어 달라는 것. 그래서 업그레이드를 하게 됨.
class Service:
secret = "학범이는 몽고반점이 있다."
def setname(self, name):
self.name = name
def sum(self, a, b):
result = a + b
print("%s님 %s + %s = %s 입니다." %(self.name, a, b, result))
업체는 업그레이드 후 '이름 출력 서비스' 사용법에 대해 가입한 사람들에게 알려줌.
먼저 업체에 가입
pgono = Service()
그 다음 pgono 라는 아이디를 가진 사람이 자신의 이름은 박기범임을 서비스 업체에 알림
pgono.setname("박기범")
그다음 더하기 서비스 이용
pgono.sum(1, 1)
박기범님 1 + 1 = 2 입니다.
다시 한번 서비스 업체 입장으로 가보자.
함수 setname을 살펴보면 서비스 제공 업체의 setname 함수는 이렇게 생각함.
'pgono 라는 아이디를 가진 사람이 자신의 이름을 박기범으로 설정했군.
그러면 pgono라는 아이디로 접근하면 이 사람 이름이 박기범 이라는것을 기억해야겠군'
setname 함수가 실행되는 순서를 자세히 살펴보면
pgono라는 아이디를 가진 사람이 "박기범" 이라는 이름을 setname 함수에 입력함.
pgono.setname("박기범")
그러면 다음의 문장 수행
self.name = name
self는 첫 번째 입력값으로 pgono 라는 아이디를 받으니까 이렇게 바뀜.
pgono.name = name
name 은 두 번째로 입력받은 "박기범" 이라는 값이므로 다시 이렇게 바뀜.
pgono.name = "박기범"
이제 이름을 출력하기 위해 변경된 덧셈 함수를 살펴보자.
def sum(self, a, b):
result = a + b
print("%s님 %s + %s = %s 입니다." %(self.name, a, b, result))
이전 함수에서 self.name 이 추가 되었음.
setname 함수에 의해 "박기범" 이라는 이름을 설정해 주었기때문에
sum 함수에서도 self.name 이 pgono.name 으로 치환됨. 그래서 박기범 출력
시간이 또~~~~~흘러 상당한 가입자수를 보유하게된 서비스 업체
그런데 가끔 오류가 발생한다고 항의 전화가 겁나게 옴.
그 사람들의 말을 들어보면
babo = Service()
babo.sum(1,1)
이렇게 입력하면 자꾸 오류가 발생한다는 것.
서비스 업체는 babo.setname("바보자식")과 같은 이름을 넣어 주는 과정이
빠져서 오류가 발생한다고 말을 하지만 말을 안들어 먹음.
그래서 고민하다가 아이디어를 냄.
지금까지는 사람들이 서비스에 가입할 때 바로 아이디를 부여해주었음.
그런데 아이디를 부여해 줄 때 그사람의 이름을 입력받아야만 아이디를 부여해 주는 방식으로
바꾸면 babo.setname("바보자식")과 같은 과정을 생략할 수 있을거라 생각함.
그리고 그 결과 __init__ 함수를 이용해 만들어냄.
class Service:
secret = "학범이는 몽고반점이 있다."
def __init__(self, name):
self.name = name
def sum(self, a, b):
result = a + b
print("%s님 %s + %s = %s 입니다." %(self.name, a, b, result))
딱 하나 setname이 __init__ 으로 바뀜.
클래스에서 이 __init__ 이라는 함수의 의미는??
"인스턴스를 만들 때 항상 실행된다."
즉, 아이디를 부여받을 때 항상 실행된다는 말
그래서 이 서비스 업체에 가입하려면 이렇게 입력해야함.
pgono = Service("박기범")
이전에는 pgono = Service() 라고만 입력하면 되었지만
__init__ 함수 때문에 pgono = Service("박기범") 처럼 이름까지 입력해야함.
pgono = Service("박기범")
pgono.sum(1, 1)
3줄의 코드가 2줄로 바뀌며 간략해지고 항의전화도 멈추게됨 ㅋ
'파이썬 복습' 카테고리의 다른 글
4/19 클래스(4/4) (0) | 2018.04.19 |
---|---|
4/19 클래스 (3/4) (0) | 2018.04.19 |
4/13 클래스 (1/4) (0) | 2018.04.13 |
4/3 연습문제 (0) | 2018.04.03 |
4/2 파일 읽고 쓰기 (0) | 2018.04.02 |