Presentation is loading. Please wait.

Presentation is loading. Please wait.

9장 부프로그램(2) 2017. 5. 24 순천향대학교 컴퓨터공학부 하 상 호.

Similar presentations


Presentation on theme: "9장 부프로그램(2) 2017. 5. 24 순천향대학교 컴퓨터공학부 하 상 호."— Presentation transcript:

1 9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호

2 목차 부프로그램 개념 매개변수 부프로그램 설계시 고려사항 매개변수 전달 방법 중복 부프로그램 포괄형 부프로그램

3 부프로그램 설계시 고려사항 지역변수는 정적 또는 동적으로 할당되는가? 부프로그램이 중첩되어 정의 가능한가?
어떤 매개변수 전달방법이 사용되는가? 매개변수 타입 검사가 이루어지는가? 부프로그램이 매개변수로 전달되고 부프로그램이 중첩된다면, 전달된 부프로그램의 참조환경은 무엇인가? 부프로그램은 중복될 수 있는가? 부프로그램이 포괄형이 될 수 있는가? 언어가 중첩 부프로그램을 허용한다면, 클로저는 지원되는가? 클로저(closure)는 중첩 부프로그램과 그 참조 환경이다.

4 매개변수 전달의 의미적 모델 모델 설명 입력 모드(in mode) 형식 매개변수는 실 매개변수로부터 데이터 전달받음 출력 모드(out mode) 형식 매개변수는 실 매개변수에 데이터를 전달함 입출력 모드(inout mode) 형식 매개변수는 실 매개변수로부터 데이터를 전달받고, 데이터를 실 매개변수에 전달함 예제: fun(list1, list2) // list1, list2의 배열을 더하여 그 결과를 list2로 반환 입력 모드 입출력 모드

5 매개변수 전달의 데이터 이동 방법

6 매개변수 전달의 구현 모델

7 값-전달 값-전달(pass-by-value)은 매개변수가 값으로 전달되는 입력 모드의 구현
형식 매개변수는 대응 실 매개변수의 값으로 초기화 형식 매개변수는 지역변수로 사용 데이터 이동 물리적 값 이동(값 복사) => 일반적 접근 패스 전달 쓰기-보호 셀(읽기만 가능한 셀) 필요 Ex. C++ int fun(int a, const int &b) { … }

8 값 전달 장점: 단점 스칼라 변수의 경우 연결 비용과 접근 시간이 빠르다 부프로그램의 외부 데이터 접근 제한
값 복사가 사용될 경우에, 형식 매개변수에 대한 기억공간 할당, 값 복사에 따른 비용 부담. 특히, 배열과 같은 집합체의 경우 접근 패스 전달 경우, 형식 매개변수에 대한 쓰기-보호가 요구되고, 간접 주소지정에 따른 접근 비용 부담

9 결과-전달 결과-전달(pass-by-result)은 출력 모드의 구현 실 매개변수는 형식 매개변수에 값을 전달하지 않으며,
형식 매개변수는 지역 변수로 사용되고, 피호출자 종료 전에 형식 매개변수의 값을 대응 실 매개변수로 전달 데이터 이동은 보통 값 복사로 구현 Ex. C# 실 매개변수가 동일하면? // a, b의 값은 호출전에 할당될 필요없음 f.Fixer(out a, out b); void Fixer(out int x, out int y) // x, y의 값은 반드시 할당되어야 함 { x = 17; y = 35; }

10 결과-전달 고려사항 실매개변수에 값의 복사 순서는? 실 매개변수의 주소가 언제 평가되는가 Ex. In C#
sub가 DoIt()에서 변경되면? void Fixer(out int x, out int y) { x = 17; y = 35; } f.Fixer(out a, out a); void DoIt(out int x, int index) { x = 17; index = 42; } sub = 21; f.DoIt(list[sub], sub)

11 값-결과-전달 값-결과-전달(pass-by-value-result)은 값이 복사되는 입출력 모드의 구현 예제
값-전달과 결과-전달의 혼합 복사-전달(pass-by-copy)이라고 함 예제 int main() { x = 10; y = 20; sub(x, y); } void sub(int a, int b) { a = 20; b = 30; }

