|
|||
1.
함수 정의
다음은 함수의 일반적인 형식이다. ![]() 함수의 일반 형식에서 보면, 함수 헤더가 함수의 첫 행에 기술되는 것을 알 수 있다. 함수이름 오른쪽 옆에 함수에 전달되는 매개변수와 그 타입들이 명세되고, 그 왼편에는 함수가 수행된 후 반환할 결과 값의 타입이 명세된다. 함수 본체는 여러분이 지금까지 작성해온 C의 main() 함수의 본체와 동일하게 생각하면 된다. 즉, 변수 선언문과 C의 문장들로 구성되는데, 이러한 문장들이 함수의 기능을 수행할 것이다. 본체는 main() 함수와 마찬가지로 왼쪽 중괄호('{')로 시작되고, 오른쪽 중괄호('}')로 끝난다는 것을 유의하라. 이제 1장에서 살펴본 max 함수를 C의 함수로 작성해보자. max 함수는 다음과 같이 정의되었다. 즉, 두 개의 정수 X, Y를 전달받고, 큰 값을 반환한다. 다음은 max() 함수의 작성 과정을 보여준다. 다음에, 함수 본체를 작성한다. 이것은 전달받은 두 정수 중에서 큰 수를 결정하여 반환하는 함수의 기능을 C 문장으로 작성하면 된다. 이러한 기능은 간단하여 분석, 설계 과정을 거치지 않고 직접 C 문장으로 작성하였다. 여러분은 max 함수의 기능에 대해서 작성된 C 문장을 쉽게 이해할 수 있을 것으로 본다. 함수 본체는 먼저, if 문을 사용하여 큰 값을 결정하여 변수 n에 저장하고, 다음에 return 문을 사용하여 변수 n에 저장된 값을 반환한다. return 문은 함수의 결과 값을 반환할 때 사용되는 C 문장이다. 이 return 문의 형식은 다음과 같다. return 문은 식을 평가하고, 그 결과 값을 반환한다. 함수에서 반환되는 값의 타입은 이미 함수 헤더상에 기술되어 있음을 유의하라. 따라서 return 문에 표현되는 식의 값 타입과 함수 헤더상에 명세된 반환 값의 타입이 일치되어야 한다. 그렇지 않으면, 타입이 일치하지 않는다는 오류가 발생할 것이다.
2. 함수 사용 여러분은 두 개의 정수를 입력받고, 이 두 수중에서 큰 값을 결정하여 출력하는 프로그램을 작성하고자 한다. 이 프로그램을 위한 알고리즘은 다음과 같다. 알고리즘 9-1의 단계 2를 앞 절에서 정의한 max() 함수를 사용하여 해결하고자 한다. 다음 알고리즘 9-1-1은 함수 max()를 불러서 a, b 중에서 큰 값을 결정한다. 다음은 알고리즘 9-1-1에 대한 프로그램 작성 과정을 보여준다. 함수는 어떻게 선언되는가? 프로그램 9-2에서 함수 선언문을 자세히 살펴보면, max() 함수의 헤더와 일치되는 것을 알 수 있다. 함수를 선언하는 이유는 함수에 대한 정보를 제공하기 위함이다. 즉, 함수 선언문을 통해서 이 함수에 전달되는 매개변수의 개수, 그리고 각 매개변수의 타입, 함수 반환 값의 타입 등을 알아낼 수 있다. 2장에서 살펴보았듯이, 이러한 함수 정보에 관한 표현이 함수 원형(prototype)이다. 이러한 함수에 관한 정보를 토대로, 다음과 같이 함수를 올바르게 사용할 수 있다. max() 함수를 포함하는 다음 배정문을 다시 한번 살펴보자.
이 문장의 실행 의미는 무엇인가? 이 문장은 배정문이므로, 오른쪽에 위치한 식이 먼저 평가된다. 그러나 식이 max() 함수이다. 이때, 즉 식을 평가하려는 시점에서 max() 함수가 불려진다. 함수를 부르는 것을 호출한다(call)한다라고
한다. max() 함수가 호출될 때, a, b의 두 변수가 매개변수로 함수에 전달된다. 그리고 max() 함수가 실행되고, 그
결과로 반환 값이 전달된다. 이 전달된 값이 식의 평가 결과이고, 따라서 배정문의 왼쪽에 위치한 m의 변수에 저장된다. 위 문장의 실행 과정을 main() 함수와 max() 함수간의 관계를 통해서 좀더 구체적으로 살펴보자. main()은 실행 중에 max()를 호출한다. 이때, main()을 호출자(caller)라 하고, max()를 피호출자(callee)라 한다. 즉, 호출자는 함수를 호출하는 함수이며, 피호출자는 호출되는 함수이다. 다음은 main() 함수의 실행 과정을 보여준다. |
|
||
|
|
[프로그램 단위 입력 실행] 다음 실습창을 통해서 프로그램 9-1의 함수 실행과정을 알아본다. (여러분은 실습창의 왼편에 위치한 '새프로그램 입력' 버튼을 클릭하여 새로운 프로그램을 입력하여 실행시켜 볼 수 있다. ) |
main() 함수는 한 문장씩 실행하다가 max() 함수를 만나면, 이 함수를 호출하고 main()의 실행을 중단하고, max()의 실행을 시작한다. max()의 실행이 종료되면, 다음 실행은 main()이 max()를 호출할 때 중단되었던 지점부터 시작된다. 이 지점은 max()로부터 전달된 반환 값을 m에 저장하는 배정문이다. 이 배정문부터 시작하여 main()의 나머지 부분을 계속 실행한다. 따라서 위의 배정문은 max() 함수의 호출전과 실행 후를 다음과 같이 해석될 수 있다. 즉, max() 함수의 호출 결과로, 이 함수는 그 실행 결과인 반환 값으로 대체되는 효과를 갖는다. 이와 같이 함수의 호출 효과를 이해할 수 있다. 다음과 같이 호출자와 피호출자간의 관계를 데이터가 이동되는 과정만을 강조하여 보여줄 수 있다.
여기서는 위와 같이 호출자와 피호출자간의 데이터 이동 과정을 보여주는 다이어그램을 함수 관계 다이어그램이라고 부른다. 함수 관계 다이어그램은 문제 분석 단계에서 효과적으로 사용될 수 있다. 일반적으로 복잡한 문제의 경우, 몇 개의 부분 문제들로 나뉘어지고, 각 부분 문제는 C 언어의 경우 함수로 작성된다. 이러한 함수들간의 관계를 함수 관계 다이어그램을 통해서 기술하면, 프로그램 전체에 대한 개관뿐만 아니라 각 함수에 대한 개관도 제공할 수 있다. 다음에, 이러한 개관에 기반하여 문제를 보다 구체적으로 설계할 수 있겠다.
![]() |
3. 함수가 반환 값을 갖지 않는 경우 앞서 살펴본 max()함수는 수행 후에 값을 반환하였다. 그러나 C 언어에서 함수는 그 수행 결과로서 값을 반환하지 않을 수 있다. 이러한 함수의 원형은 다음과 같이 함수 반환 값의 타입이 void로 명세된다.
반환 값이 없는 함수를 사용하는 프로그램 예제를 생각해보자. 3장의 프로그램 9-2을 다음과 같이 수정한다: 두 개의 수를 입력받아 큰 수를 결정하여 출력하는 과정을 10번 반복한다. 이 프로그램을 작성하기 위해서 다음 알고리즘을 생각할 수 있다. 반복 회수가 10이므로, for 문의 반복 구조를 생각한다. for 문의 본체에서 세 번째 단계를 위해서 앞서 살펴본 max() 함수를 사용할 수 있겠지만, 여기서는 두 수를 매개변수로 전달받아서 큰 수를 결정하고, 결정된 큰 수를 반환하지 않고 출력하는 print_max() 함수를 생각한다. print_max() 함수를 다음과 같이 요약할 수 있다.
따라서 print_max() 함수의 원형은 다음과 같이 표현될 수 있다.
알고리즘 9-2에 대해서 작성될 main() 함수와 print_max() 함수의 관계는 다음과 같이 나타낼 수 있다. main()은 필요할 때 print_max() 함수를 불러서 사용하는 것을 알 수 있다. 또한, print_max()는 호출될 때, a, b의 두 값을 매개변수로 전달받으나, 결과 값을 호출자에 반환하지 않는다는 것을 알 수 있다. 다음은 알고리즘 9-2에 대해서 작성된 main() 함수와 print_max() 함수를 보여준다.
print_max() 함수는 전달받은 두 개의 값을 비교하여 큰 값을 결정하고, 결정된 값을 출력하는 것을 알 수 있다. print_max() 함수의 헤더 상에 표현된 함수 정보가 main() 함수에서 선언된 print_max() 함수의 원형과 일치되는 것을 알 수 있다. 여러분이 지금까지 작성해온 main()도 함수이다. 따라서 main() 함수의 헤더 상에 반환 값이 없음을 알리는 void를 명세해야 한다. 지금까지 main() 함수 작성시에 반환 값을 갖지 않은 경우에도 void를 명세하지 않았는데, 이 경우에 다음과 같은 경고 메시지를 받았을 것이다: "function should return a value; 'void' return type assumed".
|
|
[프로그램 단위 입력 실행] 다음 실습창을 통해서 프로그램 9-4의 함수의 실행과정을 알아본다. (여러분은 실습창의 왼편에 위치한 '새프로그램 입력' 버튼을 클릭하여 새로운 프로그램을 입력하여 실행시켜 볼 수 있다. ) |
![]() |
|