• 검색 결과가 없습니다.

Y. Daniel Liang 길준민 · 정재화

N/A
N/A
Protected

Academic year: 2022

Share "Y. Daniel Liang 길준민 · 정재화"

Copied!
72
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

ISBN 978-89-7050-850-4 978-0-13-274718-9

Y. Daniel Liang 길준민 · 정재화

(2)

Chapter 6

함수

(3)

6.1 들어가기

6.2 함수 정의하기

6.3 함수 호출하기

6.4 반환값이 있는(없는) 함수

6.5 위치 인자와 키워드 인자

6.6 참조값에 의한 인자 전달

6.7 코드 모듈화하기

6.8 사례연구: 10진수->16진수 변환

6.9 변수의 스코프

6.10 기본 인자

6.11 다중값 반환하기

6.12 사례 연구: 랜덤 ASCII 문자 생성

6.13 함수 추상화와 단계적 개선

6.14 사례 연구: 재사용 가능한 그래픽 함수

CONTENTS

Ch6

함수

(4)

• 형식 매개변수를 가진 함수를 정의할 수 있다(6.2 절).

• 실매개변수(즉, 인자)를 가진 함수를 호출할 수 있다(6.3절).

• 값을 반환하는 함수와 값을 반환하지 않는 함수를 구별할 수 있다(6.4절).

• 위치 인자 혹은 키워드 인자를 사용하여 함수를 호출할 수 있다(6.5절).

• 참조값을 인자로 전달할 수 있다(6.6절).

• 읽기, 디버깅, 관리에 편리한 재사용 코드를 개발할 수 있다(6.7절).

• 함수를 재사용하기 위한 모듈을 만들 수 있다(6.7-6.9절).

• 변수의 스코프를 결정할 수 있다(6.9절).

• 기본 인자를 가진 함수를 정의할 수 있다(6.10절).

• 다중값을 반환하는 함수를 정의할 수 있다(6.11절). 학습목표

(5)

함수란 ?

프로그램을 구성하는 기본적인 구성요소이며 하나의 프로그램에 여러 함수가 포함될 수 있다.

함수

프로그램

(6)

작은 단위의 함수를 이용하면 큰 소프트웨어를 쉽게 만들 수

(7)

1. 다른 프로그램에서 재사용이 가능

함수의 역할

2. 가독성이 증가

3. 유지 관리가 쉬워진다.

(8)

함수는 입력을 받아서 특정한 작업을 수행한다.

함수의 구성

Add ( )

3 입력 8

출력

함수

(9)

함수의 특징

1. 함수는 서로 구별되는 이름을 가지고 있다.

2. 함수는 특정한 작업을 수행한다.

3. 함수는 입력을 받을 수 있고 수행 결과를 반환할 수

있다

(10)
(11)

# 함수선언

def print_star():

print('********************')

# 함수호출

print_star() print_star() print_star() print_star() print_star()

Lab : 다음 코드를 입력해봅시다

(12)

• 1부터 10까지의 정수 합, 20부터 37까지의 정수 합, 그리고 35부터 49까지의 정수 합을 구한 다고 가정해 보자.

• 반복되는 명령문 부분을 어떻게 해결할 수 있을까?

sum = 0

for i in range(1, 10+1):

sum += i

