프로그래밍 지식/C++

C++문법/ 디폴트 매개변수, Default Parameter

게임이 더 좋아 2021. 11. 30. 18:05
반응형
728x170

C에서 C++에 새로 추가된 기능인 디폴트 매개변수에 대해서 알아보자

 


 

디폴트 매개변수는 이름에서도 알 수 있듯이 

함수 호출에서 실제 매개변수를 생략했을 경우 실제 매개변수 대신 사용되는 값이다.

**(함수에서 매개변수를 가끔씩 빼먹어도 작동하는 이유다.)

 

예를 들어, void wow(int n)에서 n이 1로 내정되도록 디폴트 값을 지정했다치자.

그렇게 되면

실제 매개변수를 생략한 채로 wow( )를 호출하면 wow(1)과 같은 수행을 한다.

 

디폴트 매개변수는 정말 큰 융통성을 가져다 주는데

문자열과 n을 매개변수로 사용하여

그 문자열 앞에서부터 n 개 문자를 취하여 반환하는 left()라는 함수가 있다고 하자.

** substr(0, n)이 위에 것 아니냐? 라고 하면 공부 정말 많이한 사람이다.

 

좀 더 정확히 말하면

이 함수는 원래 문자열의 일부를 이루고 있는 새로운 문자열의 포인터를 리턴할 것이다.

 

예를 들면

left( "theory", 3)이라면 리턴되는 값은

"the"라는 새로운 문자열을 구성하고 해당 문자열을 가리키는 포인터를 리턴하게 될 것이다.

만약 매개변수가 생략된 채로 left( "theory" )라고 호출되었으면 2번째 매개변수가 1이라고 가정하고 값을 반환할 것이다.

-> "t" 문자열을 가리키는 포인터를 반환할 것이다.

 

결국 매개변수는 함수의 사용에 융통성을 가져다준다.

하지만 디폴트 값을 무엇으로 하느냐에 따라 유용한 정도가 결정될 것인데..

사람들이 굳이 언급하지 않아도 그렇게 알아듣는 값으로 임시 매개변수의 값을 설정한다면

최고일 것이다.

 

 


 

그렇다면 디폴트 값을 설정하려면 어떻게 해야하는가?

 

함수 원형을 사용하면 된다. 

컴파일러는 함수 원형을 살펴보고 그 함수가 몇 개의 매개변수를 사용하는지 알아낸다.

함수 원형에서 몇 개를 써야하고

실제로 프로그램에서 몇 개를 덜 썼는지 알아낸다.

 

예를 들어 위에 n=1이라는 임시변수로 정했다고 해보자

그렇다면 함수 원형은 이렇게 된다.

char* left(const char *str, int n = 1);

 

반환하는 값이 새로운 문자열을 가리키는 포인터이므로 포인터를 반환하게끔 한다.

그리고 원본 문자열을 변경하지 않을 것이므로 const 참조를 한다.

마지막으로 n 매개변수에 대해서는 디폴트 값 1을 가지게 한다.

 

짜잔 완성.

*참고로 임시변수가 없는 매개변수들은 왼쪽으로 있는 것들은 오른쪽으로 몰아서 넣는다.

예를 들자면

int a(int n, int m = 4; int j = 5); //맞고

int b(int n, int m = 6, int j, ); //오른쪽으로 몰아야하므로 틀렸고

int c(int q= 1, int w = 2, int n = 3); //맞다.

 

이러한 규칙은 왜 정했느냐??

그래야 함수에서 구분이 가능하다.

 

a(3) 이라면  a(3,4,5) 라는 것을 알 수 있지만

매개변수들은 순서대로 나와야하기 때문에

b(3, , 4)와 같은 것은 허용하지 않는다.

 

이러한 디폴트 매개변수는 파이썬의 라이브러리에서 가장 많이 볼 수 있는데

함수에 정말 유용하다.

 

728x90
반응형
그리드형