관리자 글쓰기
C++ 함수
2022. 3. 17. 15:31 - pingu-s

함수

 

C++는 일정의 처리를 종합하여 기술하는 함수(function)라는 기능을 갖추고 있다.

함수를 이용하면 여러 처리를 1개로 종합해 항상 호출해서 사용할 수 있도록 된다.

C++로 함수를 이용하기 위해서는 다음의 2개의 순서를 따라야 한다.

      ① 함수를 작성한다(함수를 정의한다).

      ② 함수를 이용한다(함수를 호출한다).

우선 [함수를 정의한다]는 작업부터 살펴보기로 한다.

 

함수의 정의와 호출

 

함수의 정의

 

함수를 사용하려면 우선 코드 내에서 일정의 종합한 처리를 지정해야 한다. 이것이 함수를 작성하는 작업이 된다. 이 작업을 함수의 정의(function definition)라고 부른다. 함수의 정의는 블록 내에 묶어서 기술한다. 다음의 코드가 함수의 일반적인 형식이다.

 

[구문 : 함수의 정의]

반환값의 형 함수명(인수 리스트) //함수명에는 식별자를 사용한다
{
	문장;
	...

	return 식;
}

[반환 값][인수]라는 익숙하지 않은 용어가 사용되고 있지만 이들의 용어에 관해서는 뒤에서 설명하기로 한다.

여기서는 함수의 큰 이미지만을 살펴보는 것으로 한다.

또한 [함수명]이란 변수의 이름과 같이 식별자(제3장)를 사용해서 붙인 함수의 이름이다. 예를 들면, 다음과 같은 코드가 함수의 정의이다. 이것은 화면에 [차를 구입하였다.]고 출력하는 처리를 수행하는 [buy]라는 이름의 함수이다.

//buy 함수의 정의
void buy()
{
	cout << "차를 구입하였다.\n";
}

buy라는 함수명을 붙이고, 코드 내에 1개의 문장의 처리를 기술한다. 또한 코드의 맨 마지막 } 뒤에는 세미콜론(;)을 붙이지 않는 것에 주의해야 한다.

 

함수의 호출

 

함수를 정의하면 이 종합된 처리를 후에 이용할 수 있다. 함수를 이용하는 것을 함수의 호출(function call)이라고 부른다. 함수를 호출하려면 코드 내에 그 함수명을 다음과 같이 기술한다.

 

[구문 : 함수의 호출]

함수명(인수 리스트);

예를 들면, 앞에서 정의한 함수를 호출하려면

buy();

로 기술한다. 이번은 블록을 기술하지 않는다. 마지막에 세미콜론(;)을 잊지 않도록 해야 한다. 코드 내에 이 함수의 호출이 처리되면, 조금 전에 정의한 함수의 처리가 종합되어 수행되는 것이다.

그러면 다음의 코드를 입력해서 함수의 정의와 호출 방법을 확인해 보기로 한다.

 

예제) 기본적인 함수의 작성

기본적인 함수를 정의하고 호출하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//buy 함수의 정의
void buy()
{
	cout << "차를 구입하였다.\n"; //① buy() 함수의 처리 내용을 기술한다.
}
//buy 함수의 이용
int main()
{
	buy(); //② 여기서 buy() 함수의 처리가 수행된다.

	return 0;
}

위 예제의 코드는 다음의 2개의 부분으로 나누어져 있다는 것에 주목하기 바란다.

  • main() 함수의 부분
  • buy() 함수의 부분

C++에서는 main() 함수로부터 처리를 시작한다. 그래서 여기서도 지금까지와 같이 프로그램이 실행되면 main() 함수의 시작 부분에서 처리가 수행된다.

main() 함수의 최초의 문장에서는 buy() 함수를 호출한다(①). 그러면 처리의 흐름은 buy() 함수로 넘어가고, 함수의 최초의 문장에서 순서대로 처리가 수행된다(②). 그 결과 화면에는 [차를 구입하였다.]라는 문자열이 출력된다.