12 참조 전달 참조-전달(pass-by-reference)은 입출력 모드의 구현 접근 패스(주로 주소)를 전달
공유-전달(pass-by-sharing)이라고 함 Ex. C# int main() { x = 10; y = 20; sub(ref x, ref y); } void sub(ref int a, ref int b) { a = 20; b = 30; }

13 참조 전달 평가 전달과정 자체가 시간과 기억장소 관점에서 효율적 형식 매개변수 접근은 효율적인가?
한 방향 전달만 요구될 경우에는? 별칭 생성 가능한가?

14 참조 전달 별칭 생성: 실 매개변수간의 충돌 void fun(int &first, int &second)
… fun(total, total) void fun(int &first, int &second) { … }

15 참조 전달 별칭 생성: 배열 원소간의 충돌 void fun(int &first, int &second)
… fun(list[i], list[j]) // if i=j? void fun(int &first, int &second) { … } … fun(list[i], list)

16 참조 전달 별칭 생성: 형식 매개변수와 가시적 비지역변수간의 충돌 int *global; void main() { …
sub(global); } void sub(int *param) { … }

17 이름 전달 실 매개변수는 부프로그램에 나타나는 모든 대응 형식 매개변수를 문자 그대로 대치 평가
형식 매개변수에 대한 실 매개변수의 값이나 주소에 대한 바인딩은 그 형식 매개변수가 참조될 때까지 연기 형식 매개변수는 호출자 참조 환경에서 평가 => 클로저(부프로그램/참조 환경) 필요 단일의 매개변수 전달 구현 모델에 일치하지 않음 상수 식 => 값-전달 스칼라 변수 => 참조-전달 배열 원소인 경우? 평가 구현하기 어렵고 비능률적 판독성/신뢰성 저하 지연 바인딩 / 지연 평가 => 반드시 필요한 매개변수만 평가

