• 검색 결과가 없습니다.

• 매개변수 전달 방법

N/A
N/A
Protected

Academic year: 2022

Share "• 매개변수 전달 방법"

Copied!
23
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

9장 부프로그램(Subprogram)

1

(2)

목차

• 부프로그램 개념

• 부프로그램 설계시 고려사항

• 매개변수 전달 방법

• 중복 부프로그램

• 포괄형 부프로그램

2

(3)

Parameter passing

3

(4)

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

4

a의 주소

(5)

매개변수 전달(parameter passing)의 구현 모델

5

(6)

call by-value(값-전달)

• 입력 모드의 구현

– 실 매개변수의 값이 형식 매개변수로 전달 – 형식 매개변수는 지역변수로 사용

– Ex. In C

– return한 결과, 실 매개변수는 영향을 받지 않는다. 6

main() { void swap(int a, int b) { . int temp;

. x temp=a;

x=10; a=b;

y=20; y b=temp;

swap(x, y); } printf( … x, y);

}

10 20

10 20 10

a b temp

20 10

(7)

값 전달

• 평가

– 장점:

• 스칼라 변수(값만 존재하는 변수)의 경우 전달 비용과 접근 시간이 효율적

• 부프로그램의 변화로부터 호출 프로그램이 보호를 받는다.

– 단점

• 배열과 같은 구조체의 경우? => 일일이 값을 전달해야 하기 때문에 매우 비효율적

7

(8)

call by-result(결과-전달)

• 출력 모드의 구현

– 실 매개변수는 형식 매개변수에 값을 전달하지 않으며, – 형식 매개변수는 지역 변수로 사용되고,

– 피호출자 종료 전에 형식 매개변수의 값을 대응 실 매개변수로 전달

• 예제

8

int main() {

sub(x, y);

… }

void sub(int a, int b) {

a = 20; b = 30;

20 }

30

x y

(9)

결과-전달

• 실 매개변수가 충돌하면? => 매우 위험

9

int main() {

sub(x, x);

… }

void sub(int a, int b) {

a = 20; b = 30;

}

? x

(10)

결과-전달

• 실 매개변수의 주소가 언제 평가되는가?

10

- call 하기 전에 미리 실 매개변수의 주소가 결정되면 관계 없지만, 매우 위험 Index가 sub()

에서 변경되면?

void sub(int k) {

index = 5;

} int main()

{

index = 2;

sub(list[index]);

… }

index 2

list[2] k

(11)

call by-value and result(값-결과-전달)

• 입출력 모드의 구현

값-전달과 결과-전달의 혼합

• 실 매개변수는 대응 형식 매개변수로 초기화

• 형식 매개변수는 지역 변수로 사용

• 부프로그램 종료시에 형식 매개변수는 대응 실 매개변수로 전달 복사-전달(pass-by-copy)라고 함

예제

11

int main() {

x = 10; y = 20;

sub(x, y);

… }

void sub(int a, int b) {

a = 20; b = 30;

}

10

20

x y

10

20

a b

20

30 30 20

(12)

값-결과-전달

• 평가

– 값-전달, 결과-전달의 문제점 공유

12

(13)

call by-reference(참조 전달)

• 출력 모드의 구현

– 실 매개변수의 주소가 형식 매개변수로 전달

– 형식 매개변수의 변화가 바로 실 매개변수를 변화시킴 – Ex. In C

13

int main() {

x = 10; y = 20;

sub(&x, &y);

… }

void sub(int *a, int *b) {

a = 20; b = 30;

}

10

20

x y

x의 주소

a

30 b

20

y의 주소

(14)

참조 전달

• 실 매개변수가 충돌 되면? => 매우 위험

14

int main() {

x = 10;

sub(&x, &x);

… }

void sub(int *a, int *b) {

a = 20; b = 30;

}

x 10 a x의 주소

b

20

x의 주소

30

- side-effect가 발생. 즉 함수 수행의 결과 formal parameter의 변화가 바로 actual parameter에 영향을 줌

(15)

참조 전달

• 전역변수가 형식 매개변수로 사용되면? => 매우 위험

15

int global;

int main() {

x = 10;

sub(global);

… }

void sub(int a) {

… }

10

global

x

global의

a 주소

- global 변수는 모든 함수에서 공유하는 것.

- sub()를 수행하고 나니 바뀌었다. => side-effect

(16)

참조 전달

• 평가

– 출력모드에서는 매우 효과적

– 그러나 side-effect가 발생한다.

16

(17)

Test

• 다음 각 매개변수 방법에 대한 프로그램 실행 결과는?

– 값-전달(by-value)

– 참조-전달(by-reference)

– 값-결과-전달(by-value and result) – 이름-전달(by-name)

