13
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 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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개의 계산기가 서로 영향을 미치지 않음

: 계산기가 더 많아질 때마다 전역변수와 함수를 추가해야 하기 때문에 비 효율적

→ 해결방안은 클래스의 사용

Page 2: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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)

Page 3: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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, …)를 지칭함

Page 4: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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))

Page 5: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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 클래스이다.

Page 6: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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())

Page 7: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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: 부산

Page 8: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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 함수를

변경하는 방법

Page 9: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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__ 함수호출

Page 10: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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):

Page 11: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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)

새 파일에서 이전에 만든 모듈 불러오기

Page 12: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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 파일 만들어 놓기 (내용은 비워 둠)

Page 13: 2018-2 프로그래밍 1 - cju.ac.krdelab.cju.ac.kr/python_ch5.pdf · 2018-11-02 · 2018-2 프로그래밍 1 . 1 5. 장 파이썬 날개 ... 계산기가 더 많아질 때마다

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 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할, 만약 이 파일이

없으면 패키지로 인식되지 않음