이전 포스트에서는 사용자 정의 함수가 main()함수 이전에 위치하였다. 또 다른 예를 들어보자.
double getArea(double dr) { //반지름으로 원의 면적을 구하는 함수double dArea = 3.14*dr*dr;return dArea;}int main() {double da = getArea(5.0);} |
하지만 C++ 프로그램은 관례적으로 main()함수를 다른 함수들보다 위에 위치시킨다. 맨 먼저 실행되는 함수이기도 하지만 이렇게 배치해야 다른 함수들과 호출 순서나 상관 관계를 파악하기 쉽다.
하지만 다음과 같이 단순히 순서를 바꾸기만 해서는 문제가 생긴다.
int main() {double da = getArea(5.0); //문제 발생}double getArea(double dr) {double dArea = 3.14*dr*dr;return dArea;} |
왜냐면 컴파일을 수행할 때 main()함수 내부의 함수 호출 getArea() 을 처리하는 시점에서 이 함수에 대한 어떠한 정보도 없기 때문이다. 이렇게 하면 컴파일러는 오류를 발생시킨다.
이런 경우 함수에 기본적인 정보를 주는 부분이 main()함수 위에 와야 하는데 이것을 ‘함수의 선언’ 이라고 한다. 함수의 선언은 함수 정의부에서 본체를 제외한 첫 줄만 따로 적어주면 된다.
double getArea(double dr); //함수의 선언int main() {double da = getArea(5.0);}double getArea(double dr) { //함수의 정의 (본체 포함)double dArea = 3.14*dr*dr;return dArea;} |
이렇게 하면 컴파일시에 오류를 발생시키지 않는다. 이와 같이 함수의 정의가 호출하는 부분보다 뒤에 온다면 반드시 함수의 선언이 선행되어야 한다.
실행 가능한 전체 프로그램을 다음과 같다.
#include <stdio.h>double getArea(double);int main(int argc, char **argv) {double da = getArea(5.0);printf("Area: %f", da);}double getArea(double dr) {double dArea = 3.14 * dr * dr;return dArea;} |
//실행결과 |
78.500000 |
함수의 선언과 정의의 차이점을 다시 한 번 살펴보자.
- 정의(definition) : 사용자가 만든 함수의 본체 부분까지 실제로 구현된다. 따라서 컴파일러가 함수 본체를 저장할 메모리를 당연히 확보하고 호출부보다 먼저 위치한다면 선언과 겸할 수 있다.
- 선언(declaration) : 컴파일러에게 사용자가 만든 함수의 인자와 반환 자료형을 미리 알려준다. 컴파일러가 본체를 위한 메모리를 확보하지는 않는다 선언은 정의를 겸할 수 없다.
함수의 선언에서 인자의 변수명은 생략할 수 있으나 인자의 자료형을 반드시 명시해주어야 한다. 다음 예를 보자.
#include <stdio.h>int add(int, int);int main() {int ia = 100, ib=150;int isum1, isum2;isum1 = add(10,20);isum2 = add(ia, ib);add(10, isum1);printf("%d, %d\n", isum1, isum2);}int add(int ix, int iy) {return ix+iy;} |
실행결과
|
30, 250
|
이 예제에서 함수 add()의 선언에서 인자의 변수명을 생략했음을 알 수 있다. 이렇게 해도 문법적으로 오류가 발생하지 않는다.
C++ 강좌 전체 목록 >>>
댓글 없음:
댓글 쓰기