7. 부프로그램 -...

25
I T 2014 소프트웨어공학연구실 7. 부프로그램

Upload: others

Post on 29-Jan-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

대 구 가 톨 릭 대 학 교

I T 공 학 부

Ⓒ2014 소프트웨어공학연구실

7. 부프로그램

Page 2: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

목 차 2

7.1 개요

7.2 매개변수전달기법

7.3 중복 부프로그램

7.4 포괄 부프로그램

Page 3: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

3

7.1 개요(1)

부프로그램(subprogram)

프로그램에서 호출에 의해 실행되도록 만들어진 일련의 코드

한 프로그램 안에서 반복적으로 실행되거나 여러 프로그램에서 공통적으로 실행되는 기능들을 부프로그램으로 하여 사용할 때 유용

기능A를 여러 번 실행하는 기능A를 하나의 단위로 만든 프로그램 구조 프로그램 구조

Page 4: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

4

7.1 개요(2)

부프로그램의 종류

프로시저 : 값을 반환하지는 않고 부작용을 만듦

함수 : 값을 반환하고 부작용은 없음

C 언어 --> 프로시저와 함수를 별도로 구분하지 않음

FORTRAN의 프로시저

호출 : CALL COPYSUB(K, L, I)

SUBROUTINE COPYSUB(A, B, N)

INTEGER A(N), B(N)

DO 10 I = 1, N

A(I) = B(I)

CONTINUE

RETURN

END

- FORTRAN의 함수

호출 : I = ADD(K, L)

INTEGER FUNCTION ADD(A, B)

ADD = A + B

RETURN

END

Page 5: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7.1 개요(3)

Ada의 프로시저

Ada의 함수 : 정의 형식

C 언어

프로시저와 함수를 별도로 구분하지 않으므로

--> 함수처럼 값을 반환하려면 함수 이름 왼쪽에 반환하는 값의 타입을 쓰면 됨

값을 반환하지 않으려면 void 사용

5

procedure incre(x, y: in out integer) is begin x := x + 1; y := y + 1; end incre;

function 함수이름(매개변수) return 반환값타입 is begin return 반환값; end 함수이름;

int add(int x, int y) { return x+y; }

Page 6: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

6

7.1 개요 (4)

부프로그램 정의

부프로그램이 실행할 내용을 기술한 일련의 코드

머리부(header)와 본체(body)로 구성

머리부(header) : 부프로그램임을 나타내는 예약어, 부프로그램의 이름, 매개변수들의 이름과 타입, 반환 값의 타입 등을 기술

예) Pascal 부프로그램의 머리부

부프로그램 정의 예

FORTRAN ▪ C

SUBROUTINE SUB(K, L)

IF(K .GT. L) THEN

PRINT *, K

ELSE

PRINT *, L

ENDIF

RETURN

END

void sub(int k, int l)

{

if(k > l)

printf("%d\n", k);

else

printf("%d\n", l);

}

procedure sub(var k,l: integer);

Page 7: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7

7.1 개요(5)

부프로그램 선언

부프로그램이 정의되어 있다는 것을 컴파일러에게 알리는 역할

부프로그램의 머리부는 제공하지만 부프로그램 몸체를 포함하진 않음

C 언어 부프로그램 선언의 예

부프로그램 호출

호출되는 부프로그램을 실행하라는 명령

부프로그램 호출 예

FORTRAN

Pascal과 C

CALL SUB(I, J)

sub(i, j)

void sub(int, int);

Page 8: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7.2 매개변수 전달 기법(1)

매개변수(parameter) 실 매개변수 (actual parameter)

부프로그램에게 전달되는 실제 값을 저장하고 있는 인자 예) result := gcd (a, b);

형식 매개변수 (formal parameter) 부프로그램 선언에 사용하는 인자 예) function gcd(m, n : integer) : integer ;

예) C 언어

실 매개변수 : 호출 문장의 매개변수 i와 j

형식 매개변수 : 부프로그램 정의 머리부의 매개변수 x와 y

