프로그래밍 공부
작성일
2024. 1. 8. 19:28
작성자
WDmil
728x90

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이 되어야 하고, 해당되지 않을경우  재귀가 호출되도록 해야한다.

 

728x90