2015년 5월 9일 토요일

C++에서 함수의 기본값 인자 (default parameter)

 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 John
Hi. 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) 이라고 호출했을 때 두 개 중 어느 것을 호출해도 문제가 없기 때문에 컴파일러는 오류를 발생시킨다.

댓글 없음:

댓글 쓰기