대부분의 언어에서 형식 매개변수와 실 매개변수의 대응은 위치에 의해서 이루어짐 => 위치 매개변수 방법

8

Page 9: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7.2 매개변수 전달 기법(2)

실 매개변수와 형식 매개변수의 대응 위치 매개변수 방법

위치에 따라 형식 매개변수와 실 매개변수를 대응하는 방법

대부분의 언어에서는 위치 매개변수 방법으로 매개변수의 대응이 이루어짐

키워드 매개변수 방법

호출 문장에서 실 매개변수와 대응되는 형식 매개변수의 이름을 지정할 수 있는 방법

Ada에서 키워드 매개변수 방법을 지원

호출 문장

Ada는 위치 매개변수 방법과 키워드 매개변수 방법을 혼합해서 사용가능

단, 키워드 매개변수를 사용하기 시작하면 끝까지 매개변수를 사용해야 함

9

procedure sub(koreanScore, mathScore, engScore: integer) is begin ⋮ end sub;

sub(i=>mathScore, j=>engScore, k=>koreanScore);

sub(i, j=>engScore, k=>mathScore);

위치 매개변수 방법을 적용한 i는 koreanScore와 대응, 키워드 매개변수 방법을 적용한 j는 engScore와, k는 mathScore와 대응

실 매개변수 fun (&a, b, 1)

형식 매개변수 void fun (int *a, int b, int c)

Page 10: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

10

7.2 매개변수 전달 기법(3)

매개변수를 이용하면, 호출 프로그램에서 부프로그램에게 어떤 정보를 전달할 수 있음

전달하는 방식에 따라 매개변수에 대한 해석이 달라짐

매개변수 전달 방식

1) call by value

2) call by reference

3) call by result

4) call by value-result

5) call by name

Page 11: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

11

7.2 매개변수 전달 기법(4)

Call by value (값에 의한 호출, 값 전달 방식)

실 매개변수의 값이 형식 매개변수에게 copy되어 사용

실 매개변수의 값을 형식 매개변수에 저장하고 형식 매개변수를

부프로그램의 지역 변수로 사용

형식 매개변수와 실 매개변수는 별도의 기억 공간 차지

형식 매개변수 값의 변화는 실 매개변수와 무관 -> 부작용을 일

으키지 않음

형식 매개변수에 대한 기억 장소가 반드시 할당되어야 하기 때문

에 배열과 같이 매개변수의 수가 많으면 기억 장소를 많이 차지

하고, 값을 복사하는 데도 많은 시간이 걸림

C, Java, C++, Ada의 in 매개변수

Page 12: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

12

7.2 매개변수 전달 기법(5)

예 : C 언어

예 : in 매개변수를 이용해서 값 전달을 보여주는 Ada 예

Ada in 매개변수의 특이점

: 값을 배정할 수 없음

[호출프로그램] ⋯ 01 a=10; b=20; 02 sub(a, b); 03 printf("%d %d", a, b); ⋯

[부프로그램] 01 void sub(int x, int y) 02 { 03 x=x+1; y=y+1; 04 printf("%d %d", x, y); 05 }

with TEXT_IO;

use TEXT_IO;

procedure inparameter is

package INT_IO is new TEXT_IO.INTEGER_IO (integer);

use INT_IO;

a, b: integer;

procedure sub(x, y: in integer) is

begin

put(x); put(y);

end sub;

begin

a := 10; b := 20;

sub(a, b);

end inparameter;

procedure sub(x, y: in integer) is begin x:=x+1; y:=y+1; put(x); put(y); end sub;

오류발생

Page 13: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

13

7.2 매개변수 전달 기법(6)

Call by reference (참조에 의한 호출, 참조 전달 방식)

실 매개 변수의 주소가 형식 매개 변수에게 전달

형식 매개변수와 실 매개변수는 동일 기억 공간 차지

형식 매개변수의 값이 변하면 실 매개변수의 값도 변함

형식 매개변수는 실 매개변수의 별명(alias)이 되어 형식 매개변수의

