1.1.11 함수
프로그램의 크기가 커지면, main() 함수에 모든 코드를 담을 수 없다.
프로그램을 이해하기 쉽게 하려면, 코드의 일부를 의미있는 단위로 쪼개어, 즉 분해(decompose)하여 함수로 만들어야 한다.
다른 코드에서 함수를 이용할 수 있게 하려면, 함수를 선언해야 한다.
함수가 특정 소스 파일 안에서만 사용된다면, 보통 그 파일 안에서 선언과 정의를 모두 하게 된다.
반면 다른 모듈의 소스파일을 이용한다면, 함수 선언은 헤더파일에 위치시키고, 함수정의는 소스 파일에 두게된다.
void myFunction(int i, char c);
리턴타입이 void 임으로 호출자에 아무런 결과를 돌려주지 않는다.
함수 파라미터로 int와 char이 선언되어있기 때문에, 파라미터를 무조건 입력해야 선언할 수 있다.
void myFunction(int i, char c)
{
std::cout << "ths value of i is" << i << std::endl;
std::cout << "ths value of c is" << c << std::endl;
}
위 와같이 함수가 정의되어 있다면, 다음과 같이 선언해야만 한다.
int someInt = 8;
char someCHar = 'B'
myFunction(8, 'a');
myFunction(someIntm 'b');
myFunction(5, someChar);
C++함수는 호출자에 값을 넘겨줄(return)수도 있다.
int addNUmbers(int number1, int number2)
{
return number1 + number2;
}
위 함수는 다음과같이 선언가능하다.
int sum = addNumbers(5, 3);
함수를 정의할 때 에는 다음과 같이 함수의 이름을 담고있는 __func__변수가 자동으로 함수의 로컬 변수로 정의된다.
static const char__func__[] = "function-name";
위와같은 특성은, 함수호출로그를 남길때 사용할 수 있다.
int addNUmbers(int number1, int number2)
{
std::cout << "Entering function" << __func__<<std::endl;
return number1 + number2;
}
함수 정의 문법
C++에서는 C에서 디자인된 함수 정의 문법을 그대로 사용한다.
그러나, C에서 C++로 오면서 많은 기능이 추가도미에 따라. 함수정의 문법 몇몇부분에서 문제가 되고있다.
C++11부터는 리턴타입이 함수 선언문 뒤에 따라오는 '새로운 함수 정의 문법'을 추가적으로 정의하고 있다.
새로운 함수 정의 문법 : alternative function syntax 라고 한다. alternative는 전통적이지 않고 새로운 이라는 뜻... 프로그래머 감성
이 문법은 리턴 타입을 함수 원형 뒷부분에 표기하는데, 보통 경우에는 사용할 일이 없으나,
템플릿 함수에서는 매우 유용하다.
auto func(int i) -> int
{
return i + 2;
}
위와같이 리턴타입을 뒤에 작성한다.
리턴타입이 함수 앞에오는 대신 화살표->로 지정된다.
함수문법은 다르나, 호출방법은 기존과 동일하다.
자동 함수 리턴타입
C++14에서는 컴파일러가 리턴타입을 자동으로 결정하게 할 수 있다.
이 기능을 사용하려면, 리턴타입에 auto를 사용하고, 리턴타입 지정을 생략한다.
auto divideNumbers(double numerator, double denominator)
{
if (denominator == 0) { /* ... */ }
return numerator / denominator;
}
리턴타입을 auto로 해두면, return문의 표현식이 어떤타입을 가지느냐에 따라 리턴타입이 결정된다.
함수안에 return이 여러개일 경우, 모든 return문의 표현식이 항상 같은 타입으로 결정되어야 한다.
auto 리턴타입은 재귀함수에도 사용할 수 있으나, 첫번째 return문은 반드시 재귀호출이 아닌 타입이 결정될 수 있는 일반 표현식 이어야 한다.
즉, 첫번째 리턴문은, 타입이 결정되어 호출되는 return이 되어야 하고, 해당되지 않을경우 재귀가 호출되도록 해야한다.
'전문가를 위한 C++정리' 카테고리의 다른 글
1. C++와 STL 부딪혀보기 1.2 C++ 언어 심화 탐구 1.2.1 포인터와 동적메모리 (0) | 2024.01.09 |
---|---|
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.12 타입 추론 (0) | 2024.01.08 |
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.10 루프 (0) | 2024.01.08 |
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.9 배열 (0) | 2024.01.05 |
1. C++와 STL 부딪혀보기 1.1 C++ 언어의 기초 1.1.8 논리 산출 연산자 (0) | 2024.01.05 |