본문 바로가기
C++

C++ 강의 5장 - 함수 오버로딩 및 디폴트 값 -

by ChocoPeanut 2017. 4. 16.

C++ 강의 5

- 함수 오버로딩 및 디폴트 값 -

 

처음부터 예시를 가지고 시작을 해보자. 앞 장에서 사용했던 Add()라는 함수를 계속해서 사용할 것이다. 우리는 두 개의 파라미터를 넣어서 더한 값을 출력하는 Add()라는 함수를 정의했었다. 그리고 우리는 하나의 파라미터를 넣을 경우 그 값에 1을 더한 값을 출력하는 함수를 만들고 싶다. 그리고 우리는 이 함수의 이름도 Add()를 사용하고 싶다. 실제로 C라는 프로그래밍 언어를 사용할 경우 같은 이름의 함수를 사용하는 것을 허용하지 않는다. 바로 에러 메시지를 보내준다.

하지만 C++에서는 함수의 이름이 같아도 받는 인자 즉 파라미터의 개수가 다르면 다름을 인정해준다. 융통성이 있는 친구이다. 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하기 때문에 C++은 함수를 다르게 인지한다. 이러한 작용을 바로 함수 오버로딩이라고 한다. 하지만 C++도 한계가 있다. 반환형이 서로 다르고 이름과 인자가 같을 경우에는 구분을 할 수 없다. 반환형은 함수호출 시, 호출되는 함수를 구분하는 기준이 될 수 없어 컴파일 오류를 낸다.





 

매개변수들은 함수가 선언되면서 같이 선언이 되는데 디폴트 값을 가질 수 있다. 디폴트 값이라는 것은 기본적으로 설정되어 있는 값을 의미한다. 디폴트 값은 선언 부분에 위치해야한다. 만약 선언부분에 위치하지 않으면 함수를 읽어올 때 디폴트 값이 적용되지 못하므로 적절한 함수가 없다는 것으로 인식해 컴파일 에러를 발생시킨다.

디폴트 값은 부분적으로 적용할 수도 있다. 하지만 여기서는 주의해야할 점이 있다. 함수가 값을 받아올 때에는 왼쪽부터 입력하여 받아온다. 따라서 디폴트 값을 적용시켜주는 시작은 반대가 되어야한다. 다른 말로 오른쪽 매개변수의 디폴트 값을 비우는 형태로는 디폴트 값을 지정할 수 없다. 함수에 전달되는 인자가 왼쪽에서부터 오른쪽으로 채워지기 때문에 디폴트 값은 이에 반대가 되어야 되기 때문이다.




 

하지만 위의 과정을 이해하기는 쉽지 않으므로 여기 이해하기 쉽게 메모리와 연관을 시켜 설명을 해보도록 하겠다. 이 부분을 보면 어떻게 함수의 매개변수가 작동하는지에 대해서도 쉽게 이해할 수 있다. 또한 나중에 포인터와 참조를 공부함에 있어서도 수월할 수 있다.

모든 변수는 메모리에 저장이 된다. 우선 메인 함수에서 설정된 변수 선언들은 메인 함수가 없어질 때 소멸된다. 하지만 다른 함수에 의해서 생겨난 변수들은 어떻게 되겠는가? 함수가 선언될 때 매개변수 또한 선언문의 형태로 선언이 된다. 이게 무슨 의미를 갖는가를 살펴보면 새로운 메모리 공간을 할당한다는 것을 의미한다. 또한 지역변수도 같은 맥락이라고 볼 수 있다. 매개변수와 지역변수는 함수가 종료됨에 따라 메모리에서 사라지게 된다.




한 번 예를 들어보자. 메인 함수에는 a라는 값이 선언이 되어 있고 Add() 함수는 지역변수에 b가 선언되고 매개변수에 x라는 값이 선언이 된다. 여기서 메모리에 변수 할당이 어떻게 적용되겠는가? 먼저 메인 함수가 실행을 진행해간다. 처음으로 나타나는 것은 int a = 3;이다. 특정 주소에 a라는 이름을 가진 변수 공간이 만들어지고 값이 3으로 할당된다. . 다음으로는 메인 함수에서 Add()라는 함수를 불러오게 된다. 그렇게 되면 또 다른 메모리 공간에 x라는 이름을 가지는 공간이 할당된다. 이 공간은 a와 다르다. 하지만 a의 값을 가져와 x라는 공간에 집어넣는다. 이 과정은 x = a; 라는 문장과 같다고 할 수 있다. 주소 공간은 다르지만 값을 복사해서 넣는 것이다. 그런 후 함수가 실행이 된다. 또 다른 공간에 b라는 이름을 가진 주소가 할당되고 1이라는 값을 넣는다. 그리고 xb를 더한 후 반환한다. 반환하는 값은 임시 저장하는 곳에 저장되고 xb에 대한 메모리 공간은 반환되어 사라지게 된다. 이제 xb라는 메모리 공간 주소는 사라지게 되는 것이다. 그 후 임시 공간에 있던 값이 cout 함수에 의해 출력이 되는 것을 볼 수 있다