민돌이2 2022. 7. 20. 16:09

함수는 C++ 프로그램을 구성하는 모듈(module) 일뿐만 아니라, OOP 정의에 필수적인 사항이다. C++ 함수는 두 가지 유형이 있다. 반환값(리턴값)이 있는 것과 없는 것. 표준 함수 라이브러리에 있는 함수를 사용할 수도 있고, 사용자가 직접 만들어 사용할 수도 있다. 

 

 

리턴값이 있는 함수

리턴값이 있는 함수는 변수에 대입할 수 있는 하나의 값을 만들어 낸다. 예를 들어, C/C++ 표준 라이브러리에는 어떤 수의 제곱근을 리턴하는 sqrt()라는 함수가 있다.

double x = sqrt(6.25);

위 코드에서 sqrt(6.25) 라는 코드가 sqrt() 함수를 호출한다. 이를 함수 호출(function call)이라 하고, 호출되는 sqrt() 함수를 피호출 함수(called function)라 한다. 또한 함수 호출이 들어 있는 함수를 호출 함수(calling function)라 한다.

함수 호출 문법

다만 함수를 사용하기 전에 C++ 컴파일러는 그 함수가 어떤 종류의 매개변수를 사용할 것이며, 어떤 종류의 리턴값을 리턴하는지 미리 알고 있어야 한다. 이런 정보가 없다면 컴파일러는 리턴값을 어떻게 처리할지 판단할 수 없게 된다. C++는 함수 원형(function prototype) 구문을 사용하여 이런 정보를 컴파일러에게 전달한다.

double sqrt(double); //함수 원형

프로그램에서 sqrt() 함수를 사용하려면 함수 원형을 제공해야 한다. 함수 원형을 제공하는 방법은 두 가지가 있다.

  • 함수 원형을 소스 코드 파일에 직접 입력한다.
  • 함수 원형이 들어 있는 cmath 헤더 파일을 포함시킨다.

함수 원형을 제공하기 위해 위의 두 가지 방법 어떤 것을 사용하던, 함수가 사용되는 곳 보다 위에 있어야 한다. 만약 함수 원형이 함수보다 아래에 있다면 컴파일러는 함수를 인식하지 못한다. 관행적으로 main() 함수 정의 앞에다가 함수 원형을 둔다. 하지만, 그냥 소스 코드 맨 위에 차례로 모아두는 게 보기도 편하다.

 

 

변이 함수들

어떤 함수는 하나 이상의 매개변수를 요구한다. 예를 들어, 수학 함수인 pow() 는 매개변수를 2개 요구한다. 함수는 복수의 매개변수를 콤마(,)로 분리한다.

double pow(double, double); //2개의 매개변수를 가진 함수 원형

double answer = pow(5.0, 8.0);

 

 

 

사용자 정의 함수

표준 C 라이브러리는 140개 이상의 미리 정의된 함수를 제공한다. 이들 중에 자신의 프로그래밍 요구에 적합하다면 그것을 사용하지만, 그렇지 않다면 사용자가 직접 함수를 작성해야 한다. 라이브러리 함수와 마찬가지로, 사용자 정의 함수도 그 이름을 불러서 호출한다. 또한 사용하기 전에 함수의 앞에 반드시 그 함수의 원형을 두어야 한다.

#include <iostream>

void simon(int); //simon()의 함수 원형

int main()
{	
	using namespace std;

	simon(3); //simon() 함수 호출
	cout << "정수를 하나 고르시오: ";
	int count;
	cin >> count;
	simon(count); //simon() 함수 호출
	cout << "끝!" << endl;

	return 0;
}

void simon(int n) //simon() 함수 정의
{
	using namespace std;
	cout << "Simon 왈, 발가락을 " << n << "번 두드려라. " << endl;
}

 

함수를 정의하는 방법은 main() 함수 모양과 동일하다.

type functionname(argumentlist)
{
	statement
}

함수는 main() 함수의 몸체 밖에 있다. 즉, 각각의 함수는 서로 독립되어 있다. 모든 함수는 동등한 자격으로 만들어진다.

 

 

리턴값이 있는 사용자 정의 함수

함수 머리에 리턴형을 지정하고 함수 몸체에 return을 사용한다. 

int stonetolb(int sts)
{
	int pounds = 14 * sts;

	return pounds;
}

함수 머리의 리턴형과 return pounds의 pounds가 같은 정수형이라는 것을 봐야 한다. 즉, 리턴형과 리턴하는 값의 자료형은 같아야 한다.

 

 

복수 함수 프로그램에 using 지시자 넣기

복수 함수가 cout을 사용하고, std 이름 공간에 있는 cout 정의에 접근할 필요가 있을 때, 매번 함수 안에 using 지시자를 사용하지 않아도 된다.

#include <iostream>
using namespace std;

void simon(int);

int main()
{	
	simon(3);
	cout << "정수를 하나 고르시오: ";
	int count;
	cin >> count;
	simon(count);
	cout << "끝!" << endl;

	system("Pause");

	return 0;
}

void simon(int n)
{
	cout << "Simon 왈, 발가락을 " << n << "번 두드려라. " << endl;
}

현재의 우세한 철학은, 접근이 필요한 함수들만 차별적으로 std 이름 공간에 접근 할 수 있도록 제한하는 것이다. 즉, std 이름 공간이 필요한 함수에서만 using namespace std;를 선언하는 것이다.

728x90