buy() 함수 내의 처리는 }가 나오면 끝난다. buy() 함수가 종료하면 조금 전의 main() 함수의 처리를 되돌아가는 것으로 된다(③). 여기가 main() 함수의 마지막 부분이므로 이것으로 프로그램이 종료된다.

즉, 함수를 이용하는 코드에서는

① 함수를 호출한다.

② 함수 내부의 처리가 수행된다.

③ 함수 블록 내의 처리가 종료되면, 호출 장소로 처리가 되돌아간다.

 

라는 흐름으로 처리가 수행된다.

 

예제) 함수를 여러 번 호출

함수의 흐름을 좀 더 이해하기 위해 한 번 더 다음과 같은 코드를 작성해 보도록 한다. 이번은 함수를 2회 호출해 보는 것으로 한다.

#include <iostream>
using namespace std;

//buy 함수의 정의
void buy()
{
	cout << "차를 구입하였다.\n";
}
//buy 함수의 이용
int main()
{
	buy(); //① buy() 함수의 처리가 수행된다.

	cout << "차를 1대 더 구입하였다.\n";

	buy(); //② 한 번 더 buy() 함수를 호출한다.

	return 0;
}

이 코드에서는 우선, main() 함수의 첫째 문장에서 buy() 함수의 처리가 수행된다(①). 이 처리가 종료되었다면 main() 함수로 돌아가는데, [차를 1대 더 구입하였다.]라는 문자열이 출력된다(②~④).

그리고 한 번 더 buy() 함수의 호출이 수행된다(⑤). 이번도 똑같은 반복이 수행된다(⑥~⑦). 실행 결과를 보면 함수가 2회 호출된다는 것을 알 수 있다.

 

함수 처리의 종합

 

그런데 이와 같은 함수의 처리를 귀찮게 생각하는 경우도 있을 수 있다. 지금까지 보아온 buy() 함수는 보통 1개의 문장을 처리할 뿐이기 때문에 이를 함수로 특별히 정의할 필요는 없다. 함수를 사용하지 않고 main() 함수 내에 화면 출력의 처리를 모두 기술하는 편이 더 간단하다. 즉, 다음과 같은 코드를 기술해도 위 예제와 같은 결과로 된다.

#include <iostream>
using namespace std;

int main()
{
	cout << "차를 구입하였다.\n";
	cout << "차를 1대 더 구입하였다.\n";
	cout << "차를 구입하였다.\n";

	return 0;
}

그러나 좀 복잡한 코드에서는 어떠한가. 함수에는 여러 가지 복잡한 처리를 정의할 수 있다. 예를 들면, 다음과 같은 buy() 함수를 생각해 보기로 한다.

//buy 함수의 정의
void buy()
{
	cout << "통장을 자동 현금 지급기에 넣는다.\n";
	cout << "비밀 번호를 입력한다.\n";
	cout << "금액을 지정한다.\n";
	cout << "돈을 인출한다.\n";
	cout << "돈과 통장을 확인한다.\n";
	cout << "차를 구입하였다.\n";
}

이 buy() 함수는 6개의 문장으로 된 처리를 종합한 것이다. 이와 같은 복잡한 처리도 종합해서 정의해 두면 편리하다. 차를 구입하는 처리를 하도 싶을 때는 다음과 같이 짧은 함수명을 사용해서 일련의 처리를 간단하게 호출할 수 있기 때문이다.

buy();

차를 구입할 때마다 6개의 문장을 여러 번 기술할 필요는 없다. 함수를 사용하면 보통 1개의 문장을 기술할 뿐이다.

또한 main() 함수에 여러 가지 처리를 길게 기술해가면, 큰 프로그램 내에는 어떻게 처리가 수행되는지 매우 알기 어렵게 된다.

