Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "Y. Daniel Liang 길준민 · 정재화."— Presentation transcript:

1 Y. Daniel Liang 길준민 · 정재화

2 Chapter 6 함수

3 CONTENTS Ch6 함수 6.1 들어가기 6.2 함수 정의하기 6.3 함수 호출하기 6.4 반환값이 있는(없는) 함수
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 사례 연구: 재사용 가능한 그래픽 함수 1부터 10까지의 정수 합, 20부터 37까지의 정수 합, 그리고 35부터 49까지의 정수 합을 구한다고 가정해 보자. 반복되는 명령문 부분을 어떻게 해결할 수 있을까? 학습하기에 앞서 sum = 0 for i in range(1, 10): sum += i print(“1에서 10까지의 합은", sum,"입니다.") for i in range(20, 37): print(“20에서 37까지의 합은", sum,"입니다.") for i in range(35, 49): print(“35에서 49까지의 합은", sum,"입니다.")

4 학습목표 형식 매개변수를 가진 함수를 정의할 수 있다(6.2 절). 실매개변수(즉, 인자)를 가진 함수를 호출할 수 있다(6.3절). 값을 반환하는 함수와 값을 반환하지 않는 함수를 구별할 수 있다(6.4절). 위치 인자 혹은 키워드 인자를 사용하여 함수를 호출할 수 있다(6.5절). 참조값을 인자로 전달할 수 있다(6.6절). 읽기, 디버깅, 관리에 편리한 재사용 코드를 개발할 수 있다(6.7절). 함수를 재사용하기 위한 모듈을 만들 수 있다( 절). 변수의 스코프를 결정할 수 있다(6.9절). 기본 인자를 가진 함수를 정의할 수 있다(6.10절). 다중값을 반환하는 함수를 정의할 수 있다(6.11절). 소프트웨어 개발에서 함수 추상화의 개념을 적용할 수 있다 (6.12절). 단계적 개선을 사용한 함수의 설계 및 구현할 수 있다 (6.13절). 재사용 함수를 이용하여 그래픽 프로그램을 만들 수 있다 (6.14절).

5 해결 방법 def sum(i1, i2): result = 0 for i in range(i1, i2): 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 함수를 호출한다.

6 함수 정의하기 함수(function)는 동작을 수행하기 위한 명령문들의 모음이다. 함수 정의 함수 호출
함수 이름 형식매개변수 def max(num1, num2): if num1 > num2: result = num1 else: result = num2 return result z = max(x, y) 함수 헤더 실매개변수 (인자) 함수 몸체 반환 값

7 함수 헤더 함수는 헤더와 몸체를 가지고 있다. 헤더(header)는 def 키워드로 시작하 며 그 다음에 함수의 이름과 매개변수가 나오며, 콜론(:)으로 끝난다. 함수 정의 함수 호출 함수 이름 형식매개변수 def max(num1, num2): if num1 > num2: result = num1 else: result = num2 return result z = max(x, y) 함수 헤더 실매개변수 (인자) 함수 몸체 반환 값

8 형식 매개변수 함수 헤더 내의 변수들을 형식 매개변수(formal parameter) 또는 간략히 매 개변수라 한다.
함수 정의 함수 호출 함수 이름 형식매개변수 def max(num1, num2): if num1 > num2: result = num1 else: result = num2 return result z = max(x, y) 함수 헤더 실매개변수 (인자) 함수 몸체 반환 값

9 실매개변수 함수가 호출될 때 값이 매개변수로 전달되는데, 이 값을 실매개변수 actual parameter) 또는 인자(argument)라 한다. 함수 정의 함수 호출 함수 이름 형식매개변수 def max(num1, num2): if num1 > num2: result = num1 else: result = num2 return result z = max(x, y) 함수 헤더 실매개변수 (인자) 함수 몸체 반환 값

10 결과값 return 키워드를 사용하는 반환 명령문은 값-반환 함수에 필수적이다 함수 정의 함수 호출
함수 이름 형식매개변수 def max(num1, num2): if num1 > num2: result = num1 else: result = num2 return result z = max(x, y) 함수 헤더 실매개변수 (인자) 함수 몸체 반환 값

11 함수 호출하기 max 함수 max라는 이름의 함수는 두 개의 매개변수로 num1과 num2를 가지고 있으 며, 이들 중에 큰 값을 반환한다. TestMax 실행

12 함수 호출 트레이스 int 5 값을 전달 int 2 값을 전달 def max(num1, num2): def main():
if num1 > num2: result = num1 else: result = num2 return result main( ) def main(): i = 5 j = 2 k = max(i, j) print(i, "와/과", j, "중 큰 수는", k, "입니다.")

13 함수 호출 트레이스 int 5 값을 전달 int 2 값을 전달 메인함수 호출 def main():
def max(num1, num2): if num1 > num2: result = num1 else: result = num2 return result main( ) def main(): i = 5 j = 2 k = max(i, j) print(i, "와/과", j, "중 큰 수는", k, "입니다.")

