-
C++_functionProgramming/_C++ 2023. 7. 21. 16:50
1. function
함수는 우리가 반복적으로 사용되는 코드를 하나로 묶고 어떤 입력값을 넣었을때, 결과를 출력해주는것을 생각하면 된다.
구조는 다음과 같은 형식을 갖는다.
#include <iostream> int function(int input) // 반환되는 리턴의 형, 함수의 이름(인수 리스트) { cout << input; // 진행되는 작업 return input; // 리턴값 }
그렇다면 기본적인 함수를 한번 만들어보자.
#include <iostream> using namespace std; int num_sum(int a, int b) // 여기서 a,b는 가인수(parameter) { return a+b; } void test_cout() { cout << "check_test" << endl; } int main() { // 여기서 a,b는 실인수(argument) int a=1; int b=2; int result=num_sum(a,b); // num_sum 함수에 a,b를 대입하여 결과를 얻음. cout << result; test_cout(); }
위의 num_sum이라는 함수는 a, b를 입력값으로 받아서 합한 결과를 출력하는 함수이고 test_cout함수는 "check_test"를 출력하는 함수이다.
이처럼 다향한 형태의 함수를 만들수 있으며, 다양한 방법으로 사용할 수 있다.
또한, 한번 만든 함수는 여러번 사용할 수 있다.
함수가 입력으로 받는 부분을 인수라고 하며, 우리가 인수를 넣어줄때 그 type에 맞는 인수를 넣어줘야 합니다. 이때 함수의 본체에 정의된 인수(변수)를 가인수(parameter)라고 부르고 함수를 호출할 때 전달되는 인수(값)를 실인수(argument)라고 부릅니다.
- inline function(인라인 함수)
함수를 사용하는 코드는 함수를 사용하지 않는 코드에 비해 실행시간이 길어진다. 특히 여러 번 호출되는 작은 함수의 경우, 이 시간조차 무시할 수 없을 때가 많다.
이러한 경우 inline function을 사용하면 매우 편리하다.
inline function은 다음과 같은 형태를 갖는다.
inline type function_name(인수리스트) { ... }
예시
#include <iostream> using namespace std; inline int num_sum(int a, int b) {return a+b;} inline int max(int a, int b) {if(a>b) return a; else return b;} int main() { int a=3; int b=1; int result1 = num_sum(a, b); cout << result1 << endl; int result2 = max(a, b); cout << result2 << endl; }
기존의 함수와 차이는 구하는 코드가 호출되어야 하는 지점에 컴파일러가 코드를 통째로 써넣는다는 점이다. 인라인 함수의 몸체는 컴파일러에 의해 호출 부분에 직접 기록이 되어 전체적으로 코드의 속도를 향상할 수 있다는 장점이 있다.
하지만, 너무 긴 코드는 컴파일러가 인라인 함수로 인정하지 않는다고 한다.
inline function은 간단한 처리만 할 수 있는 것으로 쓰도록 하자.
- function declaration(함수 프로토타입 선언)
우리가 함수를 작성할 때 main() 함수 전에 작성을 하고 main()함수에서 호출을 하지만, main()함수 이후에 함수를 호출할 수도 있다. main()함수 이후에 함수를 호출하려고 하면 함수 프로토타입 선언(function declaration)을 해야 한다.
#include <iostream> using namespace std; // function declaration int num_sum(int a, int b); int main() { int a=2; int b=1; int result = num_sum(a,b); cout << result; return 0; } int num_sum(int a, int b) { return a+b; }
함수 선언, 함수 프로토타입 선언시 기본인수(default argument)를 지정할 수 있다.
예를들어 미리 인수를 지정하였다면, 그 인수를 사용하게 된다.
#include <iostream> using namespace std; int num_sum(int a=5, int b=4) { return a+b; } int main() { int a=2; int b=1; int result = num_sum(a,b); cout << result << endl; // default argument result = num_sum(); cout << result << endl; return 0; }
- function overloading(함수의 오버로딩)
우리가 함수를 만들면서 이름이 같을 수 있는데 이로인해 type과 인수의 개수가 다르면서 이름만 같은 함수 여러개가 만들어질 수 있다. 이를 function overloading이라 한다.
#include <iostream> using namespace std; int num_sum(int a, int b) { return a+b; } float num_sum(float a, float b) { return a+b; } int main() { int a=2; int b=1; float c = 1.5; float d = 3.3; int result1 = num_sum(a,b); cout << result1 << endl; float result2 = num_sum(c,d); cout << result2 << endl; return 0; }
num_sum이라는 함수의 이름은 같지만, 결과는 type에 따라 type에 맞는 함수를 사용한다. 이는 그 이름과 일치하는 함수 중 같은 type과 인수의 개수가 일치하는 함수를 자동으로 호출한다.
하지만, 오버로드를 하기 위해 인수의 type과 개수가 기존에 선언된 함수와 달라야 한다.
- function template(함수의 템플릿)
함수를 보다 최적화 할 수 있는 방법은 없을까? C++에서는 함수의 틀을 만들어 다루는 형만 다름 함수를 찍어낼 수 있는 기능이 있다.
function template을 선언하고 정의를 한 이후, 함수를 호출하면 그 함수가 자동으로 만들어진다.
function template의 선언은 다음과 같이 한다.
template <class T> // T는 임시 type T num_sum(T a, T b) { return a+b; }
선언을 했다면, 선언한 template를 사용하면 된다.
#include <iostream> using namespace std; template <class T> // T는 임시 type T num_sum(T a, T b) { return a+b; } int main() { int a=3; int b=5; float c=5.1; float d=1.3; // template 사용 int result1 = num_sum(a,b); cout << result1 << endl; // template 사용 float result2 = num_sum(c,d); cout << result2 << endl; }
다루는 형을 제외하고 다른 요소가 완전히 동일한 함수는 딱 한번만 정의할 수 있다.
- Variable argument(가변인자)
C++에서 가변인자를 사용하기 위해서는 다음의 헤더를 사용하여야 한다.
#include <cstdarg>
C++ reference의 다음 링크를 참고하면 좋다.
https://en.cppreference.com/w/cpp/header/cstdarg
cstdarg헤더를 살펴보면 다음의 타입과 매크로들을 볼 수 있다.
Types va_list Macros va_start va_arg va_copy va_end 다음의 예시를 살펴보며 어떻게 사용되는지 보자.
#include <iostream> #include <cstdarg> using namespace std; int num_test(int n, ...) // n은 받는 인자의 갯수, ...은 n개의 인자 { va_list v_list; // va_list type의 v_list를 선언 va_list copy_list; va_start(v_list, n); // va_start를 통해 va_list가 어디를 가리키는지 설정 va_copy(copy_list, v_list); // v_list를 복사 for(int i=0; i<n; i++) { int temp = va_arg(v_list, int); // 인수에 엑세스 int copy = va_arg(copy_list, int); cout << temp << " " << copy << " "; } va_end(v_list); // 인수처리 종료 } int main() { num_test(3, 1, 2, 3); }
'Programming > _C++' 카테고리의 다른 글
C++_map (0) 2023.07.27 C++_address_pointer_reference (0) 2023.07.25 C++_for_while_(loop statement) (0) 2023.07.20 C++_if (conditional statement, 조건문) (0) 2023.07.20 C++_upper_lower (0) 2023.06.16