함수를 사용하면 종합된 처리에 이름을 붙여 기술함으로써 알기 쉬운 코드로 할 수 있다. 함수는 복잡한 코드를 기술하기 위해 부족하지 않은 기능이다.

 

인수

 

인수를 사용한 정보의 전달

 

함수는 처리를 종합하는 것에 추가해서 더욱 유연한 처리를 수행하는 방법도 준비되어 있다.

함수를 호출할 때에 호출하는 곳에서 함수 내에 무엇인가 정보(값)를 전달하고, 그 값에 대응하는 처리를 수행할 수 있도록 되어 있다. 함수에 전달하는 정보를 인수(argument)라고 한다. 인수를 사용하는 함수는 다음과 같은 내용으로 기술한다.

//buy 함수의 정의
void buy(int x) //int형의 인수를 준비한다.
{
	cout << x << "만원의 차를 구입하였다.\n"; //인수를 함수 내에 사용한다.
}

이 buy() 함수는 호출하는 곳에서 호출될 때 int형의 값 1개를 함수 내에 넘기도록 정의한 것이다. 함수의 () 내에 있는 [int x]를 인수라고 부른다. 인수 x는 이 함수 내에서만 사용할 수 있는 int형의 변수로 되어 있다.

변수 x(인수)는 함수가 호출되었을 때에 호출 장소에 넘겨지는 int형의 값이 저장된다. 이 때문에 변수 x의 값은 함수 내부의 처리에 이용할 수 있도록 되어 있다. buy() 함수에서는 넘겨진 값을 출력하는 처리를 수행하는 것이다.

 

또한, 변수 x는 buy() 함수 내 이외의 장소에서는 사용할 수 없다. buy() 함수 이외의 장소에 값을 대입하거나 출력할 수 없다. 즉, 이 변수 x를 main() 함수 내에서는 사용할 수 없다는 것에 주의해야 한다.

실제로 인수를 가지는 buy() 함수를 호출해 보자. 인수를 가지는 함수를 호출할 때에는 함수 호출문의 () 내에 지정해 둔 형의 값을 기술하고 함수에 값을 넘긴다.

 

예제) 인수를 가지는 함수의 사용

buy() 함수를 인수를 가지는 함수로 정의하여 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//buy 함수의 정의
void buy(int x) //① 값을 받는 가인수가 있는 함수를 정의한다.
{
	cout << x << "만원의 차를 구입하였다.\n"; //받은 값을 출력한다.
}

//buy 함수의 이용
int main()
{
	buy(20); //② 실인수로 20을 넘기고 호출한다.
	buy(50); //③ 실인수로 50을 넘기고 호출한다.

	return 0;
}

이 main() 함수 내에서는

처음에 buy() 함수를 호출할 때, [20]이라는 값을 넘기고 호출한다.
다음에 buy() 함수를 호출할 때, [50]이라는 값을 넘기고 호출한다.

는 처리를 수행한다. 값은 buy() 함수의 인수 x에 전달되어 저장된다. 20을 넘겼을 때는 20을, 50을 넘겼을 때는 50이 출력된다. 함수를 호출할 때마다 넘겨진 인수에 대응한 금액이 출력되는 것을 알 수 있다.

이와 같은 함수에서도 넘겨진 인수의 값에 따라 다른 처리를 수행할 수 있다. 인수를 사용하면 유연한 함수를 작성할 수 있다.

또한 함수의 본체에서 정의되어 있는 인수(변수)를 가인수(parameter)라고 부른다. 한편 함수를 호출한 곳에서 넘겨진 인수(값)를 실인수(argument)라고 부른다. 여기서는 변수 x가 가인수, [20]과 [50]이 실인수이다.

 

가인수와 실인수

 

키보드로부터 입력

 

예제) 실인수를 변수의 값으로 사용

인수에 관해 좀 더 이해하기 위해 키보드로부터 입력한 값을 함수 내에 전달하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//buy 함수의 정의
void buy(int x)
{
	cout << x << "만원의 차를 구입하였다.\n";
}