어떠한 변화도 실 매개변수에 그대로 반영

FORTRAN, C++(참조자 매개변수), C(포인터 매개변수)

Page 14: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7.2 매개변수 전달 기법(7)

참조자를 이용해서 참조 전달을 보여주는 C++ 예

포인터를 이용해서 참조 전달 효과를 내는 C 예

14

[호출프로그램] ⋯ 01 a=10; b=20; 02 sub(a, b); 03 printf("%d %d", a, b); ⋯

[부프로그램] 01 void sub(int &x, int &y) 02 { 03 x=x+1; y=y+1; 04 printf("%d %d", x, y); 05 }

[호출프로그램] ⋯ 01 a=10; b=20; 02 sub(&a, &b); 03 printf("%d %d", a, b); ⋯

[부프로그램] 01 void sub(int *x, int *y) 02 { 03 *x=*x+1; *y=*y+1; 4 printf("%d %d", *x, *y); 05 }

Page 15: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

15

7.2 매개변수 전달 기법(8)

Call by result (결과에 의한 호출, 결과 전달 방식)

호출 시, 어떤 값도 부 프로그램으로 전달되지 않고 접근 경로(access method)만 전달

호출 완료 시, 형식 매개변수의 값을 대응되는 실 매개변수에 copy

Ada의 out 매개변수

이 방식은 거의 사용되지 않음

Page 16: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

16

7.2 매개변수 전달 기법(9)

Call by value-result(값-결과 전달 방식)

호출 시, 실 매개변수의 값이 형식 매개변수로 copy

호출 완료 시, 형식 매개변수의 값이 실 매개변수에 다시 copy

call by reference와 비슷한 효과를 냄

call by reference와 차이점 : 별명(alias)을 만들지 않음

ALGOL 68, Ada의 in out 매개변수

예 : Ada

[호출프로그램] ⋯ 01 a=10; b=20; 02 sub(&a, &b); 03 put(a); put(b); ⋯

[부프로그램] 01 procedure sub(x, y:in out integer) is 02 begin 03 x:=x+1; y:=y+1; 4 put(x); put(y); 05 end sub;

Page 17: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

17

7.2 매개변수 전달 기법(10)

Call by name (이름에 의한 호출, 이름 전달 방식)

형식 매개변수의 이름이 사용될 때마다 그에 대응되는 실 매개변수의 이름으로 대치하는 방식

call by name 방식을 사용하는 부프로그램 동작은 형식 매개변수의 이름을 실매개변수의 이름으로 대치하여 실행한 결과와 같음

ALGOL 60

프로그램을 작성하기 어렵고 구현이 어려워 최근 대부분의 언어에서는 사용되지 않음

예 : ALGOL 60

[호출프로그램] ⋯ 01 a := 1; 02 n(1) := 1; 03 n(2) : = 2; 04 call sub(a, n(a)); ⋯

[부프로그램] 01 procedure sub(x, y) 02 integer x, y; 03 begin 04 x := x +1; 05 y := y +1; 06 end

04 a := a+1; 05 n(a) := n(a)+1;

Page 18: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7.2 매개변수 전달 기법(11)

예 1) call by value

call by reference

call by value-result

#include <stdio.h>

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

big : 48

i : 2

b

a

big : 62 big : 58

a : 4

big : 48

i : 2

b : 48

a : 2

b : 52

a : 4

big : 52

i : 4

big : 58

18

Page 19: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

19

7.2 매개변수 전달 기법(12)

call by name

#include <stdio.h>

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;

}

19

Page 20: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

20

7.2 매개변수 전달 기법(13)

예 2)

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

Page 21: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

21

7.3 중복 부프로그램(1)

중복 부프로그램 (overloaded subprogram)

같은 이름을 갖는 두 개 이상의 부프로그램들을 의미

단, 모든 중복 부프로그램은 매개변수 내용이 달라야 함

각 부프로그램은 반환 타입과 매개변수 개수, 매개변수 순서, 매개변수 타입이

다르도록 별도로 정의해야 함