print(“1 에서 10까지의 합은", sum,"입니다.") sum = 0

for i in range(20, 37+1):

sum += i

print(“20 에서 37까지의 합은", sum,"입니다.") sum = 0

for i in range(35, 49+1):

sum += i

print(“35 에서 49까지의 합은", sum,"입니다.")

(13)

def sum(i1, i2):

result = 0

for i in range(i1, i2+1):

result += i return result

def main():

print(“1부터 10까지의 합은", sum(1, 10)) print(“20부터 37까지의 합은", sum(20, 37)) print(“35부터 49까지의 합은", sum(35, 49)) main() # main 함수를 호출한다.

해결 방법

(14)

• 함수(function)는 동작을 수행하기 위한 명령문들의 모음이다.

함수 정의하기

d e f m a x ( n u m 1 , n u m 2 ) : i f n u m 1 > n u m 2 : r e s u l t = n u m 1 e l s e :

r e s u l t = n u m 2 r e t u r n r e s u l t

z = m a x ( x , y )

함수 헤더

함수 몸체

함수 정의 함수 호출

실매개변수 (인자)

반환 값

함수 이름 형식매개변수

(15)

• 함수는 헤더와 몸체를 가지고 있다. 헤더(header)는 def 키워드로 시작하며 그 다 음에 함수의 이름과 매개변수가 나오며, 콜론(:)으로 끝난다.

함수 헤더

d e f m a x ( n u m 1 , n u m 2 ) : i f n u m 1 > n u m 2 : r e s u l t = n u m 1 e l s e :

r e s u l t = n u m 2 r e t u r n r e s u l t

z = m a x ( x , y )

함수 헤더

함수 몸체

함수 정의 함수 호출

실매개변수 (인자)

반환 값

함수 이름 형식매개변수

(16)

• 함수 헤더 내의 변수들을 형식 매개변수(formal parameter) 또는 간략히 매 개변수라 한다.

형식 매개변수

d e f m a x ( n u m 1 , n u m 2 ) : i f n u m 1 > n u m 2 : r e s u l t = n u m 1 e l s e :

r e s u l t = n u m 2 r e t u r n r e s u l t

z = m a x ( x , y )

함수 헤더

함수 몸체

함수 정의 함수 호출

실매개변수 (인자)

반환 값

함수 이름 형식매개변수

(17)

• 함수가 호출될 때 값이 매개변수로 전달되는데, 이 값을 실매개변수 actual parameter) 또는 인자(argument)라 한다.

실매개변수

d e f m a x ( n u m 1 , n u m 2 ) : i f n u m 1 > n u m 2 : r e s u l t = n u m 1 e l s e :

r e s u l t = n u m 2 r e t u r n r e s u l t

z = m a x ( x , y )

함수 헤더

함수 몸체

함수 정의 함수 호출

실매개변수 (인자)

반환 값

함수 이름 형식매개변수

(18)

• return 키워드를 사용하는 반환 명령문은 값-반환 함수에 필수적이다

결과값

d e f m a x ( n u m 1 , n u m 2 ) : i f n u m 1 > n u m 2 : r e s u l t = n u m 1 e l s e :

r e s u l t = n u m 2 r e t u r n r e s u l t

z = m a x ( x , y )

함수 헤더

함수 몸체

함수 정의 함수 호출

실매개변수 (인자)

반환 값

함수 이름 형식매개변수

(19)

• max라는 이름의 함수는 두 개의 매개변수로 num1과 num2를 가지고 있으며, 이 들 중에 큰 값을 반환한다.

함수 호출하기

# 두 수 중에서 큰 수를 반환한다.

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

def main():

i = 5 j = 2

k = max(i, j) # max 함수를 호출한다.

print(i, "와/과", j, "중에서 큰 수는", k, "입니다.")

main() # main 함수를 호출한다.

(20)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

(21)

함수 호출 트레이스

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result main( )

메인함수 호출

(22)

함수 호출 트레이스

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result main( )

i 에 5를 저장

(23)

함수 호출 트레이스

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result main( )

j 에 2를 저장

(24)

함수 호출 트레이스

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result main( )

max(i, j)를 호출

(25)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

j에 저장된 2 값을 전달 i에 저장된 5 값을 전달

(26)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

j에 저장된 2 값을 전달 i에 저장된 5 값을 전달

max(i, j)가 호출 됨 i의 값을 num1에 넘겨줌 j의 값을 num2에 넘겨줌

(27)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

j에 저장된 2 값을 전달 i에 저장된 5 값을 전달

num1=5, num2=2

따라서 (num1 > num2)는 참

(28)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

result에 num1의 값, 5 저장

(29)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

result의 값 5를 반환

(30)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

(31)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

max(i, j)의 값 5를 반환하고 반 환값을 k에 할당

(32)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

(33)

def main():

i = 5 j = 2

k = max(i, j)

print(i, "와/과", j, "중 큰 수는", k, "입니다.")

def max(num1, num2):

if num1 > num2:

result = num1 else:

result = num2 return result

함수 호출 트레이스

main( )

호출자에게 반환

(34)

호출 스택

객체 저장을 위한 힙

main 함수 호출 max 함수 호출 max 함수 실행과정

스택 스택 스택

int 객체 2

int 객체 5

main 함수를

위한 필요 공간

j: 2 i: 5

객체 저장을 위한 힙

main 함수를

위한 필요 공간

j:

i:

max 함수를 위한 필요 공간

num2:

num1:

int 객체 2

int 객체 5

max 함수를 위한 필요 공간

result:

num2:

num1:

(35)

호출 스택

객체 저장을 위한 힙

max 함수 호출 max 함수 실행과정

스택 스택

main 함수를 위한 필요 공간

k:

j:

i:

int 객체 2

int 객체 5

빈 스택

(36)

• 반환값이 없는 유형의 함수는 값을 반환하지 않는다.

• 이러한 유형의 함수는 특정 행동을 수행한다.

반환값이 있는 함수 혹은 반환값이 없는 함수

ReturnGradeFunction

실행

PrintGradeFunction

실행

(37)

• 값을 반환하지 않는 함수를 프로그래밍 용어로 void 함수라고 한다.

• 파이썬은 모든 함수는 return을 사용하든지 사용하지 않든 간에 값을 반환한다.

• 함수가 값을 반환하지 않으면, 특별한 값인 None을 기본적으로 반환한다.

None 값

def sum(number1, number2):

total = number1 + number2

print(sum(1, 2))

(38)

• 다음과 같은 구문으로 함수를 호출할 경우 출력값은 무엇일까?

nPrintln( "파이썬에 오신것은 환영합니다", 5)

• 다음과 같은 구문으로 함수를 호출할 경우 출력값은 무엇일까?

nPrintln( "파이썬에 오신것은 환영합니다", 15)

• 다음 구문은 무엇이 잘못되었는가?

"파이썬에 오신것은 환영합니다")

위치에 따른 인자 전달

def nPrintln(message, n):

for i in range(0, n):

print(message)

(39)

• 다음 구문은 가능할까?

nPrintln(n = 4, message = "컴퓨터과학과")

키워드 인자

def nPrintln(message, n):

for i in range(0, n):

print(message)

(40)

• 파이썬에서 모든 데이터는 객체이기 때문에, 객체에 대한 변수는 실제로 그 객체에 대 한 참조(reference)이다. 인자를 갖는 함수가 호출될 때, 각 인자의 참조값이 매개변 수로 전달된다. 이를 프로그래밍 용어로 값에 의한 전달(pass-by-value)이라 한다.

• 간단히 말해서, 함수가 호출될 때 인자의 값이 매개변수로 전달된다고 말할 수 있다.

이 값은 실제로는 객체의 참조값이다.

• 인자가 숫자나 문자열이면, 함수 내부에서 매개변수의 값이 수정되더라도 인자에는 아무런 영향을 주지 않는다.

값에 의한 전달

Increment

실행

(41)

• 함수는 코드 중복을 줄여주고 코드 재사용을 위한 목적으로 사용된다.

• 또한 함수는 코드를 모듈화하고 프로그램의 품질을 향상시키기 위해 사용된다.

코드 모듈화 하기

(42)

10 진수 16 진수 2 진수

(43)

• 10진수 체계

• 0,1,2,3,4,5,6,7,8,9 의 10가지 기호를 사용하여 수를 표현

• 16진수

• 0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F의 16가지 기호를 사용하여 수를

표현

(44)
(45)

사례 연구: 10진수를 16진수로 변환하기

# 10진수를 문자열 형태의 16진수로 변환한다.

def decimalToHex(decimalValue):

hex = ""

while decimalValue != 0:

hexValue = decimalValue % 16 hex = toHexChar(hexValue) + hex decimalValue = decimalValue // 16 return hex

# 정수를 문자 형태의 한 자릿수 16진수로 변환한다.

def toHexChar(hexValue):

if 0 <= hexValue <= 9:

return chr(hexValue + ord('0')) else: # 10 <= hexValue <= 15

return chr(hexValue - 10 + ord('A')) def main():

# 사용자로부터 10진수 정수를 입력받는다.

decimalValue = eval(input("10진수를 입력하세요: ")) print("입력된 10진수",

decimalValue, "의 16진수 표현은", decimalToHex(decimalValue), "입니다.") main() # main 함수를 호출한다.

(46)

• 스코프: 변수가 참조될 수 있는 프로그램의 영역

• 함수 내부에서 생성된 변수를 지역변수(local variable)라 한다.

• 지역변수는 함수 내부에서만 접근될 수 있다.

• 지역변수의 스코프는 지역변수가 생성된 지점부터 그 변수를 포함하고 있 는 함수의 끝까지이다.

• 파이썬에서 전역변수(global variable)를 사용할 수 있다.

• 전역변수는 모든 함수의 외부에 생성되며 모든 함수에서 접근가능하다.

변수의 스코프

(47)

예제 1

globalVar = 1 def f1():

localVar = 2 print(globalVar) print(localVar) f1()

print(globalVar)

print(localVar) # 스코프 밖이므로 오류가 발생한다.

(48)

예제 2

x = 1 def f1():

x = 2

print(x) # 2 가 출력된다.

f1()

print(x) # 1 이 출력된다.

(49)

예제 3

x = eval(input(숫자를 입력하세요: ")) if (x > 0):

y = 4

print(y) # y가 생성되지 않으면, 오류가 발생한다.

섬세함과 주의가 필요한 코딩예시

(50)

예제 4

sum = 0

for i in range(0, 5):

sum += i print(i)

0,1,2,3,4 의 합을 출력하는 코드

(51)

예제 5

x = 1

def increase():

global x x = x + 1

print(x) # 2 가 출력된다.

increase()

print(x) # 2가 출력된다.

(52)

• 파이썬은 기본 인자 값을 가진 함수 정의를 허용한다.

• 함수가 인자 없이 호출될 때 기본 값이 매개변수로 전달된다.

기본 인자

(53)

• 파이썬은 함수가 다중값을 반환하는 것을 허용한다.

• 코드 6.10은 두 숫자를 받아들여 이를 오름차순으로 반환하는 함수를 보여준 다.

다중값 반환하기

(54)

사례 연구: 랜덤 ASCII 문자 생성하기

(55)

import를 사용하여 RandomCharacter.py 파일을 가져올 수 있다

(56)

• 함수의 몸체를 함수의 구체적인 구현 방법을 포함하고 있는 블랙박스로 생각할 수 있다.

함수 추상화

함수 헤더

함수 몸체 블랙박스

입력 매개변수 ( 옵션)

반환 값

( 옵션)

(57)

• 한 번 작성한 함수를 어느 위치에서든 재사용할 수 있다.

• 정보 은닉 – 사용자로부터 구현 내용을 감출 수 있다.

• 복잡한 부분을 감소시킬 수 있다.

함수를 사용하면 좋은 점

(58)

• 함수 추상화의 개념은 프로그램의 개발 과정에 적용될 수 있다. 큰 프로그램을 작성할 때, 원래 문제를 하위 문제로 쪼개어 해결하는 “분할 후 정복(divide-and- conquer)” 전략을 사용할 수 있다.

• 이를 단계적 개선(stepwise refinement)이라 한다. 분할된 하위 문제를 더 작은 하위 문제로 다시 분할하여 해결할 수 있다.

단계적 개선

(59)

• 단계선 개선 방법의 예로 PrintCalender를 사용해 보자.

사례 연구: PrintCalender

PrintCalendar 실행

(60)

디자인 다이어그램(1)

printCalendar (main)

readInput printMonth

(61)

디자인 다이어그램(2)

printCalendar (main)

readInput printMonth

printMonthTitle printMonthBody

(62)

디자인 다이어그램(3)

printCalendar (main)

readInput printMonth

printMonthTitle printMonthBody

getMonthName

(63)

디자인 다이어그램(4)

printCalendar (main)

readInput printMonth

printMonthTitle printMonthBody

getMonthName getStartDay

getNumOfDaysInMonth

(64)

디자인 다이어그램(5)

printCalendar (main)

readInput printMonth

printMonthTitle printMonthBody

getMonthName getStartDay

getTotalNumOfDays

getNumOfDaysInMonth

(65)

디자인 다이어그램(6)

printCalendar (main)

readInput printMonth

printMonthTitle printMonthBody

getMonthName getStartDay

getTotalNumOfDays

getNumOfDaysInMonth

isLeapYear

(66)

• 하향식 접근 방식은 위에서부터 아래로 구조 차트에 있는 함수 하나씩을 차례대로 구 현해 가는 방식이다. 간단하지만 불완전한 함수인 스텁(stub)을 사용하여 함수를 바로 구현하지 않고 차후로 미룰 수도 있다.

• 스텁을 사용하면 호출자 관점에서 함수를 생각해볼 수 있다.

• main 함수 구현 시, 연도와 월을 간략히 출력하는 printMonth 함수를 스텁으로 나 타내 보자. 예를 들어 printMonth 함수는 스텁 내부의 년도와 월을 출력하도록 만 들면, 프로그램은 다음과 같이 시작된다.

구현: 하향식 접근 방법

A Skeleton for printCalendar

(67)

• 상향식 접근 방식은 아래에서 위로 구조 차트 내부의 함수 하나씩을 차례대로 구현해 나가는 방식이다. 구현된 각각의 함수마다 함수 테스트를 위해 드라이버(driver)로 알려진 테스트 프로그램을 작성해야 한다.

• 하향식과 상향식 접근 방식 둘 다 좋은 방식이다. 두 접근 방식 모두 함수들을 하나씩 점진적으로 구현하며, 구현과 프로그래밍 오류를 분리하는 데 도움을 주며, 디버깅을 쉽게 해준다. 또한 두 접근 방식을 함께 사용할 수도 있다.

구현: 상향식 접근 방법

(68)

터틀: 재사용 가능한 그래픽 함수

def drawLine(x1, y1, x2, y2):

def writeString(s, x, y):

def drawPoint(x, y):

def drawCircle(x = 0, y = 0, radius = 10):

def drawRectangle(x = 0, y = 0, width = 10, height = 10):

UsefulTurtleFunctions

(69)
(70)
(71)

• 6장 연습문제

• 6.2, 6.3, 6.4, 6.5, 6.9 풀이

• 소스코드와 수행결과를 캡쳐하여 제출하시오

• 모든 문제에 대하여 느낀점과 어려웠던 점을 한 문장 이상 적어서 제출하 시오

• 모든 코드에 대해서 2줄 이상의 주석문을 달도록 하시오

• 제출일 : 5월 24일까지

과제 #8

(72)

ISBN 978-89-7050-850-4 978-0-13-274718-9

감사합니다.

참조

관련 문서

• 키와 일치하는 원소를 리스트에서 찾을 때까지 혹은 발견된 원소 없이 리스트 의 모든 원소를 전부 비교할 때까지 반복된다.. • 일치하는 원소를

• 파이썬은 연산자와 동일한 결과를 산출하는 함수로서 특수 메소드의 정의를 허용한다.이 메소드들은 파이썬이 인식할 수 있도록 특별한

result = FunctionName() 함수 이름이 FunctionName 이라는 함수를 호출하여 함수 가 반환하는 값인 ResultValue를 저장할 변수(result)를 지

따라서 함수인

base 클래스의 접근 제어와 protected 멤버 상속 관계에서의 생성자와 소멸자.. 함수 재정의(function overriding) 디폴트 액세스 지정자와

• 독립 성분은 문장 안에서 다른 성분과 어울려 하나의 생각을 표현하 기는 하지만 이 성분이 없어도 나머지 부분으로

 인자로 들어온 콜백 함수를 계속해서 호출하여 배열의 요소들을 왼쪽에서 오른쪽 방향으로 나아가면서 하나의 값으로 줄임. – 콜백 함수: 어떻게 배열의 원소들을

③ 함수 &gt; 프로그래밍 &gt; 숫자형 팔레트에서 곱하기 함수를 블록 다이어그램에 두고 화씨온도 터미널과 반복 터미널을 입력으로 연결하고 이 함수의 춗력을 C_F