18 이름 전달 예제 void sub(int x, int y, int z) { … int p; a = 2;
sub(a, a+1, 10); void sub(int x, int y, int z) { int p; p = y; // p의 값은? x = z; }

19 Test 다음 각 매개변수 방법에 대한 프로그램 실행 결과는 무엇인가? 값-전달 참조-전달 값-결과-전달 이름-전달
int i; int a[2]; void p(int x, int y) { x++; i++; y++;} main() { a[0] = 1; a[1]= 1; i = 0; p(a[i], a[i]); printf(“%d %d\n”, a[0], a[1]); return 0; }

20 매개변수 전달방법 구현 대부분의 언어에서, 매개변수 전달은 실행-시간 스택을 통해서 일어난다.
sub(int a, int b, int c, int d) 값, 결과, 값-결과, 참조 sub(w, x, y, z)

21 주요 언어의 매개변수 전달 방법 언어 매개변수 전달 방법 C 값-전달 참조-전달은? C++ C와 유사
참조-전달을 위해서 참조 타입 제공 Java 객체 매개변수는? C# 디폴트는 값-전달 참조-전달시, 실, 형식 매개변수 앞에 ref 명세 결과-전달시, 실, 형식 매개변수 앞에 out 명세 Ada 3가지 의미적 모델 지원: in(디폴트 모드), out, in out in 매개변수 out 매개변수 in out 매개변수 Fortran 입출력 모드의 의미적 모드만 명세 77 버전 이전: 참조-호출 77 버전 이후: 스칼라 변수에 대해서는 값-결과-전달

22 주요 언어의 매개변수 전달 방법 // in C++
void fun(const int &p1, int p2, int &p3) {…} // in Ada procedure Adder(A: in out Integer; // 스칼라는 복사로 전달 B: in Integer; // 집합체는 참조로 전달 C: out Float) // in Fortran 95+ Subroutine Adder (A, B, C) Integer, Intent(Inout) :: A Integer, Intent(In) :: B Integer, Intent(Out) :: C // in C# void sumer (ref int oldSum, int newOne, out res) sumer(ref sum, newValue, out res); // sum은 반드시 초기화 필요

23 매개변수의 타입 검사 실 매개변수의 타입과 대응 형식 매개변수의 타입과의 일치(consistency) 여부 검사
신뢰성을 위해서 매우 중요

24 매개변수의 타입 검사 주요 언어의 매개변수 타입 검사 Fortran 77, 원본 C: 요구되지 않음
Pascal, Fortran 90, Java, Ada: 항상 요구됨 C89: 사용자에 의한 선택 C99, C++ 항상 프로토타입 형식으로 표현해야 함 매개변수 리스트의 마지막 부분이 생략 기호이면? 비 프로토타입 형식 프로토타입 형식 int printf(const char* format_string, ...); printf("The sum is %d\n", 3.4); printf(“The string is %s\n”, 10); printf(Two integers are %d, %d\n”, 10);

25 매개변수의 타입 검사 실 매개변수 float 값을 double 형식 매개변수에 전달하는 함수 호출을 생각해보자.
매개변수가 값-호출로 전달될 경우? 매개변수가 참조-호출로 전달될 경우? float f = 10.5; fun(&f); // what’s the problem in C, C++? void fun(double *d) { *d = *d + 10; } // in C# ref의 실 매개변수는 대응 형식 매개변수의 타입과 정확히 일치해야 할 것을 요구한다(타입 강제변환이 허용되지 않음)

26 매개변수로서의 다차원 배열 컴파일러는 배열 원소 참조에 대한 기억장소 사상 함수 구성
다차원 배열이 부프로그램에 전달되고, 그 부프로그램이 개별 컴파일가능하면, 부 프로그램 텍스트만으로 기억장소 사상함수 구성하는데 필요한 배열 크기 정보 요구 생략 가능한 배열 첨자는? Void fun(int matrix[10][20]) { …}

27 매개변수로서의 다차원 배열 다차원 배열이 부프로그램에 전달되고, 그 부프로그램이 개별 컴파일가능한 경우 Recall that
배열의 첫번째 첨자를 제외한 모든 배열 크기 정보 포함 요구 주소(a[i,j]) = 주소(a[0,0]) + ((i번째 행보다 앞선 행의 개수)*(열의 크기) + (j번째 열의 왼쪽에 위치한 원소 개수) *원소_크기

28 매개변수로서의 다차원 배열 C/C++에서, 배열 매개변수에서 열의 크기만 다를 경우에?
각 경우에 대해서 별도의 함수를 작성해야 하는가? 한 개의 함수로 작성할 수 있는 방법이 있는가? (유연한 부프로그램 작성이 가능한가?) void fun(int matrix[][10]) { …} void fun(int matrix[][20])

29 매개변수로서의 다차원 배열 C/C++에서, 배열 매개변수에서 열의 크기만 다를 경우에? In Java?
행렬을 포인터로, 행렬의 실제 차원을 매개변수로 전달하라. In Java? void fun(int *mat_ptr, int num_rows, int num_cols) { // mat_ptr[i][j]의 표현은 // *(mat_ptr + (i * num_cols) + col)

30 매개변수로서의 다차원 배열 In Java/C# 여기서는 배열은 객체 배열은 모두 1차원이고, 원소가 배열이 될 수 있고,
각 배열은 객체 생성시에 그 길이로 설정된 length(Length in C#) 포함 float sumer(float mat[][]) { float sum = 0.0f; for (int row = 0; row < mat.length; row++) { for (int col = 0; col < mat[row].length; col++) { sum += mat[row][col]; }

31 매개변수 전달 고려사항 2가지 중요한 고려사항 효율성
데이터 이동에서 단방향과 양방향의 선택 (기준: 데이터의 부프로그램 접근 최소화)


Download ppt "9장 부프로그램(2) 2017. 5. 24 순천향대학교 컴퓨터공학부 하 상 호."

Similar presentations


Ads by Google