이번 포스팅에서는 C++ 함수의 기초에 대해서 다뤄보자.
함수는 매개변수(parameter)를 통해 값을 전달받아 정해진 작업에 따라서 처리하고, 결과를 반환(return)하는 코드 블록이다.
C++의 함수는 다음과 같이 구성된다(C언어도 동일하다).
리턴타입 함수이름(매개변수 이름들){
정해진 작업문
결과 리턴문
}
예시는 다음과 같다.
int adder(int a, int b){
int sum;
sum = a+b;
return sum;
}
함수에게 일을 지시하고, 결과를 받아가는 것을 함수 호출이라고 부른다. 함수를 호출할 때는 매개변수에 값을 넘겨주고, 결과를 받아와야 한다.
int n = adder(123, 234);
그러면 함수를 작성하고 호출하는 예시 코드를 한번 보자.
# include <iostream>
using namespace std;
int adder(int a, int b) {
int sum;
sum = a + b;
return sum;
}
int main() {
int n = adder(123, 345);
cout << "sum = " << n << endl;
int a, b;
cout << "두 정수를 입력하세요>>";
cin >> a >> b;
n = adder(a, b);
cout << a << "와 " << b << "의 합은 " << n << "입니다." << endl;
}
함수를 호출하고 전달받을 때 리턴 타입을 맞출 필요가 있다. 예를 들어 아무 값도 리턴하지 않는 void 타입의 함수를 다른 자료형에 넣으면 컴파일 오류가 발생한다.
함수를 호출할 때, 반드시 함수에 선언된 매개변수 개수만큼만 값을 전달해야 한다. 그리고 선언한 매개변수의 타입에 맞는 값을 전달해야 한다. 둘 다 하지 않을 경우 컴파일 오류가 발생한다.
변수를 선언하고, 추후에 값을 부여하는 것처럼, 함수의 형식만 선언한 것을 함수의 원형(prototype)이라고 부른다. 예를 들어, 위에서 예시로 든 adder 함수의 원형은 다음과 같다.
int adder(int a, int b);
함수의 원형을 선언하는 이유는 함수 이름, 매개변수 타입과 개수, 리턴 타입을 미리 선언함으로써 컴파일러에게 함수의 형식을 알려주어, 함수의 호출 문장이 정확한지 판단하는 것을 돕기 위함이다.
또한 코드 맨 위에 함수 원형을 미리 선언해놓은 경우, 함수를 가장 밑부분에다가 작성해도 된다(어디에 작성해도 된다). 만약 그렇지 않고(원형을 선언하지 않고) 함수를 호출한 다음에, 함수를 그 뒤에 작성하게 되면 컴파일 오류가 발생한다. 이는 컴파일러가 호출 코드를 해석할 때 함수를 정확히 알고 확인할 수 없기 때문이다.
# include <iostream>
using namespace std;
int adder(int a, int b);
int main() {
int n = adder(123, 345);
cout << "sum = " << n << endl;
int a, b;
cout << "두 정수를 입력하세요>>";
cin >> a >> b;
n = adder(a, b);
cout << a << "와 " << b << "의 합은 " << n << "입니다." << endl;
}
int adder(int a, int b) {
int sum;
sum = a + b;
return sum;
}
이런 식으로 선언하면 된다.
함수의 매개변수로 배열도 전달이 가능하다. 예를 들어보자.
int addArray(int a[], int size){
...
}
// 배열과 배열의 크기를 매개변수로 지정
위 함수는 다음과 같이 쓸 수 있다.
int n[5] = {1,2,3,4,5};
int s = addArray(n,5);
int m[3] = {1,2,3};
int t = addArray(m,3);
배열을 매개변수로 받을 때는, 함수의 매개변수 목록에 굳이 배열의 크기를 쓸 필요 없다는 것을 주의하자. 또한, 선언한 매개변수 a를 통해 배열에 접근하여 배열의 값을 읽거나 수정할 수 있다.
다음 코드는 배열을 매개변수로 가진 함수를 선언하고, 함수를 호출하는 코드이다.
# include <iostream>
using namespace std;
int addArray(int a[], int size);
void makeDouble(int a[], int size);
void printArray(int a[], int size);
int main() {
int n[] = { 1,2,3,4,5 };
int sum = addArray(n, 5);
cout << "배열 n의 합은 " << sum << "입니다." << endl;
makeDouble(n, 5);
printArray(n, 5);
}
int addArray(int a[], int size) {
int i, sum = 0;
for (i = 0; i < size; i++) {
sum += a[i];
}
return sum;
}
void makeDouble(int a[], int size) {
int i;
for (i = 0; i < size; i++)
a[i] *= 2;
}
void printArray(int a[], int size) {
int i;
for (i = 0; i < size; i++)
cout << a[i] << ' ';
cout << endl;
}