중복 부프로그램에 대한 호출은 실 매개변수 리스트에 의해 결정

C++, Java, Ada, C# 등에서 중복 부프로그램을 허용

Page 22: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7.3 중복 부프로그램(2)

오류가 있는 C 예제

C 언어 : 중복 부프로그램 지원하지 않음

22

01 int add(int x, int y) 02 { 03 return x+y; 04 } 05 float add(float x, float y) 06 { 07 return x+y; 08 } 09 int main(void) 10 { 11 add(10, 20); 12 return 0; 13 }

-> 함수의 이름이 같으므로 번역 시 오류 발생

중복 부프로그램을 사용하는 C++ 예제

01 int add(int x, int y) 02 { 03 return x+y; 04 } 05 float add(float x, float y) 06 { 07 return x+y; 08 } 09 int main(void) 10 { 11 add(10, 20); 12 add(1.2, 3.4); 13 return 0; 14 }

-> 함수의 이름이 같아도 매개변수의 내용이 다르면 다른 함수로 인식

Page 23: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

23

7.4 포괄 부프로그램(1)

포괄 부프로그램(generic subprogram)

다양한 타입의 매개변수를 허용하는 부프로그램

다른 타입의 데이터에 동일한 동작을 하는 다른 부프로그램의 생성을

줄일 수 있게 됨 -> 소프트웨어 재사용성 증가

예) Ada : 두 예가 거의 유사 -> 이때 포괄 부프로그램을 사용

정수 타입의 두 데이터를

교환하는 Ada 부프로그램

procedure swapInt (x, y: in out integer) is temp: integer; begin temp := x; x := y; y := temp; end swapInt;

procedure swapFloat (x, y: in out float) is temp: float; begin temp := x; x := y; y := temp; end swapFloat;

부동 소수점 타입의 두 데이터를

교환하는 Ada 부프로그램

Page 24: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7.4 포괄 부프로그램(2)

Ada는 generic이라는 예약어를 이용해서 포괄 부프로그램을 생성

integer, float, character 타입의 데이터를 교환하는 swap이라 불리는 3개의 부프로그램 정의

호출

24

generic type Element is private; procedure exchange(x, y: in out Element); procedure exchange(x, y: in out Element) is temp: Element; begin temp := x; x := y; y := temp; end exchange;

procedure swap is new exchange (integer); procedure swap is new exchange (float); procedure swap is new exchange (character);

swap(a, b);

Ada는 중복 부프로그램 기능을 지원 -> 실 매개변수인 a와 b의 데이터 타입을 보고 해당 부프로그램이 동작

포괄 부프로그램인 exchange는 실제 동작할 수 있는 것이 아니라 부프로그램의 템플릿 역할만 함

(자체가 호출될 수 없음)

포괄 프로시저를 사용하여 실제 프로시저를 실체화 시킴

Page 25: 7. 부프로그램 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/7.pdf · 포괄 부프로그램(generic subprogram) 다양한 타입의 매개변수를

7.4 포괄 부프로그램(3)

포괄 부프로그램을 사용하는 Ada 예제

25

01 with TEXT_IO; 02 use TEXT_IO; 03 procedure gene is 04 package INT_IO is new TEXT_IO.INTEGER_IO (integer); 05 use INT_IO; 06 a, b: integer; 07 c, d: character; 08 generic 09 type Element is private; 10 procedure exchange(x, y: in out Element); 11 procedure exchange(x, y: in out Element) is 12 temp: Element; 13 begin 14 temp := x; 15 x := y; 16 y := temp; 17 end exchange; 18 procedure swap is new exchange (integer); 19 procedure swap is new exchange (float); 20 procedure swap is new exchange (character); 21 begin 22 a := 10; b := 20; 23 swap(a, b); integer 타입 데이터에 대한 교환 수행 24 put(a); put(" "); put(b); NEW_LINE; 25 c := 'i'; d := 'j'; 26 swap(c, d); character 타입 데이터에 대한 교환 수행 27 put(c); put(" "); put(d); 28 end gene;