ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++_function
    Programming/_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

     

    Standard library header <cstdarg> - cppreference.com

    This header was originally in the C standard library as . This header provides support for C-style variadic functions, while the C definition of "default argument promotions" is replaced with the C++ definition. [edit] Synopsis namespace std { using va_lis

    en.cppreference.com

    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
Designed by Tistory.