C++에서 (C언어에서는 지원되지 않음) 함수가 호출될 때 입력 인자에 값이 넘어오지 않는다면 미리 정해진 값을 함수 내부에서 가지도록 할 수 있다. 이렇게 기본값을 가지는 함수의 인자를 기본값 인자(default parameter)라고 하며 함수의 선언부에서 예를 들면 다음과 같이 명시해 주어야 한다.
void func(int ia=0); // 함수의 선언에 ia의 기본값을 10으로 지정….int func(int ia) { //함수 정의. ia는 기본값 10을 가진다.return ia+10;} |
변수 ia는 호출될 때 값이 넘어오지 않으면 자동으로 0값을 가지도록 선언되었다. 즉, 이 함수를 호출할 때 입력인수를 주어도 되고 안 해도 된다.
func(); // 변수 ia는 0값을 자동으로 갖는다.func(10); // 변수 ia에 10값을 넘겨준다. |
만약 디폴트 입력 인수기능이 없이 함수 중복으로만 이를 구현한다면 다음 그림의 좌측과 같이 두 개의 함수를 별도로 작성해야 할 것이다.
void func() { int ia = 0; // 함수 본체 .... }
void func(int ia) { // 함수 본체 .... } | ⇒ | void func(int ia = 0); |
함수 중복으로 구현한 경우 | 디폴트 입력 인수 함수로 간략화 |
이것을 살펴보면 기본 인자 기능이 프로그램을 상당히 간결히 해주는 유용한 기능임을 알 수 있다.
#include "stdio.h"void print(char *name = "John");// 기본값을 지정int main(void){print();print("Jang-Hyun Park");}void print(char *name){printf("Hi. My name is %s\n", name);} |
Hi. My name is JohnHi. My name is Jang-Hyun Park |
다른 예를 들어보면 다음과 같다.
void send(int ia, string str=“Hello”); |
이 함수는 다음과 같이 두 가지로 호출이 가능하다.
send(10);send(10, “Hi”); |
기본값 인자가 설정된 변수만 생략 가능하다는 점에 유의해야 한다. 따라서 다음과 같은 호출은 오류를 발생시킬 것이다.
send(); //오류 발생send(“Hi”); //오류 발생 |
만약 다음과 같이 디폴트 입력 인수를 두 개 가진 함수라면
void sum(double da, double db=10.0, double dc=20,0); |
다음과 같이 세 가지 방법으로 호출할 수 있다.
sum(1.0); // da는 1.0, db는 10.0, dc는 20.0 값을 갖는다.sum(1.0, 2.0); // da는 1.0, db는 2.0, dc는 20.0 값을 갖는다.sum(1.0, 2.0, 3.0); // da는 1.0, db는 2.0, dc는 3.0 값을 갖는다. |
디폴트 입력 인수를 가진 함수를 선언할 때 주의할 점은 이것들이 모두 끝 쪽에 몰려있어야 하며 디폴트 입력 인수를 가지는 변수 다음에 일반 변수는 못 온다는 것이다. 다음 예는 모두 잘못된 것이다.
void sum(int ia, int ib=5, int ic, int id=10);// 에러 발생void sum(int ia=10, int ib, int ic);// 에러 발생 |
그리고 다음과 같은 함수 중복도 오류를 발생한다.
void print(string stra);void print(string stra = “Hello”); // 허용되지 않는 함수 중복 |
그 이유는 두 함수가 입력 인수의 개수와 형이 같기 때문이다. 그리고 다음과 같은 함수 중복도 오류를 발생한다.
void func(int ia, string strA=“Hi”);void func(int ia); // 허용되지 않는 함수 중복 |
두 함수는 분명히 입력 인수의 개수가 다르지만 만약 func(10) 이라고 호출했을 때 두 개 중 어느 것을 호출해도 문제가 없기 때문에 컴파일러는 오류를 발생시킨다.
'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글
C/C++ 제어문 연습 문제 (0) | 2015.05.26 |
---|---|
3장 연산자 연습 문제 (0) | 2015.05.26 |
C++의 함수 중복(overloading) (0) | 2015.05.26 |
C/C++ 연산자의 우선 순위와 결합 방향 (0) | 2015.05.26 |
C/C++ 배열의 선언과 초기화 (part 2 / 2) (0) | 2015.05.26 |