기타 언어(C, PHP 등)

[c,c++] 함수의 기본

노루아부지 2019. 7. 31. 17:39

1. 함수의 기본 형태

함수를 만드는 기본 형식은 다음과 같다.

리턴타입 함수이름(인수 목록)
{
   함수의 본체
}

1) 리턴타입 : 함수가 리턴하는 값의 데이터형이며 함수의 작업 결과라고 할 수 있다.
2) 함수이름 : 함수의 이름이며 이 이름을 통해 함수를 호출한다.
3) 인수목록 : 함수를 호출할때 호출한 장소에서 넘겨주는 값이다.

 

2. 함수의 사용
예1)  #include<stdio.h>
      
      int sum(int num);           //함수 선언

      void main(void)
      {
         sum(10);                 //함수 호출
      }

      int sum(int num)            //함수 정의
      {
         return num + 10;
      }


예2)  #include<stdio.h>
   
      int sum(int num)            //함수 선언 + 정의
      {
         return num + 10;
      }

      void main(void)
      {
         sum(10);                 //함수 호출
      }

예3)  #include<stdio.h>
      
      void main(void)
      {
         sum(10);
      }

      int sum(int num)
      {
         return num + 10;
      }


결과를 먼저 이야기 한다면 예1)이 올바른 코딩이고 예2)와 예3)은 잘못된 코드이다.
예3)은 컴파일 에러가 발생한다. 에러 메시지의 내용은 "sum함수가 선언되지 않았다."이

다. 그 이유는 c언어는 1패스 방식(코드를 순서대로 번역)이기 때문에 main()함수 이전에

sum()함수가 선언되지 않았기 때문이다. 따라서 예3)은 선언하지도 않은 함수를 호출한게

되어버린다.
예2)를 컴파일 하고 실행을 해보았다면 이게 왜 잘못된 코딩일까 의문이 들지도 모른다.
잘 실행되기 때문이다. 하지만 아래의 예4)를 본다면 왜 그런것인지 알 수 있을것이다.

예4)  #include<stdio.h>

      void sum1(int num1)
      {
         sum2(num1);
      }

      void sum2(int num2)
      {
      }

      void main(void)
      {
         sum1(10);
      }

아래의 프로그램을 실행하면 어떤일이 일어날까?
정답은 예3)과 같이 sum2()함수가 선언되지 않았기 때문이다. 그 이유는 위와 같다.
아래 예제를 더 보자.

예5)  #include<stdio.h>

      void sum1(int num1);
      void sum2(int num2);

      void main(void)
      {
         sum1(10);
      }

      void sum1(int num1)
      {
         sum2(num1);
      }

      void sum2(int num2)
      {
      }


예5)는 잘 만들어진 프로그램이다. 왜 이 프로그램은 에러가 나지 않는 것일까?
void sum1(int num1);
void sum2(int num2);

이 부분은 본격적인 프로그램의 실행 이전에 함수의 원형을 선언했기 때문이다.
선언부는 말 그대로 앞으로 사용한다고 선언하는 부분이기 때문에 순서와는 관계가 없다.

728x90
loading