본문으로 바로가기
728x90
반응형

안녕하세요. letitkang입니다.


'윤성우의 C++ 열혈강의'를 한번 또 볼까요?


지난 포스팅들 에서는 C++의 기본적인 것에 대해 알아보았습니다.


이제부터 본격적으로 C++에 대해 알아보겠습니다.


바로 포스팅 시작할게요!


 

 

 



함수 오버로딩(Function Overloading)?


함수오버로딩이란 무엇일까요?


먼저 소스코드를 보겠습니다.



===============================================================================================

함수 오버로딩 관련  소스코드

================================================================================================

  1 int MyFunc(int num)

  2 {

  3     num++;

  4     return num;

  5 }

  6

  7 int MyFunc(int a, int b)

  8 {

  9     return a+b;

 10 }

 11

 12 int main(void )

 13 {

 14     MyFunc(20);     // MyFunc(int num) 함수 호출

 15     MyFunc(30. 40); // MyFunc(int a, int b) 함수 호출

 16 }

================================================================================================

위의 소스 코드를 보겠습니다.

C에서는 위의 코드를 컴파일 할 경우, 에러가 발생합니다. 왜냐하면, 동일한 이름의 함수를 정의했기 때문입니다.

그러나 C++에서는 가능합니다. 바로 함수 오버로딩 때문입니다.

main 함수를 보면, 14, 15번째 줄의 코드는 다른 함수를 호출 했습니다. C++에서는 이름이 같을지라도, 인자가 다르기 때문에 함수의 구분이 가능합니다.

매개변수의 자료형이 다르면, 동일한 이름의 함수 정의를 허용하는 것을 함수 오버로딩이라고합니다.

C에서는 왜 함수오버로딩을 지원하지 않느냐? 라고 물어보면, 함수를 찾는 방법이 다릅니다.

C에서는 함수의 이름만을 보고 함수를 찾습니다. 그러나 C++에서는 함수의 이름과 매개변수의 선언을 보고 함수를 찾습니다.

참 쉽죠잉~

함수 오버로딩이 가능하려면, 매개변수의 선언이 달라야 합니다.

함수 오버로딩의 예를 한번 살펴보겠습니다.

================================================================================================
int MyFunc(char c) {}
int MyFunc(int n) {}
================================================================================================

위의 두 함수는 이름은 같지만, 매개변수의 선언이 다릅니다. 그러므로 가능!!!

================================================================================================
int MyFunc(int n) {}
int MyFunc(int n1, int n2) {}
================================================================================================

위의 두 함수는 이름은 같지만, 매개변수의 개수가 다릅니다. 이것도 가능합니다!!! 

================================================================================================
int MyFunc(int n) {}
void MyFunc(int n) {}
================================================================================================

두 번은 가능한 케이스를 설명 드렸으니, 이번은 불가능한 것을 보여드릴게요.

위의 함수는 이름과 매개 변수가 같습니다. 그러나 반환형은 다릅니다. 호출되는 함수를 구분하는 기준이 위에서 함수 이름과 매개변수의 선언이라고 했습니다. 반환형은 기준이 될 수 없습니다. 그러므로 컴파일 오류가 뜨면서 불가능!!!

한 줄로 정리하면, "함수 오버로딩은 매개변수의 자료형 또는 개수가 달라야 된다"입니다.


함수 오버로딩은 어려운 개념이 아닙니다. 뒤에가면 어려운 것들이 많으니 벌써 어려우면 안됩니다!!!


다음은 매개변수의 디폴트 값에 대해 알아보겠습니다.


C++에서는 함수의 매개변수에 디폴트 값을 설정할 수 있습니다. 매개 변수를 입력하지 않더라도, 함수를 호출하면 기본적인 값이 전달된다는 뜻입니다.


 

 

 



그것에 대한 예를 한번 보겠습니다.


================================================================================================
int MyFuncOne(int num=7)
{
return num+1;
}

int MyFunc(int num1=5, int num2=7)
{
return num1+num2;
}
================================================================================================

디폴트 값의 대입은 위와 같이 하면 됩니다. 어렵지 않아요!


위 함수들의 의미는 매개변수를 전달하지 않으면, 디폴트로 설정된 값이 전달되었다고 판단하겠다는 뜻입니다.


함수 호출 방법은 아래와 같습니다.


MyFuncOne(); MyFunc();


아래의 소스코드를 한번 보겠습니다.


아래의 소스 코드는 매개변수에 디폴트 값을 지정하고, 호출하는 예제를 나타난 것이다.


================================================================================================

소스코드

================================================================================================

  1 #include <iostream>

  2

  3 int Adder(int num1=1, int num2=2)

  4 {

  5     return num1+num2;

  6 }

  7

  8 int main(void)

  9 {

 10     std::cout<<Adder()<<std::endl;

 11     std::cout<<Adder(5)<<std::endl;

 12     std::cout<<Adder(3,5)<<std::endl;

 13

 14     return 0;

 15 }

================================================================================================

결과

================================================================================================

3

7

8

================================================================================================


매개변수에 디폴트 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자 전달이 가능합니다. 그리고 인자는 왼쪽부터 채워져 나가고, 디폴트 값으로 채워집니다.


그리고 위의 소스르 보면, 디폴트 값은 함수의 선언 부분에만 표현하면됩니다.


몇 가지 예제를 보겠습니다.


int YourFunc(int num1, int num2, int num3=30) {}

int YourFunc(int num1, int num2=20, int num3=30) {}

int YourFunc(int num1=10, int num2, int num3=30) {}


위의 3가지는 다 가능합니다. 여기서 알 수 있는 것은, 매개 변수는 오른쪽부터 채워 가야됩니다. 함수에 전달되는 인자가 왼쪽에서 오른쪽으로 채워지기 때문입니다.


 

 



이번 포스팅은 이정도로 마무리 하겠습니다.


다음 강에서는 C++의 다른 기능에 대해서 이야기해보도록 하겠습니다!


읽어주셔서 감사합니다.

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++]이름공간(namespace) (2)  (0) 2017.02.20
[C++]이름공간(namespace) (1)  (0) 2017.02.20
[C++]인라인(inline)함수  (0) 2017.02.20
[C++]C++? (2)  (0) 2017.02.07
[C++]C++? (1)  (0) 2017.01.31