Chapter 7 서브프로그램. Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2.

Slides:



Advertisements
Similar presentations
Copyright © 2015 Pearson Education, Inc. 6 장 : 프로그래밍 언어.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
C++ Espresso 제2장 제어문과 함수.
9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호.
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
컴퓨터 프로그래밍 기초 [Final] 기말고사
제7장 제어구조 I – 식과 문장.
7장 배열 ②.
Part 08 함수 ©우균, 창병모 이 슬라이드는 부산대학교 우균이 작성하였습니다. 오류나 수정할 사항 있으면 연락 주세요.
제4장 블록 및 유효범위 Reading Chap. 5 © 숙대 창병모.
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Visual Basic 함수.
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
6주차: Functions in C and Others
23장. 구조체와 사용자 정의 자료형 2.
Lesson 7. 클래스와 메소드 - 1.
14장. 포인터와 함수에 대한 이해.
KIM HEESANG PL/SQL 2 KIM HEESANG
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
13. 연산자 오버로딩.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
Method & library.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
제 10장 부 프로그램 10.1 개요 10.2 매개 변수 평가와 전달 기법 10.3 형식 매개 변수 명세
Chapter 10 함수 기본.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Chapter 4 변수 및 바인딩.
Chapter 02. 소프트웨어와 자료구조.
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호.
Fucntion 요약.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
Signature, Strong Typing
Signature, Strong Typing
제 6 장 함수(functions).
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
Signature, Strong Typing
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
7주차: Functions and Arrays
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
함수 정의, void 자료형 함수 원형선언 함수 호출 변수 영역 규칙 재귀 함수
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Chapter 7 서브프로그램

Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2

1. 서브 프로그램의 정의 (1) 서브 프로그램의 사용 이유 ▫ 프로그램의 크기를 줄임 ▫ 모듈화 프로그래밍 (modular programming) 원칙  프로그램을 보다 작고 이해할 수 있는 단위로 나누어 작성 ▫ 프로그램의 가독성, 유지 보수 서브 프로그램 (sub program) 명칭 ▫ 함수 (function) ▫ 프로시저 (procedure) ▫ 서브루틴 (subroutine) 3

1. 서브 프로그램의 정의 (2) 서브 프로그램의 요소 ▫ 이름 ▫ 매개변수 리스트 ▫ 몸체 (body) ▫ 참조 환경 (reference environment) 4 procedure p_name (parameter list) local variable declaration part begin body end;

1. 서브 프로그램의 정의 (3) 서브 프로그램의 명시 ▫ 서브 프로그램의 호출  이름  인자의 수와 인자의 유형  반환 값의 수와 유형  서브 프로그램에서 수행하는 기능 : what not how  abstraction 5 function gcd (m, n : integer) : integer ;

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

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

1. 서브 프로그램의 정의 (6) 블록 구조 ▫ Algol ▫ 이름있는 블록 ( 서브 프로그램 ), 이름 없는 블록 ▫ Block = 선언부 + 실행부 ▫ Pascal ▫ C ▫ PL/I, Ada, C++, … ▫ 정적 영역 규칙 9 이름 없는 블록을 허용하지 않음 중첩 블록 구조 허용 이름 없는 블록을 허용 중첩 블록 구조 허용하지 않음

1. 서브 프로그램의 정의 (7) ▫ 블록 구조의 특성  시작 부분에서 지역 변수 선언 : 외부에서는 참조 못함  정보 은닉 (information hiding)  블록 실행시 지역 변수를 위한 메모리 할당  실행 종료시 회수  변수명 참조 : 가장 안쪽의 블록에서 선언된 이름의 변수 사용  이름을 가진 블록만이 호출될 수 있다 : 블록 내부의 서브 프로그램은 외부에서 호출할 수 없다  블록은 외부로부 터 감추어진다. 10

1. 서브 프로그램의 정의 (8) ▫ 사용 가능한 변수 및 프로시저 ( 참조 환경 )  Area (a): a, b, c, p1, p2, outer, inner  Area (b): a, b, p1, outer, inner  Area (c): a, outer 11

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 영역

실인자 (actual parameter) ▫ 서브 프로그램에게 전달되는 실제 값을 저장하고 있는 인자, result := gcd (a, b); 형식 인자 (formal parameter) ▫ 함수 선언에 사용하는 인자 ▫ function gcd(m, n : integer) : integer ; 실인자와 형식 인자의 대응 ▫ 위치에 의한 대응 형식 인자와 실인자 (1) 실인자 fun (&a, b, 1) 형식인자 void fun (int *a, int b, int c)

▫ 이름에 의한 대응  Ada  형식 인자와 실인자의 이름이 같아야 한다 형식 인자와 실인자 (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

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”; }

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

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

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

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; }

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; }

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

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

3. 매개변수 전달 방법 (8) JAVA 의 함수 인자 전송 ▫ Call by value  정수형, 실수형, 문자형, boolean 형 변수 ▫ Call by reference  문자열, 배열, 객체 변수 23

3. 매개변수 전달 방법 (9) 형식 인자 명시 방법 ▫ 함수의 원형 표시, function prototyping ▫ 컴파일러에게 많은 정보 제공  오류 검사 ▫ C, Pascal, Ada: 모든 형식 인자의 자료형, 반환값의 자 료형 선언 ▫ 함수의 원형 (function prototype)  서브 프로그램 이름  인자형  반환값 24

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; }

배열의 전달 ▫ Call by value: copy cost ▫ Call by reference: 변경된 값의 반환 용이 레코드형 변수의 전달 (C 의 구조체 ) ▫ Call by reference 서브 프로그램을 인자로 전달 ▫ 서브 프로그램의 이름 + 인자 ▫ Pascal, C, C++, … 함수 중복 (function overloading) ▫ 동일한 함수 이름 + 다른 매개변수 리스트  여러 가지 기능 복잡한 자료의 전달 (1)

4. 복잡한 자료의 전달 (2) 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;

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”); }

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

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

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”; }

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