17

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;

}

(18)

18

1

1

x y

1 1

a[0]

a[1]

2 2

P(): Global:

i 0

main():

1

1) call by-value

Print 결과: a[0] = 1 a[1] = 1

1

1

x y

1 1

a[0]

a[1] 2

2 2

P(): Global:

i 0

main():

1

2) call by-value and result

Print 결과: a[0] = 1 a[1] = 2

a[0]의 주소 a[0의 주소

x y

1 1

a[0]

a[1]

2

P(): Global:

i 0

main():

1

3) call by-reference

Print 결과: a[0] = 3 a[1] = 1

xy 1

1

a[0]

a[1]

2

P(): Global:

i 0

main():

1

4) call by-name : 이름이 대치

Print 결과: a[0] = 3 a[1] = 1

3 3

2

(19)

매개변수 전달방법 구현

• 대부분 언어에서 매개변수 전달은 스택 이용

19

sub(w, x, y, z) sub(int a, int b, int c, int d)

값, 결과, 값-결과, 참조

caller: callee:

(20)

주요 언어의 매개변수 전달 방법

언어 매개변수 전달 방법

C 디폴트는 값-전달, 참조-전달은? => 포인터 사용

C++ C와 유사, 참조-전달은? => &사용

Java 디폴트는 값-전달, 참조-전달은? => new로 생성한 객체를 파라메터로 넘길때

C# 디폴트는 값-전달, 참조-전달은? => ref 키워드 사용 Ada 3가지 의미적 모델 지원: in, out, inout

Pascal 디폴트는 값-전달, 참조-전달은 var 키워드 사용 Fortran 77 버전 이전: 참조-전달

77 버전 이후: 스칼라 변수에 대해서는 값-결과-전달 Algol W 값-결과-전달

Algol 60 디폴트는 이름-전달, 값-전달은 선택적

20

(21)

C와 C++의 call by-reference 비교

in C : call by-reference with pointer in C++ : call by-reference with reference

21

main() { . . x=10;

y=20;

swap(&x, &y);

printf( … x, y);

}

void swap(int *a, int *b) { int temp;

temp=*a;

*a=*b;

*b=temp;

}

main() { . . x=10;

y=20;

swap(x, y);

cout << x << y ; }

void swap(int &a, int &b) { int temp;

temp=a;

a=b;

b=temp;

}

(22)

주요 언어의 매개변수 전달 방법

22

// in C++

void fun(const int &p1, int p2, int &p3) {…}

// in Ada

procedure Adder(A: inout integer;

B: in integer;

C: out float) // in Pascal

adder(a, b: integer; var c: integer) // in C#

void sumer (ref int oldSum, int newOne, out res)

sumer(ref sum, newValue, out res);

(23)

매개변수의 타입 검사

• 실 매개변수의 타입과 대응 형식 매개변수의 타입 과의 일치(consistency) 여부 검사

• 신뢰성을 위해서 매우 중요

23

참조

관련 문서

골다공증은 성별 연령 체중 흡연 여부 등에 따라서도 영향을 받기 때문에 본 , , , 연구에 등록된 환자를 대상으로 골다공증점수와의 관계를 단순상관관계 분석으로

노인의 특성과 의식 변화 ■  지난 노인실태조사결과와 비교한 결과 정책방향과 정책대상자 설정에 영향을 미치는 다양한 특성 변화가 나타났음 ■

요약 및 결론 이 연구는 기상변화가 배추 ·무 생산에 미치는 영향을 분석하기 위하여 계절별 이상기상이 배추· 무 단수에 어떠한 영향을 미치는지

비교적 기하학적 형상이 복잡한 폐수처리용 원심펌프의 표면 거칠기 변화가 유동 해석 결과에 미치는 영향을 평가하였다 그리고 실제 해석 대상 펌프를 사용한 실험 결과

MSG 안전에 관한 교육이 MSG 안전 지식에서 유의적인 효과가 나왔기 때문에, 실험집단에서 MSG 안전 지식 변화가 식품안전태도 변화에 미 치는 영향을

넷째, 웰니스 구성요인이 삶의 질과 주관적 행복감에 영향을 미치듯이 삶의 질이 주관적 행복감에도 영향을 미치는지 분석한 결과 매우 유의미한 영향을

그 결과, 측정모형과 구조모형이 자료에 적합한 것으로 나타났다. 구체적으로 살펴 보면 가족지지는 자기효능감에 직접적으로 유의한 영향을 미쳤고,

1.. 그 결과 지지적 부부공동양육은 아동의 공격성에 영향을 미친 반면, 비난적 부부공동양육은 아동 의 공격성에 유의한 영향을 미치지 않았다.