함수를 이야기 할 때 용어들의 혼란이 있다.
인수 (Arguments) 와 매개변수 (Parameters) 가 그들 중 하나인데 왜 그런지 알고 싶다는 생각이 들었다.
간단히 말하면 인수는 전달하는 변수고 매개변수는 전달받은 값을 복사한 변수다. (상수나 포인터도 포함)
테스트하기 위해서 사용자 정의함수를 만들기 전에 먼저 main 함수로 확인해보자.
C++ 프로그램은 main이 먼저 실행되므로 프로그램 실행시 여기에 인수를 넣을 수 있다.
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
cout << endl << "[Main Arguments]" << endl;
cout << "- argument count : " << argc << endl;
for (int i = 0; i < argc; i++)
{
cout << "- argument value : " << argv[i] << endl;
}
return 0;
}
실행시 뒤에 적는 단어가 인수이다. 메인함수의 argc 는 몇개의 정보가 들어오는지 파악한다. *argc[] 는 문자형 포인터 배열로 단어들을 저장할 수 있다. main 함수가 앞머리에 정의한 것들이 받는 값인 매개변수다. 인수가 들어오면 그것을 복사하여 사용한다. 그런데 * 같이 포인터가 오면 값을 저장하는게 아니라 포인터를 복사한다. 참조에 의한 호출(call by reference)는 포인터에 대한 설명인데 main 함수에서 부터 사용하고 있었다.
이렇게 실행시 문자열을 넣어서 보낸다는 것은 초기화나 각종 옵션에 관한 정보를 실행시 같이 보낼 수 있다는 것을 의미한다.
다음은 매개변수에 대하여 알아본다. 지난 포스트에서 지역변수와 전역변수에 대해 설명한 바가 있는데 매개변수는 지역변수다.
C++ | 함수 | 지역변수, 전역변수 | 용어 해설 | 국소변수, 광역변수 | 로컬변수 | 글로벌변수 (tistory.com)
아래의 코드에서 a를 메인에도 정의하고 함수 square 에도 정의했다. 이름이 같은데 문제가 없을까?
main함수와 square 함수는 독립적인 공간을 갖기 때문에 문제없다. 어느 한쪽을 바꿔도 다른 쪽의 값에는 영향을 미치지 않는다. 매개변수도 int a 라고 정의했다. 정의한 위치가 ( ) 괄호안일 뿐이다. 매개변수는 인수를 받아 값을 복사하여 지역변수로 사용한다.
아까 main 함수에서 본 * 이렇게 생긴 매개변수가 있는데 이것은 조금 다른 이야기다. 포인터에서 알게되는데 결론은 주소값을 가져와서 바깥의 변수의 실제 값을 조작할 수 있는 방법이다. 함수를 배운 후 곧 알게 된다.
#include <iostream>
using namespace std;
int square(int a);
int main(int argc, char const *argv[])
{
cout << "[매개변수 사용하기] " << endl;
int a = 10;
cout << "a는 " << a << ", a의 제곱 : " << square(a) << endl;
cout << "a는 그대로이다. a의 값" << a << endl;
return 0;
}
int square(int a){
a = a*a;
return a;
}
반환값 (Return Value) 은 무엇인가? 반환값은 함수가 실행이 종료되고 난 후 자신을 호출한 곳에 돌려주는 값이다. 여기서는 main 함수에서 호출하니까 main 함수에게 사용하라고 돌려주는 값이다. 위에서 보면 수의 제곱을 계산하고 그 값은 main 함수가 가져간다. main 함수에서 cout 으로 출력할 수도 있지만 main 의 지역변수에 할당할 수도 있다.
이렇게 함수와 함수간에 매개변수와 반환값을 통하여 서로 값을 교환하는 일을 할 수 있다. C++ 함수간의 협업을 통해서 일을 진행하므로 큰 프로그램일지라도 여러 모듈(함수 단위)로 나눠서 프로그래밍 할 수 있다.
C++ 은 매개변수의 기본값 (Default value)를 설정할 수 있다.
원래 매개변수가 있는 함수는 호출시 반드시 매개변수를 전달해야 하는데 없는 경우가 있다. 함수의 선언부에 default 값을 지정해 줄 수 있다. 위의 코드에서는 다음과 같이 입력한다.
int square(int a = 9);
인수를 넣지 않아도 컴파일과 실행이 될 것이다. 여기에는 몇가지 규칙이 있는데 현재 단계에서는 이 정도로 충분하다.