14 함수 호출 트레이스 i에 5 저장 int 5 값을 전달 int 2 값을 전달 main( ) 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

15 함수 호출 트레이스 j에 2 저장 int 5 값을 전달 int 2 값을 전달 main( ) def main(): i = 5
k = max(i, j) print(i, "와/과", j, "중 큰 수는", k, "입니다.") def max(num1, num2): if num1 > num2: result = num1 else: result = num2 return result

16 함수 호출 트레이스 max(i, j)를 호출 int 5 값을 전달 int 2 값을 전달 main( ) def main():
k = max(i, j) print(i, "와/과", j, "중 큰 수는", k, "입니다.") def max(num1, num2): if num1 > num2: result = num1 else: result = num2 return result

17 함수 호출 트레이스 max(i, j)가 호출 됨 i의 값을 num1에 넘겨줌 j의 값을 num2에 넘겨줌 int 5 값을 전달
main( ) 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

18 함수 호출 트레이스 num1=5, num2=2 따라서 (num1 > num2)는 참 int 5 값을 전달
main( ) 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

19 함수 호출 트레이스 result에 num1의 값, 5 저장 int 5 값을 전달 int 2 값을 전달 main( )
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

20 함수 호출 트레이스 int 5 값을 전달 int 2 값을 전달 main( ) 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 result의 값 5를 반환

21 함수 호출 트레이스 int 5 값을 전달 int 2 값을 전달 main( ) 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 max(i, j)의 값 5를 반환하고 반환값을 k에 할당

22 함수 호출 트레이스 int 5 값을 전달 int 2 값을 전달 main( ) 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 print문을 실행

23 함수 호출 트레이스 int 5 값을 전달 int 2 값을 전달 main( ) 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 호출자에게 반환

24 호출 스택 스택 스택 스택 max 함수를 위한 필요 공간 max 함수를 위한 필요 공간 main 함수를 위한 필요 공간
result: num2: num1: num2: num1: int 객체 2 int 객체 2 main 함수를 위한 필요 공간 main 함수를 위한 필요 공간 j: 2 i: 5 int 객체 5 j: i: int 객체 5 main 함수 호출 객체 저장을 위한 max 함수 호출 객체 저장을 위한 max 함수 실행과정

25 호출 스택 스택 스택 main 함수를 위한 필요 공간 max 함수 호출 객체 저장을 위한 힙 max 함수 실행과정 k: j:
int 객체 2 main 함수를 위한 필요 공간 k: j: i: 빈 스택 int 객체 5 max 함수 호출 객체 저장을 위한 max 함수 실행과정

26 반환값이 있는 함수 혹은 반환값이 없는 함수 반환값이 없는 유형의 함수는 값을 반환하지 않는다. 이러한 유형의 함수는 특정 행동을 수행한다. PrintGradeFunction ReturnGradeFunction 실행 실행

27 None 값 값을 반환하지 않는 함수를 프로그래밍 용어로 void 함수라고 한다.
파이썬은 모든 함수는 return을 사용하든지 사용하지 않든 간에 값을 반 환한다. 함수가 값을 반환하지 않으면, 특별한 값인 None을 기본적으로 반환한 다. def sum(number1, number2): total = number1 + number2 print(sum(1, 2))

28 위치에 따른 인자 전달 다음과 같은 구문으로 함수를 호출할 경우 출력값은 무엇일까?
def nPrintln(message, n): for i in range(0, n): print(message) 다음과 같은 구문으로 함수를 호출할 경우 출력값은 무엇일까? nPrintln("파이썬에 오신것은 환영합니다", 5) nPrintln("파이썬에 오신것은 환영합니다", 15) 다음 구문은 무엇이 잘못되었는가? nPrintln(4, "파이썬에 오신것은 환영합니다")

29 nPrintln(n = 4, message = "컴퓨터과학과")
키워드 인자 def nPrintln(message, n): for i in range(0, n): print(message) 다음 구문은 가능할까? nPrintln(n = 4, message = "컴퓨터과학과")

30 값에 의한 전달 파이썬에서 모든 데이터는 객체이기 때문에, 객체에 대한 변수는 실 제로 그 객체에 대한 참조(reference)이다. 인자를 갖는 함수가 호출될 때, 각 인자의 참조값이 매개변수로 전달된다. 이를 프로그래밍 용어로 값에 의한 전달(pass-by-value)이라 한다. 간단히 말해서, 함수가 호출될 때 인자의 값이 매개변수로 전달된다 고 말할 수 있다. 이 값은 실제로는 객체의 참조값이다. 인자가 숫자나 문자열이면, 함수 내부에서 매개변수의 값이 수정되 더라도 인자에는 아무런 영향을 주지 않는다. Increment 실행

31 코드 모듈화 하기 함수는 코드 중복을 줄여주고 코드 재사용을 위한 목적으로 사용된 다.
또한 함수는 코드를 모듈화하고 프로그램의 품질을 향상시키기 위해 사용된다. GCDFunction TestGCDFunction PrimeNumberFunction 실행 실행