//buy 함수의 이용
int main()
{
	int num;

	cout << "첫번째의 차는 얼마인가? ";
	cin >> num;

	buy(num);

	cout << "두번째의 차는 얼마인가? ";
	cin >> num;

	buy(num);

	return 0;
}

여기서는 호출한 곳에서 함수에 넘기는 실인수로서 main() 함수 내에 준비한 변수 num(의 값)을 사용하였다. 키보드로부터 num에 읽어 들인 값을 함수에 전달하도록 한 것이다.

이와 같이 실인수로서 변수를 사용할 때에는 실인수와 가인수의 변수명은 같지 않아도 상관없다. 여기서는 다른 변수명을 사용해서 코드를 기술한다.

또한 C++에서는 함수에 전달된 것은 실인수 그뿐만 아니라, 거기에 저장된 [값]으로 되어 있다. 이와 같은 인수의 전달 방법을 값 전달(pass by value)이라고 부른다.

 

값 전달

 

여러 개의 인수를 가지는 함수의 사용

 

지금까지 정의한 함수의 인수는 1개뿐이었다. 그런데 함수에는 2개 이상의 인수를 가질 수도 있다. 즉, 함수를 호출할 때에 여러 개의 값을 함수 내에 넘겨서 처리할 수 있다.

 

예제) 여러 개의 인수를 가지는 함수의 사용

앞선 예제의 buy() 함수에서 2개의 인수를 가지는 함수를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//buy 함수의 정의
void buy(int x, int y) //2개의 인수를 가지는 함수를 정의한다.
{
	cout << x << "만원과 " << y <<"만원의 차를 구입하였다.\n";
}

//buy 함수의 이용
int main()
{
	int num1, num2;

	cout << "얼마의 차를 구입하는가? ";
	cin >> num1;

	cout << "얼마의 차를 구입하는가? ";
	cin >> num2;

	buy(num1, num2); //2개의 실인수를 넘긴다.

	return 0;
}

여러 개의 인수를 가지는 함수도 지금까지 와 기본은 똑같다. 단, 호출할 때에 여러 개의 인수를 컴마(,)로 구분하여 지정한다. 이 여러 개의 인수를 인수 리스트라고 부른다. 그러면 구분된 순으로 실인수의 값이 가인수에 전달된다.

즉, 위 예제의 buy() 함수에서는 다음과 같이 값이 전달된다.

 

가인수   실인수
x num1의 값
y num2의 값

 

여러 개의 인수

 

또한, 가인수와 다른 수의 실인수를 넘겨서 함수를 호출할 수는 없다. 예를 들면, 2개의 인수를 사용하는 buy() 함수를 정의한 경우는 인수를 1개만 지정하여 호출할 수는 없기 때문에 주의해야 한다.

//buy 함수의 호출
...
buy(num1, num2); //가인수에 실인수를 전달한다.
buy(num1); //에러가 발생한다.

 

인수가 없는 함수의 사용

 

함수 내에는 최초에 정의한 buy() 함수와 같이 [인수가 없는 함수]라는 것도 있다. 인수가 없는 함수를 정의할 때는 무지정으로 하든지, 또는 인수의 형으로 void라는 특수한 형명을 지정한다.

//buy 함수의 정의
void buy()
{
	cout << "차를 구입하였다.\n";
}

이와 같은 함수를 호출할 때는 () 내에 값을 지정하지 않고 호출한다.

인수가 없는 함수의 호출 방법은 아래와 같다.

//buy 함수의 호출
...
buy(); //인수를 전달하지 않고 호출한다.

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

C++ 함수3  (0) 2022.03.26
C++ 함수2  (0) 2022.03.21
C++ 반복문2  (0) 2022.03.16
C++ 반복문  (0) 2022.03.11
C++ 제어문2  (0) 2022.03.10