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

Slides:



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

03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어론 2nd edition Tucker and Noonan 5 장 타입 “ 타입은 컴퓨터 프로그래밍의 효소이다 ; 프로그래밍은 타입을 통해 소화할만한 것이 된다.” 로빈.
Chapter 7 서브프로그램. Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2.
구조체 : Structure 와 포인터 2. 집합적 변수 생성 가능 structure_declaration ::= struct_specifier declarator_list ; struct_specifier ::= struct tag_name | struct tag_name.
제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수.
데이터의 표현과 연산 (1) (Chapter 3)
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 3장 프로그래밍 언어 설계 3.1 설계 기준의 역사적 변천 3.2 효율성 3.3 일반성, 직교성, 획일성
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
C 개론 정리.
제 2 장 배열과 스트링.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
제7장 제어구조 I – 식과 문장.
C 10장. 함수의 활용 #include <stdio.h> int main(void) { int num;
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
컴퓨터의 기초 제 4강 - 표준 입출력, 함수의 기초 2006년 4월 10일.
6장. printf와 scanf 함수에 대한 고찰
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 14. 포인터와 함수에 대한 이해.
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
제 3 장. 배열과 구조체 및 포인터.
HW#2 #1과 동일한 방법으로 argc와 argv를 사용함
8장 포인터.
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
프로그래밍 서울대학교 통계학과 2009년 2학기 컴퓨터의 개념 및 실습 (
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
프로그래밍2 및 실습 C언어 기반의 C++ 2.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
제 10장 부 프로그램 10.1 개요 10.2 매개 변수 평가와 전달 기법 10.3 형식 매개 변수 명세
Chapter 10 함수 기본.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
6장 데이터 타입(2) 순천향대학교 컴퓨터공학부 하 상 호.
[CPA340] Algorithms and Practice Youn-Hee Han
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Chapter 11. 배열과 포인터.
Part 09 배열 안산1대학 디지털정보통신과 임 성 국.
Chapter 4 변수 및 바인딩.
제 3장 데이터형과 연산자 Hello!! C 언어 강성호 김학배 최우영.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
Part 06 세상을 변화시키는 연산자 안산1대학 디지털정보통신과 임 성 국.
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
C-언어와 기반구조 정보보호학과 이정수 교수.
9장 부프로그램(2) 순천향대학교 컴퓨터공학부 하 상 호.
adopted from KNK C Programming : A Modern Approach
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Chapter 3 – 프로그래밍 언어 설계 Outline 3.1 설계 기준의 역사적 변천 3.2 효율성
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
어서와 C언어는 처음이지 제16장.
C.
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
배열, 포인터, 함수 Review & 과제 1, 2.
9장 부프로그램 순천향대학교 컴퓨터공학부 하 상 호.
Presentation transcript:

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

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

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

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

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

매개변수 전달의 구현 모델

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

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

결과-전달 결과-전달(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; }

결과-전달 고려사항 실매개변수에 값의 복사 순서는? 실 매개변수의 주소가 언제 평가되는가 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)

값-결과-전달 값-결과-전달(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; }

참조 전달 참조-전달(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; }

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

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

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

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

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

이름 전달 예제 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; }

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

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

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

주요 언어의 매개변수 전달 방법 // 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은 반드시 초기화 필요

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

매개변수의 타입 검사 주요 언어의 매개변수 타입 검사 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);

매개변수의 타입 검사 실 매개변수 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의 실 매개변수는 대응 형식 매개변수의 타입과 정확히 일치해야 할 것을 요구한다(타입 강제변환이 허용되지 않음)

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

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

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

매개변수로서의 다차원 배열 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)

매개변수로서의 다차원 배열 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]; }

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