32 Decimal2HexConversion
사례 연구: 10진수를 16진수로 변환하기 10진수를 16진수로 변환하는 함수 작성하기 Decimal2HexConversion 실행

33 변수의 스코프 스코프: 변수가 참조될 수 있는 프로그램의 영역
함수 내부에서 생성된 변수를 지역변수(local variable)라 한다. 지역변수는 함수 내부에서만 접근될 수 있다. 지역변수의 스코프는 지역변수가 생성된 지점부터 그 변수를 포함하고 있는 함수의 끝까지이다. 파이썬에서 전역변수(global variable)를 사용할 수 있다. 전역변수는 모든 함수의 외부에 생성되며 모든 함수에서 접근 가능하다.

34 예제 1 globalVar = 1 def f1(): localVar = 2 print(globalVar)
print(localVar) f1() print(localVar) # 스코프 밖이므로 오류가 발생한다.

35 예제 2 x = 1 def f1(): x = 2 print(x) # 2가 출력된다. f1()

36 예제 3 x = eval(input(숫자를 입력하세요: ")) if (x > 0): y = 4
print(y) # y가 생성되지 않으면, 오류가 발생한다.

37 예제 4 sum = 0 for i in range(0, 5): sum += i print(i)

38 예제 5 x = 1 def increase(): global x x = x + 1 print(x) # 2가 출력된다.

39 기본 인자 파이썬은 기본 인자 값을 가진 함수 정의를 허용한다. 함수가 인자 없 이 호출될 때 기본 값이 매개변수로 전달된다.
DefaultArgumentDemo 실행

40 MultipleReturnValueDemo
다중값 반환하기 파이썬은 함수가 다중값을 반환하는 것을 허용한다. 코드 6.10은 두 숫자를 받아들여 이를 오름차순으로 반환하는 함수를 보여준다. MultipleReturnValueDemo 실행

41 사례 연구: 랜덤 ASCII 문자 생성하기 RandomCharacter TestRandomCharacter 실행

42 함수 추상화 함수의 몸체를 함수의 구체적인 구현 방법을 포함하고 있는 블랙박 스로 생각할 수 있다. 입력 매개변수 (옵션)
반환 값 (옵션) 함수 헤더 함수 몸체 블랙박스

43 함수를 사용하면 좋은 점 한 번 작성한 함수를 어느 위치에서든 재사용할 수 있다.
정보 은닉 – 사용자로부터 구현 내용을 감출 수 있다. 복잡한 부분을 감소시킬 수 있다.

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

45 사례 연구: PrintCalender 단계선 개선 방법의 예로 PrintCalender를 사용해 보자. 실행
PrintCalendar 실행

46 디자인 다이어그램 printCalendar (main) readInput printMonth

47 디자인 다이어그램 printCalendar (main) readInput printMonth printMonthTitle
printMonthBody

48 디자인 다이어그램 printCalendar (main) readInput printMonth printMonthTitle
printMonthBody getMonthName

49 디자인 다이어그램 printCalendar (main) readInput printMonth printMonthTitle
printMonthBody getMonthName getStartDay getNumOfDaysInMonth

50 디자인 다이어그램 printCalendar (main) readInput printMonth printMonthTitle
printMonthBody getMonthName getStartDay getTotalNumOfDays getNumOfDaysInMonth

51 디자인 다이어그램 printCalendar (main) readInput printMonth printMonthTitle
printMonthBody getMonthName getStartDay getTotalNumOfDays getNumOfDaysInMonth isLeapYear

52 A Skeleton for printCalendar
구현: 하향식 접근 방법 하향식 접근 방식은 위에서부터 아래로 구조 차트에 있는 함수 하나 씩을 차례대로 구현해 가는 방식이다. 간단하지만 불완전한 함수인 스텁(stub)을 사용하여 함수를 바로 구현하지 않고 차후로 미룰 수도 있 다. 스텁을 사용하면 호출자 관점에서 함수를 생각해볼 수 있다. main 함수 구현 시, 연도와 월을 간략히 출력하는 printMonth 함수를 스텁 으로 나타내 보자. 예를 들어 printMonth 함수는 스텁 내부의 년도와 월을 출력하도록 만들면, 프로그램은 다음과 같이 시작된다. A Skeleton for printCalendar

53 구현: 상향식 접근 방법 상향식 접근 방식은 아래에서 위로 구조 차트 내부의 함수 하나씩을 차례대로 구현해 나가는 방식이다. 구현된 각각의 함수마다 함수 테 스트를 위해 드라이버(driver)로 알려진 테스트 프로그램을 작성해야 한 다. 하향식과 상향식 접근 방식 둘 다 좋은 방식이다. 두 접근 방식 모두, 함수들을 하나씩 점진적으로 구현하며, 구현과 프로그래밍 오류를 분리하는 데 도움을 주며, 디버깅을 쉽게 해준다. 또한 두 접근 방식을 함께 사용할 수도 있다.

54 터틀: 재사용 가능한 그래픽 함수 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 UseCustomTurtleFunctions 실행

55 감사합니다.


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

Similar presentations


Ads by Google