본문 바로가기
Program Language/c++

C++ 기초(함수)

by 토담이아빠 2023. 1. 5.

함수

 

이글은 "전문가를 위한 c++(개정4)" 학습한 내용을 직접 실습해보며 정리한 Review 글입니다.


함수

 

코드 작성 시 모든 내용을 하나의 main() 안에 담으면 코드의 가독성도 떨어지고 관리도 힘들어집니다. 따라서 코드는 역할별로 구분하여 함수단위로 작성해야합니다.  c++에서 함수를 사용하려면 사용하려는 위치보다 앞에 선언해야합니다. 혹은 선언 위치에 구현내용을 담을 수도 있습니다. 그리고 함수를 다른 모듈에서도 사용하고 싶으면 선언은 헤더 파일에 작성하고 구현은 소스파일에 작성합니다. (이 경우도 물론 헤더 파일에 선언과 동시에 구현 내용을 넣을 수 있지만 내용이 외부에 드러나기 때문에 권장하지는 않습니다.)

 

함수를 선언하는 문장을 함수 프로토타입(function prototype, 함수 원형) 또는 함수 헤더(function header)라 부릅니다. 또한 함수의 리턴타입을 제외한 함수 이름과 매개변수 목록을 함수 시그니처(function signature, 함수 서명)이라고 부릅니다.

 

다음은 함수를 선언하는 함수 프로토 타입을 보여줍니다. 리턴타입은 void로 지정했는데 이는 리턴값이 없다는 뜻입니다. 또한 이 함수를 호출하려면 반드시 두개의 인수를 지정해야합니다.


void myFunction(int i, char c)

만약 위 함수 처럼 선언만하고 구현을 하지 않으면 컴파일 시 링크 에러가 발생합니다.


#include <iostream>
 
using namespace std;
 
void myfunction(int i, char c);
 
int main()
{	
 
	myfunction(10, 'a'); //함수 구현을 하지않으면 링크 에러가 출력됩니다.
	return 0;
}

링크 에러


함수의 구현은 위에서 언급했듯이 선언과 분리할 수도 있고 같이할 수도 있습니다.


#include <iostream>
 
using namespace std;
 
//함수 선언과 구현을 따로 한다.
void myfunction(int i, char c); // 함수 선언
 
void myfunction(int i, char c)  // 함수 구현
{
	cout << "the value of i is " << i << endl;
	cout << "the value of c is " << c << endl;
}
 
//함수 선언과 구현을 동시에 한다.
void myfunction2(float f)
{
	cout << "the value of i is " << f << endl;
}
 
int main()
{	
 
	myfunction(10, 'a');
	myfunction2(10.5f);
 
	return 0;
}

결과


함수는 당연히 호출한 측으로 값을 리턴할 수 있습니다. 예를 들어 두 수를 더한 결과를 리턴하려면 다음과 같이 작성합니다.


int addNumber(int number1, int number2)
{
	return number1 + number2;
}

호출하는 쪽에서는 다음과 같이 작성합니다.


int sum = addNumber(2, 3);

리턴 타입의 경우 auto 키워드를 사용해서 컴파일러가 자동으로 지정하게 할 수 있습니다.


auto addNumber(int number1, int number2)
{
	return number1 + number2;
}

호출 하는 쪽도 auto 키워드를 사용할 수 있습니다.


auto sum = addNumber(2, 3);

컴파일러는 return문이 나오면 표현식의 타입에 따라 리턴타입을 추론합니다. 함수 안에 리턴타입이 여러개일 경우 반드시 각 타입은 모두 같아야 합니다.. 또한 리턴 타입으로 재귀호출을 지정할 수 있는데 이 때 비재귀 호출 return문도 반드시 함께 지정해야합니다. 다음은 재귀호출을 이용해 factorial 함수를 사용하는 예입니다.


#include <iostream>
 
using namespace std;
 
 
auto factorial(int number)
{
	if (number <= 1) {
 
		return 1; //비 재귀 호출 리턴문이 반드시 있어야 한다.
	}
 
	return number*factorial(number - 1); //재귀 호출 리턴문
	
}
 
 
int main()
{	
	int maxNumber = 4;
	auto result = factorial(maxNumber);
	cout << "1에서 "<< maxNumber <<"까지 수의 곱 : " << result << endl;
	return 0;
}

결과


함수마다 내부적으로 __func__라는 로컬 변수가 정의되어 있습니다. 이 변수는 현재 함수의 이름을 값으로 갖고 있으며, 주로 로그를 남기는데 활용합니다. 아래는 그 사용 예입니다.


#include <iostream>
 
using namespace std;
 
 
int addNumber(int number1, int number2)
{
	cout << "사용 함수 : " << __func__ << endl;
	return number1 + number2;
}
 
 
int main()
{	
	auto result = addNumber(2, 3);
	cout << "두 수의 합 : " << result << endl;
	return 0;
}

결과

 

'Program Language > c++' 카테고리의 다른 글

c++ 기초(c++ 스타일 배열)  (0) 2023.01.06
c++ 기초(C 스타일 배열)  (0) 2023.01.05
c++ 기초(논리 연산자)  (0) 2023.01.04
C++ 기초(조건 연산자)  (0) 2023.01.04
C++ 기초(조건문(switch/case))  (2) 2023.01.03

댓글