Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
2018-2 프로그래밍 1
1
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개의 계산기가 서로 영향을 미치지 않음
: 계산기가 더 많아질 때마다 전역변수와 함수를 추가해야 하기 때문에 비 효율적
→ 해결방안은 클래스의 사용
2018-2 프로그래밍 1
2
- 클래스를 이용한 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)
2018-2 프로그래밍 1
3
- 클래스 함수
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, …)를 지칭함
2018-2 프로그래밍 1
4
__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))
2018-2 프로그래밍 1
5
클래스 자세히 알기
- 클래스는 인스턴스를 만들어 내는 공장과 같다.
- 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 클래스이다.
2018-2 프로그래밍 1
6
- 객체에 숫자 지정할 수 있게 만들기
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())
2018-2 프로그래밍 1
7
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: 부산
2018-2 프로그래밍 1
8
# 방법 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 함수를
변경하는 방법
2018-2 프로그래밍 1
9
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__ 함수호출
2018-2 프로그래밍 1
10
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):
2018-2 프로그래밍 1
11
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)
새 파일에서 이전에 만든 모듈 불러오기
2018-2 프로그래밍 1
12
다른 모듈을 포함한 모듈 파일 (modtest.py)
import mod2
result = mod2.sum(3, 4)
print(result)
05-3 패키지
패키지(packages)
(1) 디렉토리와 파이썬 모듈로 이루어짐
(2) 도트(.)를 이용하여 파이썬 모듈을 계층적(디렉토리구조)으로 관리
(3) 파이썬 프로그램의 효율적인 공동작업이 가능
가상의 game 패키지 예
테스트를 위해 패키지 만들기
(1) c:/Python 디렉토리 밑에 서브 디렉토리 생성
(2) 각 디렉토리에 __init__.py 파일 만들어 놓기 (내용은 비워 둠)
2018-2 프로그래밍 1
13
(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 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할, 만약 이 파일이
없으면 패키지로 인식되지 않음