5 장파이썬날개달기 05-1 파이썬프로그래밍의핵심, 클래스 클래스는도대체왜필요한가? - 계산기의더하기기능구현 result = 0 def adder(num): global result result += num return result print(adder(3)) print(adder(4)) : adder 함수는입력인수로 num을받으면이전에계산된결과값에더한후출력 - 2개의계산기구현 result1 = 0 result2 = 0 def adder1(num): global result1 result1 += num return result1 def adder2(num): global result2 result2 += num return result2 print(adder1(3)) print(adder1(4)) print(adder2(3)) print(adder2(7)) : 2개의계산기가서로영향을미치지않음 : 계산기가더많아질때마다전역변수와함수를추가해야하기때문에비효율적 해결방안은클래스의사용 1
- 클래스를이용한 2개의계산기구현 class Calculator: def init (self): self.result = 0 def adder(self, num): self.result += num return self.result cal1 = Calculator() # cal1, cal2 - 인스턴스라고함 cal2 = Calculator() # 인스턴스-클래스에의해생성된객체 print(cal1.adder(3)) print(cal1.adder(4)) print(cal2.adder(3)) print(cal2.adder(7)) : 클래스를이용하면계산기의개수가늘어나도인스턴스만추가로생성하면되기때문에프로그램이간단해진다. 클래스개념잡기 - 클래스 : 똑같은무엇인가를계속해서만들어낼수있는설계도면같은것 ( 뽑기틀, 붕어빵틀 ) - 인스턴스 : 클래스에의해서만들어진피조물 ( 별또는하트가찍힌뽑기, 붕어빵 ) 이야기형식으로클래스기초쌓기 - 클래스변수 # 클래스생성 class Service: secret = " 영구는배꼽이두개다." # 인스턴스생성 pey = Service() print(pey.secret) 2
- 클래스함수 class Service: secret = " 영구는배꼽이두개다." def sum(self, a, b): result = a + b print("%s + %s = %s 입니다." % (a, b, result)) pey = Service() print(pey.secret) print(pey.sum(1,1)) : 클래스내함수의첫번째인수는무조건 self로사용해야인스턴스의함수로사용할수있다. self 제대로알기 - 사용자에게이름을입력받아서 sum함수를제공할때앞부분에그이름을넣어준다. 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)) pey = Service() pey.setname(" 홍길동 ") print(pey.sum(1,1)) : self 는 Service 에의해생성된인스턴스 (pey, ) 를지칭함 3
init 이란무엇인가? 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)) babo = Service() print(babo.sum(1,1)) : 다음과같은오류발생 AttributeError: 'Service' object has no attribute 'name' name을입력하는과정이빠져서오류발생, 매번아래와같은문장을추가하는것은번거롭다. 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)) pey = Service(" 홍길동 ") print(pey.sum(1,1)) 4
클래스자세히알기 - 클래스는인스턴스를만들어내는공장과같다. - class 키워드를이용하여클래스생성 : 클래스이름뒤에상속할클래스가있다면괄호 ( ) 안에상속할클래스이름을입력 사칙연산클래스만들기 - 클래스를어떻게만들지먼저구상하기 (0) 클래스이름 : FourCal (1) 두숫자입력 : setdata 메서드 (2) 더하기 : sum 메서드 (3) 빼기 : sub 메서드 (4) 곱하기 : mul 메서드 (5) 나누기 : div 메서드 : 메서드 클래스함수 - 클래스구조만들기 class FourCal: pass a = FourCal() print(type(a)) <class ' main.fourcal'> : 객체 a의타입은 FourCal 클래스이다. 5
- 객체에숫자지정할수있게만들기 class FourCal: def setdata(self, first, second): self.first = first self.second = second a = FourCal() a.setdata(4,2) print(a.first) print(a.second) - 더하기, 곱하기, 빼기, 나누기기능만들기 class FourCal: def setdata(self, first, second): self.first = first self.second = second def sum(self): result = self.first + self.second return result def mul(self): result = self.first * self.second return result def sub(self): result = self.first - self.second return result def div(self): result = self.first / self.second return result a = FourCal() b = FourCal() a.setdata(4, 2) b.setdata(3, 7) print(a.sum()) print(a.mul()) 6
print(a.sub()) print(a.div()) # 2.0 print(b.sum()) print(b.mul()) print(b.sub()) print(b.div()) # 0.42857142857142855 박씨네집 클래스만들기 - 클래스구상하기 (0) 클래스이름 : HousePark (1) 박씨가족의이름을설정 : setname 메서드 (2) 박씨가족중한사람이여행가고싶은곳을출력 : travel 메서드 >>> pey = HousePark() >>> print(pey.lastname) 박 >>> pey.setname(" 응용 ") >>> print(pey.fullname) 박응용 >>> pey.travel(" 부산 ) 박응용, 부산여행을가다. # 방법 1 class HousePark: lastname = " 박 " def setname(self, name): self.fullname = self.lastname + name def travel(self, where): print("%s, %s여행을가다." % (self.fullname, where)) pey = HousePark() print(pey.lastname) pey.setname(" 응용 ") print(pey.fullname) pey.travel(" 부산 ") # self: pey / where: 부산 7
# 방법 2 - init 메서드로초기값설정 class HousePark: lastname = " 박 " def init (self, name): self.fullname = self.lastname + name def travel(self, where): print("%s, %s여행을가다." % (self.fullname, where)) pey = HousePark(" 응용 ") # 만약 pey = HousePark() 로하면오류! print(pey.lastname) print(pey.fullname) pey.travel(" 부산 ") 클래스의상속 - 상속 (inheritance): 물려받다 - 어떤클래스를만들때다른클래스의기능을물려받게하는것 - HouseKim 이라는클래스가 HousePark 클래스를상속받는예제 class HouseKim(HousePark): lastname = " 김 " juliet = HouseKim(" 줄리엣 ") print(juliet.lastname) print(juliet.fullname) juliet.travel(" 독도 ") - 메서드오버라이딩 (1) 상속받을대상인클래스의메서드의이름은같지만그행동을다르게해야할때 (2) HouseKim 클래스가 HousePark 클래스를상속받을때상속받는 travel 함수를변경하는방법 8
class HouseKim(HousePark): lastname = " 김 " def travel(self, where, day): print("%s, %s여행 %d일가네." % (self.fullname, where, day)) juliet = HouseKim(" 줄리엣 ") juliet.travel(" 독도 ",3) - 연산자오버로딩 (1) 연산자오버로딩 (overloading) 이란연산자 (+, -, *, /) 를객체 ( 인스턴스 ) 끼리사용할수있게하는기법 (2) add (+) 예제 class HousePark: lastname = " 박 " def init (self, name): self.fullname = self.lastname + name def travel(self, where): print("%s, %s여행을가다." % (self.fullname, where)) def love(self, other): print("%s, %s 사랑에빠졌네 " % (self.fullname, other.fullname)) def add (self, other): print("%s, %s 결혼했네 " % (self.fullname, other.fullname)) class HouseKim(HousePark): lastname = " 김 " def travel(self, where, day): print("%s, %s여행 %d일가네." % (self.fullname, where, day)) pey = HousePark(" 응용 ") julliet = HouseKim(" 줄리엣 ") pey.love(julliet) pey + julliet # add 함수호출 9
05-2 모듈 모듈 - 모듈이란함수나변수, 또는클래스들을모아놓은파일 - 다른파이썬프로그램에서불러와사용할수있게만들어진파이썬파일 Python 작업디렉토리지정하기파이썬라이브러리들이설치되어있는디렉토리확인 >>> import sys >>> sys.path sys.path 에 f:/python/mymodules 디렉토리추가 ( 이때아래의경로와디렉토리가존재해야함 ) >>> sys.path.append("f:/python/mymodules") 이코드는아나콘다를새롭게시작할때마다해주어야함 작업을위한디렉토리가새롭게추가된것확인 >>> sys.path Spyder 에디터 def sum(a,b): return a+b f:/python/mymodules 에 mod1.py 로저장후실행 확인 import mod1 print(mod1.sum(3,4)) import의사용방법 import 모듈이름 mod1.py 에함수추가 def sum(a,b): 10
return a+b def safe_sum(a, b): if type(a)!= type(b): print(" 더할수있는것이아닙니다.") return else: result = sum(a, b) return result 확인 import mod1 print(mod1.safe_sum(3,4)) print(mod1.safe_sum(1,"a")) 클래스나변수등을포함한모듈 클래스를포함한모듈파일 (mod2.py) PI = 3.141592 class Math: def solv(self, r): # 반지름이 2인원의넓이계산 return PI * (r ** 2) def sum(a, b): return a+b f:/python/mymodules 에 mod2.py 로저장후실행 확인 import mod2 mod2.pi a=mod2.math() a.solv(2) mod2.sum(3,6) 새파일에서이전에만든모듈불러오기 11
다른모듈을포함한모듈파일 (modtest.py) import mod2 result = mod2.sum(3, 4) print(result) 05-3 패키지 패키지 (packages) (1) 디렉토리와파이썬모듈로이루어짐 (2) 도트 (.) 를이용하여파이썬모듈을계층적 ( 디렉토리구조 ) 으로관리 (3) 파이썬프로그램의효율적인공동작업이가능 가상의 game 패키지예 테스트를위해패키지만들기 (1) c:/python 디렉토리밑에서브디렉토리생성 (2) 각디렉토리에 init.py 파일만들어놓기 ( 내용은비워둠 ) 12
(3) echo.py 파일생성 # echo.py def echo_test(): print ("echo") (4) render.py 파일생성 # render.py def render_test(): print ("render") (5) path 설정 import sys sys.path # c:/python 경로가없음 sys.path.append("c:/python") sys.path # c:/python 경로생성확인 패키지안의함수실행하기 (1) echo 모듈을 import 하여실행 >>> import game.sound.echo >>> game.sound.echo.echo_test() echo (2) echo 모듈이있는디렉토리까지를 from import 실행 >>> from game.sound import echo >>> echo.echo_test() echo (3) echo 모듈의 echo_test 함수를직접 import 하여실행 >>> from game.sound.echo import echo_test >>> echo_test() echo init.py 의용도 init.py 파일은해당디렉토리가패키지의일부임을알려주는역할, 만약이파일이없으면패키지로인식되지않음 13