본문 바로가기

PL/C & C++

함수 선언 이유

엄연히 함수의 정의가 있는데 왜 선언이 필요할까...???

첫째, 함수 선언에서 반환값의 형태를 확인합니다.

컴파일러는 함수를 호출한 자리에 반환값과 같은 형태의 저장 공간을 준비합니다. 즉, 정수를 반환하면 호출한 자리에 int형 공간을 확보하고 실수를 반환하면 double형 공간을 확보합니다. 따라서 함수를 호출하기 전에 선언을 통해 반환형을 미리 컴파일러에게 알릴 필요가 있습니다. 물론 함수의 정의에서도 반환형을 확인할 수 있고 컴파일러는 위에서 아래로 한줄씩 컴파일하므로 함수 호출 이전에 함수를 정의하는 방법도 있습니다.

main 함수 위에 add함수를 정의하면함수의 정의에 원형이 포함되므로 따로 함수를 선언할 필요가 없습니다.

이 경우 실행 순서에는 변함이 없습니다. 프로그램은 항상 main 함수부터 실행되며 그 이후에는 호출 순서에 따라 실행 되기 때문입니다.

다만 함수를 선언하지 않는 경우 함수의 정의가 호출하는 함수보다 항상 위에 있어야 함으로 예제와 달리 많은 함수 간에 호출 관계가 엉켜 있으면 순서에 맞게 정의하는 것이 쉽지 않습니다. 따라서필요한 함수를 main함수 밑에 차례로 만들고 main 함수 위에 모든 함수를 선언하여 함수의 종류와 원형을 한 눈에 파악하고 자유롭게 호출할 수 있도록 작성하는 것이 좋습니다.

또한 분할 컴파일하는 프로그램에서 호출하는 함수와 호출되는 함수가 서로 다른 파일에 있으면 반드시 선언이 필요합니다.

둘째, 함수의 호출형식에 문제가 없는지 검사합니다.

함수 선언문에는 매개변수의 개수와 형태에 대한 정보가 있으므로 호출할 때 정확한 값을 주는지 검사할 수 있습니다. 예를 들어 add 함수가 필요한값이 정수 2개인데, 실수를 인수로 주고 호출하면 컴파일 단계에서 확인하고 문제를 경고 메세지로 알려줍니다.

(함수를 정의하거나 선언하지 않고 호출하면 컴파일러는 반환형을 int로 가정합니다)

 

 

함수 선언 : 함수 원형을 컴파일러에게 알린다.

함수 정의: 함수 원형을 설계하고 내용을 구현한다.

함수 호출: 함수에 필요한 값을 주고 함수를 사용한다.

 

'PL > C & C++' 카테고리의 다른 글

[C++] class  (0) 2020.10.20
[C&C++] header 파일 선언 이유  (0) 2020.10.16
[C/C++] 포인터 반환 함수  (0) 2020.09.24
[C/C++] 매크로 #, ##  (0) 2020.09.13
[C/C++] puts와 printf  (0) 2020.09.07