코딩하는 오징어

함수 오버로딩(function overloading)과 매개변수의 디폴트 값 본문

Language/C++

함수 오버로딩(function overloading)과 매개변수의 디폴트 값

코딩하는 오징어 2017. 9. 26. 15:00
반응형

안녕하세요. 코딩하는오징어입니다. 오늘은 함수 오버로딩과 매개변수의 디폴트 값을 알아 보겠습니다. 먼저 함수 오버로딩에 대해서 알아 보겠습니다. 함수 오버로딩은 어려운 개념이 아닙니다. 함수의 이름이 같더라도 함수의 시그니처(signature)가 다르면 시그니처에 따라 함수를 구분 지어주는 것인데요. 여기서 함수의 시그니처에 해당하는 부분을 알아보겠습니다.



와 같이 함수명, 매개변수의 타입, 매개변수의 갯수에 해당하는 것들이 함수의 시그니처입니다. 이것을 가지고 어떤 함수가 호출 될것인지 컴파일러가 정하게 되는 것입니다. 따라서 이것들 중 하나라도 다른 것이 있다면 다른 함수로 구분되어 지는 것입니다. 예제 코드를 보겠습니다. (return type은 함수의 시그니처로 포함되어 있지않습니다. 따라서 return type이 다르다고 함수 오버로딩이 되는 것은 아닙니다.)



예제 소스코드와 출력된 결과를 보면 함수 시그니처에 따라 호출되는 함수가 다른 것을 확인 할 수 있습니다.


그럼 이제 매개변수의 디폴트 값에대해서 알아 보겠습니다. 말그대로 매개변수에 디폴트 값을 정해줌으로써 함수에 매개변수가 들어가지 않으면 디폴트값으로 하여금 인자를 전달하겠다라는 의미입니다. 예제 코드를 바로 보시죠.



main안의 Function()함수를 인자없이 호출하였지만 1이 출력되었습니다. 함수의 선언부를 보시면 1이 디폴트 값으로 선언된 것을 볼 수 있죠?


매개변수에 디폴트값을 몇 가지 규칙이 있습니다. 첫 번째로는 함수의 선언부에서만 지정해주어야합니다. 보통 선언과 정의를 따로 하기 때문에 범하는 실수 중에 하나가 다음과 같은데요.


void Function(int sample = 1);


void Function(int sample) {

cout << sample << endl;

}


이런 식의 실수는 컴파일 에러가 발생합니다. 디폴트 값을 지정해 줄 때는 선언부에서만 지정 해주면 됩니다.


void Function(int sample = 1);


void Function(int sample) {

cout << sample << endl;

}


이게 올바른 표현인 것이죠. 

두 번째로는 디폴트 값을 지정해줄때는 오른쪽 매개변수부터 순서대로 채워 넣어야합니다.


void Function(int sample = 1, int sample2); ( X )


void Function(int sample, int sample2 = 1); ( O )


그 이유는 여러분도 한 번 고민해 보시기 바랍니다. 너무 당연한것이니까요. 그럼 여기서 이런 경우에는 어떤 함수가 호출 될까요??



위의 경우는 보시다시피 빨간줄이 생깁니다. 컴파일에러가 발생하기 때문입니다.



이유는 위와같이 함수에 대한 호출이 애매하기 때문입니다. 컴파일러가 어떤 함수를 호출해야할지 얼타고 있기 때문에 에러가 발생하는 것입니다. ㅎㅎ naming하는 것만큼 어려운일은 없지만 최대한 책을 많이 읽어서 어휘능력을 기르는 수밖에 없을 것같습니다. 긴 글 읽어주시느라 수고많으셨습니다. 도움이 되셨으면 좋겠습니다. 그럼 다음에 또 뵙겠습니다.

반응형

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

C++의 클래스 생성자 & 소멸자  (1) 2017.10.09
C++에서의 동적할당과 해제(new & delete)  (0) 2017.10.06
참조자(reference)  (0) 2017.09.25
네임스페이스(namespace)  (1) 2017.09.25
visual studio DEBUG  (0) 2017.09.17
Comments