Download presentation
Presentation is loading. Please wait.
Published by상민 송 Modified 8년 전
1
Chapter 7 서브프로그램
2
Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2
3
1. 서브 프로그램의 정의 (1) 서브 프로그램의 사용 이유 ▫ 프로그램의 크기를 줄임 ▫ 모듈화 프로그래밍 (modular programming) 원칙 프로그램을 보다 작고 이해할 수 있는 단위로 나누어 작성 ▫ 프로그램의 가독성, 유지 보수 서브 프로그램 (sub program) 명칭 ▫ 함수 (function) ▫ 프로시저 (procedure) ▫ 서브루틴 (subroutine) 3
4
1. 서브 프로그램의 정의 (2) 서브 프로그램의 요소 ▫ 이름 ▫ 매개변수 리스트 ▫ 몸체 (body) ▫ 참조 환경 (reference environment) 4 procedure p_name (parameter list) local variable declaration part begin body end;
5
1. 서브 프로그램의 정의 (3) 서브 프로그램의 명시 ▫ 서브 프로그램의 호출 이름 인자의 수와 인자의 유형 반환 값의 수와 유형 서브 프로그램에서 수행하는 기능 : what not how abstraction 5 function gcd (m, n : integer) : integer ;
6
1. 서브 프로그램의 정의 (4) ▫ 호출 방식 FORTRAN: CALL PROC(I, J) C, Ada, Pascal: proc(i, j); Perl: &proc(i, j); ▫ 결과 반환 Pascal, FORTRAN: 함수 이름 C, Ada, Perl: return 문장 6
7
7 program compute (input, output) var a, b, result : integer ; function gcd (m, n : integer) : integer ; begin if (m mod n) = 0 then gcd := n else gcd := gcd(n, m mod n) end; begin a := 240; b := 48; result := gcd(a, b); write(result) end.
8
1. 서브 프로그램의 정의 (5) 순환 함수 ▫ 되부름 함수, 재귀 함수, recursive subprogram ▫ 정의 함수의 기능을 구현하기 위하여 함수 자신을 사용하여 정 의하는 것 ▫ 이해하기 쉽고 간결 8 if n = 1 then n! = 1 else n! = n (n – 1)! int fact(int n) { if (n == 1) return 1; else return n * fact(n-1); }
9
1. 서브 프로그램의 정의 (6) 블록 구조 ▫ Algol ▫ 이름있는 블록 ( 서브 프로그램 ), 이름 없는 블록 ▫ Block = 선언부 + 실행부 ▫ Pascal ▫ C ▫ PL/I, Ada, C++, … ▫ 정적 영역 규칙 9 이름 없는 블록을 허용하지 않음 중첩 블록 구조 허용 이름 없는 블록을 허용 중첩 블록 구조 허용하지 않음
10
1. 서브 프로그램의 정의 (7) ▫ 블록 구조의 특성 시작 부분에서 지역 변수 선언 : 외부에서는 참조 못함 정보 은닉 (information hiding) 블록 실행시 지역 변수를 위한 메모리 할당 실행 종료시 회수 변수명 참조 : 가장 안쪽의 블록에서 선언된 이름의 변수 사용 이름을 가진 블록만이 호출될 수 있다 : 블록 내부의 서브 프로그램은 외부에서 호출할 수 없다 블록은 외부로부 터 감추어진다. 10
11
1. 서브 프로그램의 정의 (8) ▫ 사용 가능한 변수 및 프로시저 ( 참조 환경 ) Area (a): a, b, c, p1, p2, outer, inner Area (b): a, b, p1, outer, inner Area (c): a, outer 11
12
1. 서브 프로그램의 정의 (9) 12 PROGRAM main; VAR a : integer; PROCEDURE outer(p1 : integer); VAR b : integer; PROCEDURE inner(p2 : integer); VAR c : integer; BEGIN { statement of inner : area (a) } END; BEGIN { statement of outer : area (b) } END; BEGIN { statement of main : area (c) } END. Inner 영역 Outer 영역 Main 영역
13
실인자 (actual parameter) ▫ 서브 프로그램에게 전달되는 실제 값을 저장하고 있는 인자, result := gcd (a, b); 형식 인자 (formal parameter) ▫ 함수 선언에 사용하는 인자 ▫ function gcd(m, n : integer) : integer ; 실인자와 형식 인자의 대응 ▫ 위치에 의한 대응 13 2. 형식 인자와 실인자 (1) 실인자 fun (&a, b, 1) 형식인자 void fun (int *a, int b, int c)
14
▫ 이름에 의한 대응 Ada 형식 인자와 실인자의 이름이 같아야 한다. 14 2. 형식 인자와 실인자 (2) declare … procedure SEARCH(Vector : in StrArray, Name in STRING, Index : out Integer) is begin … end; begin … SEARCH(Name ”Kim”, Vector Name_List, Index result); … end
15
2. 형식 인자와 실인자 (3) 형식 인자의 기본값 (default value) ▫ C++, Ada: 형식 인자의 기본값 명시 가능 ▫ 실인자의 개수가 형식 인자의 개수보다 적을 수 있다. 명시되지 않은 인자는 기본값 이용 15 #include int sum(int i, int j=0, int k=0, int m=0, int n=0) { return i+j+k+m+n; } void main() { cout << sum(4) << “\n”; cout << sum(4,4) << “\n”; cout << sum(4,4,4) << “\n”; cout << sum(5,5,4,4) << “\n”; cout << sum(1,2,3,4,5) << “\n”; }
16
3. 매개변수 전달 방법 (1) Call by value ▫ 실인자의 값 (r-value) 을 형식 인자에 전달 ▫ 형식 인자와 실인자는 별도의 기억 공간 차지 16 #include int big = 48; void main() { int i = 2; add(i, big); printf(“i = %d big = %d\n”, i, big); } void add(int a, int b) { big += 10; a += 2; b += 4; } big : 48 i : 2 b : 48 a : 2 b : 52 a : 4 big : 58
17
3. 매개변수 전달 방법 (2) Call by value result ▫ Call by value + 형식 인자의 값을 실인자에 복사하여 되돌려줌 17 big : 48 i : 2 b : 48 a : 2 b : 52 a : 4 big : 52 i : 4 big : 58 #include int big = 48; void add(int a, int b) { big += 10; a += 2; b += 4; } void main() { int i = 2; add(i, big); printf(“i = %d big = %d\n”, i, big); }
18
3. 매개변수 전달 방법 (3) Call by reference ▫ 실인자의 주소 (l-value) 를 형식 인자에게 전달 ▫ 형식 인자와 실인자는 동일 기억 공간 차지 18 big : 48 i : 2 b a big : 62 big : 58 a : 4 #include int big = 48; void add(int a, int b) { big += 10; a += 2; b += 4; } void main() { int i = 2; add(i, big); printf(“i = %d big = %d\n”, i, big); }
19
3. 매개변수 전달 방법 (4) 19 #include int big = 48; void main() { int i = 2; add(&i, &big); printf(“i = %d big = %d\n”, i, big); } void add(int *a, int *b) { big += 10; *a += 2; *b += 4; }
20
3. 매개변수 전달 방법 (5) Call by name ▫ 형식 인자가 사용될 때마다 필요한 실인자의 l-value, r- value 가 계산되어 사용된다. 20 #include int big = 48; int i = 2; void main() { add(i, big); printf(“i = %d big = %d\n”, i, big); } void add(int a, int b) { big += 10; a += 2; b += 4; } void add() { big += 10; i += 2; big += 4; }
21
3. 매개변수 전달 방법 (6) 21 program X; var A : array[1..2] of integer; i : integer; begin i := 1; A[1] := 1; A[2] := 4; X(i, A[i]); write(i, A[1], A[2]); end. procedure X(K, M); begin K := K + 1; M := M + 1; end; A[1] : 1 i : 1 M K A[1] : 2 i : 2 Call by reference A[i] : 1 i : 1 M K A[2] : 5 i : 2 Call by name
22
3. 매개변수 전달 방법 (7) 22 procedure proc(InPamter : integer, var OutPameter : ingeter); begin … end; void proc(int in_pamter, int *out_pamter) { … } Call by valueCall by reference
23
3. 매개변수 전달 방법 (8) JAVA 의 함수 인자 전송 ▫ Call by value 정수형, 실수형, 문자형, boolean 형 변수 ▫ Call by reference 문자열, 배열, 객체 변수 23
24
3. 매개변수 전달 방법 (9) 형식 인자 명시 방법 ▫ 함수의 원형 표시, function prototyping ▫ 컴파일러에게 많은 정보 제공 오류 검사 ▫ C, Pascal, Ada: 모든 형식 인자의 자료형, 반환값의 자 료형 선언 ▫ 함수의 원형 (function prototype) 서브 프로그램 이름 인자형 반환값 24
25
3. 매개변수 전달 방법 (10) 25 class P { public void change(int i, int j[]) { i = 12; j[0] = 12; } class M { public static void main(String args[]) { P p1 = new P(); int a = 4; int b[] = {1, 2}; p1.change(a, b); System.out.println( a + “ ” b[0] + “ ” + b[1]); } #include int big = 48; void add(int *, int *); // 함수 선언 void main() { int i = 2; add(&i, &big); printf(“i = %d big = %d\n”, i, big); } void add(int *a, int *b) // 함수 정의 { big += 10; *a += 2; *b += 4; }
26
배열의 전달 ▫ Call by value: copy cost ▫ Call by reference: 변경된 값의 반환 용이 레코드형 변수의 전달 (C 의 구조체 ) ▫ Call by reference 서브 프로그램을 인자로 전달 ▫ 서브 프로그램의 이름 + 인자 ▫ Pascal, C, C++, … 함수 중복 (function overloading) ▫ 동일한 함수 이름 + 다른 매개변수 리스트 여러 가지 기능 26 4. 복잡한 자료의 전달 (1)
27
4. 복잡한 자료의 전달 (2) 27 123 123 1123 456 d 의 주소 d l 4126 c k program sample; type vect = array[1..3] of integer; var c, d : vect; m : integer; begin c[1] := 1 c[2] := 2; c[3] := 3; d[1] := 4 d[2] := 5; d[3] := 6; CA(c, d); for m := 1 to 3 do write(c[m]); for m := 1 to 3 write(d[m]); procedure CA(k : vect, var l : vect); var n : integer; begin k[2] := 12; l[2] := 12 end;
28
4. 복잡한 자료의 전달 (3) 28 #include int Add(int size, int a[]) { int i, sum = 0; for (i = 0; i < size; i++) sum += a[i]; // *(a+i) a[0] = 20; // *a return sum; } void main() { int i, b[3]; b[0] = 2; b[1] = 4; b[2] = 8; printf(“the sum = %d\n”, Add(3, b)); for (i = 0; i < 3; i++) printf(“%d ”, b[i]); printf(“\n”); }
29
4. 복잡한 자료의 전달 (4) 29 #include struct colors { char c1[10]; char c2[10]; char c3[10]; }; void p_color(struct colors x) { printf(“color = %s %s %s\n”, x.c1, x.c2, x.c3); } void sub(struct colors *s) { strcpy(s c1, “cyan”); strcpy(s c2, “magenta”); strcpy(s c3, “brown”); } void main() { struct colors col = { “red”, “green”, “blue” }; p_color(col); sub(&col); p_color(col); }
30
4. 복잡한 자료의 전달 (5) 30 #include int add(int a, int b) { return a + b;} int mul(int a, int b) { return a * b;} int sub(int a, int b) { return a – b;} int process(int (*pf)(int, int), int x, int y) { return (*pf)(x, y); } void main() { printf(“add = %d\n”, process(add, 8, 4)); printf(“multiply = %d\n”, process(mul, 8, 4)); printf(“subtract = %d\n”, process(sub, 8, 4)); }
31
4. 복잡한 자료의 전달 (6) 31 #include double square(double f) { return f * f; } int square(int a) { return a * a; } void main() { cout << square(2) << “\n”; cout << square(2.4) << “\n”; }
32
4. 복잡한 자료의 전달 (7) Java 의 경우 ▫ 자바 함수 (method) 는 독자적으로 존재하지 않고 class 안에서만 존재한다. 32 class Square { int width; int depth; void set() { width = 1; depth = 1; } void set(int a, int b) { width = a; width = b; } public static void main(String args[]) { Square s = new Square(); a.set(); System.out.println(s.witdh + “ ” + s.depth); a.set(12, 12); System.out.println(s.witdh + “ ” + s.depth); }
Similar presentations