9주차 강의에서 다루었듯이, 큰 프로그램은 여러 개의 함수로 나누어서 작성하는 것이 중요하다. 이 때 각 함수는 여러분이 이해하기 쉬울 정도로 작은 단위여야 한다. 또한, 함수들간에는 매개변수 전달을 통해서 서로 통신한다는 것을 알고 있다.

만약, 큰 프로그램이 배열을 사용한다면, 함수들이 배열을 매개변수로 전달하는 것이 필요하게 될 것이다. 여기서는 배열 매개변수를 어떻게 표현하고, 어떻게 효과적으로 사용하는 지에 관해서 배운다.

배열 원소는 단순 변수와 마찬가지 방식으로 함수의 매개변수로 전달된다. 다음은 main()에서 배열의 두 원소를 9주차 강의에서 다룬 max() 함수에 전달하는 과정을 보여준다.

즉, max() 호출문에서 실 매개변수로 명세된 배열 원소가 복사되어 호출된 함수의 대응 형식 매개변수에 전달된다. 여기서 복사(copy)의 의미는 score[1]과 score[4]의 값이 max()의 형식 매개변수 x, y에도 저장된다는 것을 의미한다.

배열 원소를 개별적으로 함수에 전달하는 것 대신에, 배열 전체를 함수에 전달할 필요가 있을 것이다. C의 배열은 단순 변수와는 다른 방식으로 함수에 전달된다.

다음은 배열을 함수에 전달하는 프로그램 예제를 보여준다.


main()은 score 배열을 선언, 초기화한 후에, arrayMax()를 호출하여 score 배열에서 가장 큰 값을 찾아서 출력한다. arrayMax() 함수는 배열을 매개변수로 전달받아서, 배열에 포함된 원소들중에서 가장 큰 값을 찾아서 반환한다.

여기서 arrayMax() 함수의 매개변수는 배열을 정의하는 배열의 원소 타입과 배열의 크기가 명세되어 있음을 알 수 있다. 이것은 main()에서 선언된 arrayMax()의 원형과 일치된다.

main()에서 arrayMax()를 호출할 때, 매개변수 score 배열이 어떻게 전달되는가? 만약, 단순변수처럼 복사되어 전달된다면, arrayMax()에서도 score 배열의 복사본이 존재하게 된다.


main()에서 score 배열의 크기가 수백, 수천이면 어떻게 될 것인가? 이와 같은 큰 score 배열에 대한 복사본을 arrayMax()에 마련한다는 것은 공간과 시간 면에 있어서 엄청난 부담이 초래한다. 공간은 배열의 기억공간을 새로이 마련하는 것에 따르고, 시간은 배열 원소를 원본 배열로부터 새롭게 마련한 배열로 복사하여 이동하는 것에 따른다.

따라서 C 언어는 다른 방식으로 배열을 매개변수로 전달한다. 즉, 호출된 함수에 배열에 대한 복사본을 마련하지 않고, 호출자의 원본 배열에 직접 접근할 수 있게 한다.

배열 매개변수의 복사본을 함수 내부에 마련하지 않고, 호출자의 배열에 직접 접근하여 참조하게 하는 배열 매개변수 전달 방식은 함수 실행시에 배열 원소의 값을 변경시키면, 그 결과는 직접 호출자에 영향을 미치게 된다.

다음 프로그램 예제를 생각해보자. main()은 두 개의 for 문과 arrayDouble() 함수 호출문으로 구성된다. 두 개의 for 문 모두 score 배열을 단순히 출력한다. 그 출력 결과는 동일한가?

arrayDouble()은 반환 값이 존재하지 않는다. 따라서 호출자에 반환되는 값이 없다. 그렇다면, 함수 수행 결과가 호출자에 어떠한 영향을 미치지 않는가?

이 두 가지 문제에 대한 답변은 다음 프로그램의 실행과정을 살펴보면 쉽게 구할 수 있을 것이다.

arrayDouble() 함수가 s[0]을 참조하는 경우를 생각해보자. 이때 arrayDouble()은 score 배열에 직접 접근하여 score[0]의 값을 가져오고, 그 값을 두배로 계산하고, 계산된 값을 다시 score[0]의 원소에 저장한다. 따라서 함수의 수행 결과로 score 배열은 각 원소의 값이 두배로 증가되는 것을 알 수 있다.

함수의 헤더에 명시되는 배열 매개변수에서 배열 크기를 생략할 수 있다. 이것을 생략하더라도 컴파일러가 올바른 코드를 생성하는데 아무런 문제가 없기 때문이다. 따라서 프로그램 10-3은 다음과 같이 표현될 수 있다.


여러분은 arrayMax()의 헤더와 원형에서 배열의 크기가 생략된 것을 알 수 있다. 실제로, 함수의 헤더와 원형에서 배열 크기를 생략하는 것이 일반적이다.

또한, main()에 선언된 arrayMax()의 원형은 다음과 같이 표현될 수 있다.

    int arrayMax(int []);

이것은 함수 원형에서 명시되는 매개변수의 식별자 이름은 의미가 없기 때문이다. 중요한 것은 매개변수의 개수와 각 매개변수의 타입이다. 'int []'에서 ‘[]로부터 매개변수가 배열임을 알 수 있고, ’int'로부터 배열의 원소 타입이 정수임을 알 수 있다.


마찬가지로, 여러분은 함수 원형에 표현된 매개변수가 단순 변수인 경우에도 식별자 이름을 생략할 수 있다. 가령, 프로그램 10-2의 max() 함수에 대한 원형에 대한 다음 두 가지 표현은 동일하다.

 

 

int max(int a, int b);
int max(int, int);

 


top으로... 다음페이지로.. 이전페이지로.. home으로..