Programming/C C++
 함수의 형태

C++ 에서 함수는 다음과 같은 형태로 작성됩니다.
한정자 반환형 함수명 (매개변수1, 매개변수2...)
{
    처리문;

    return 반환값;
}
한정자는 함수에 대한 접근제한이나 메모리위치방식 또는 상속등을 지정하는 역활을 하며 생략이 가능한 부분입니다.

반환형은 함수가 처리된 뒤 어떠한 형의 데이터를 반환하는지 나타내는 부분입니다. 실제 데이터는 return의 반환값을 통해 반환되며 이때 반환값의 데이터형과 함수에 지정된 반환형은 타입이 일치해야 합니다. 다만 함수가 반환값을 가지지 않는 경우에는 함수의 반환형을 void로 지정하고 함수에서 return은 사용되지 않거나 반환값이 없는 형태인 return; 만 작성되어 함수처리를 단순히 종료하는 역활만 하게 됩니다.

함수명은 개발자가 함수가 하는 역활에 따라 적절하게 이름을 붙여주면 됩니다.

매개변수는 함수를 호출할때 함수에 값을 넘겨주는 부분으로 함수내에서 매개변수를 사용하여 필요한 데이터를 받아 처리할때 사용됩니다. 함수처리에 매개변수가 필요없는 경우 생략이 가능합니다.

 함수의 선언

다음은 두개의 매개변수를 받아 합계를 반환하는 함수의 예입니다. 이 함수에서 한정자는 생략되었습니다.
int plus(int a, int b)
{
    return a + b;
}
이 함수는 int형식의 데이터를 반환하는 plus라는 이름의 함수이며 int형 매개변수 두개(a와 b)를 받아 함수내에서 각 매개변수를 더한 값을 return을 통해 반환합니다.

그런데 다음과 같이 필요한 함수를 작성하고 사용하려면 컴파일 오류가 발생합니다.
int main()
{
   int result = plus(10, 20);

   return 0;
}

int plus(int a, int b)
{
   return a + b;
}
오류가 발생하는 원인은 컴파일러가 프로그램을 컴파일 할때 main에서 plus라는 함수사용을 발견하고 적절한 처리를 해야 하지만 이 함수가 실제 어떠한 형태를 가진 함수인지는 아직 확인되지 않았기 때문입니다.

그래서 컴파일러에게 함수를 사용하기전 어떠한 형태의 함수인지를 컴파일러에게 알려주어야 합니다. 그렇게 하기 위해서는 두가지 방법을 사용할 수 있는데 하나는 함수자체를 실제 함수가 호출되는 함수 위에 작성하는 것입니다.
int plus(int a, int b)
{
    return a + b;
}

int main()
{
    int result = plus(10, 20);

    cout << "결과값 : " << result << endl;    

    return 0;
}
위 예제는 main함수에서 plus함수를 호출하여 사용하고 main위에 plus함수 본체를 작성함으로서 컴파일러에게 미리 plus함수에 대해서 알 수 있도록 한것입니다.

또 다른 방법은 함수선언부분만 main위에 작성하고 본체는 따로 두는 방법입니다. 실제 컴파일러가 함수에 대해서 알아야할 부분은 함수가 어떤 매개변수를 받고 어떠한 형태의 데이터를 반환하는지만 알면 되기 때문에 이 모든 내용이 들어간 함수선언부분만 미리 작성되면 컴파일이 가능하기 때문입니다.
int plus(int a, int b);

int main()
{
    int result = plus(10, 20);

    cout << "결과값 : " << result << endl;

    return 0;
}

int plus(int a, int b)
{
    return a + b;
}
이전 예제와는 다르게 int plus(int a, int b); 라는 부분이 main() 함수 위에 있고 본체는 main() 함수 아래에 존재합니다. 함수를 작성할때 처음 작성되는 첫라인이 끝에 ;문자만 붙어서 그대로 main() 함수위에 선언된 것으로, 이렇게 사용자 함수 첫 부분만 함수 사용전에 미리 선언하면 실제 해당 함수의 본체가 어디에 있건 상관이 없이 사용이 가능하게 됩니다.

 기본 매개변수

함수를 호출할때 해당 함수에 매개변수가 있으면 함수의 매개변수에 값을 넣어 함수를 호출해야 합니다. 예를 들어 두개의 int형 매개변수를 받는 plus라는 함수가 존재하는 경우
int result = plus(10, 20);
위와 같이 호출할 수 있습니다. 그런데 만일 plus함수에서 두번째 매개변수의 값이 20으로 항상고정되거나 거의 변하지 않는 값인 경우 매번 함수를 호출할때마다 20이라는 값을 지정하는것은 번거로울 수 있습니다. 그래서 함수는 미리 값을 지정해 두는 기본매개변수라는 것이 존재합니다.
int plus(int a, int b = 20)
{
   return a + b;
}
plus함수에서 두번째 매개변수인 b에 20이라는 값을 대입하였습니다. 이렇게 하면 함수를 호출할때 b의 값이 20인 경우 해당 매개변수의 값을 생략하고 함수를 호출할 수 있습니다.
int result = plus(10);
매개변수가 하나만 지정된 경우 함수는 알아서 b값을 20으로 처리하게 됩니다. 물론 기존대로 두개의 매개변수를 모두 전달할 수 있는데 이런 경우 기본매개변수에서 지정한 값은 무시되고 호출할때의 값으로 처리하게 됩니다.

또한 기본매개변수 지정은 반드시 가장 오른쪽 매개변수부터 지정되어야 합니다. 그렇지 않고 무작위로 기본매개변수가 지정되면 함수를 호출할때 매개변수에 필요한 값을 생략한 채로 함수를 호출하면 어느 기본매개변수의 값을 무시해야 하는지 알 수 없기 때문입니다.

 오버로딩

오버로딩은 쉽게 말해 같은 이름의 함수를 여러개 존재시키는 것이라고 말할 수 있습니다.

예를 들어 두개의 매개변수를 받아 각 매개변수를 더한 값을 반환하는 plus라는 함수가 있는 경우
int plus(int a, int b)
{
    return a + b;
}

위 함수를 호출할때 매개변수가 int가 아닌 float형일 때에는 매개변수와 반환형식만 달리한 plus라는 이름의 함수를 새로 만들기만 하면 됩니다.

int plus(int a, int b)
{
    return a + b;
}

float plus(float a, float b)
{
    return a + b;
}
같은 처리(덧셈)를 하는 같은 이름(plus)의 함수를 매개변수와 반환형식만 달리한 채로 중복해서 작성할 수 있는 것으로 이것을 오버로딩이라고 합니다.

이와 같이 오버로딩 함수가 존재하면 함수호출시 매개변수를 통하여 어떠한 함수를 호출할지 구분하여 처리합니다.
 int result_i = plus(10, 20);
 float result_f = plus(0.25f, 0.3f);

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

[Visual C++] typedef  (0) 2012.07.06
[Visual C++] 구조체  (0) 2012.07.05
[Visual C++] 함수  (0) 2012.07.04
[Visual C++] 연산자  (0) 2012.07.03
[Visual C++] 흐름제어  (0) 2012.07.02
[Visual C++] 형변환  (0) 2012.06.29
0 0