C++

C++ 함수(functions) 총정리

김구티2 2024. 3. 16. 12:02

1. 함수의 개념

함수는 입력을 받고, 특정한 계산을 하고, 출력을 내는 일련의 문장이다. 우리가 다른 입력에 대해 같은 코드를 몇 번이고 쓰는 것은 분명 번거로운 일이다. 그래서 일반적으로, 또는 반복적으로 수행되는 작업을 결합하여 함수를 만든다. 간단히 말해서 함수는 호출될 때만 실행되는 코드 블록이다.

 

구문:

 

예시:

// C++ Program to demonstrate working of a function
#include <iostream>
using namespace std;

// Following function that takes two parameters 'x' and 'y'
// as input and returns max of two input numbers
int max(int x, int y)
{
     if (x > y)
          return x;
     else
          return y;
}

// main function that doesn't receive any parameter and
// returns integer
int main()
{
     int a = 10, b = 20;

     // Calling above function to find max of 'a' and 'b'
     int m = max(a, b);

     cout << "m is " << m;
     return 0;
}

 

출력:

m is 20

2. 함수의 필요성

① 함수는 코드 중복을 줄이는 데 도움이 된다. 소프트웨어의 여러 장소에서 함수가 수행되면, 동일한 코드를 작성하는 대신 반복해서 함수를 만들고 모든 곳에 호출한다. 이것은 미래에 함수를 변경하면 한 장소에서만 변경하면 하므로 유지 관리에도 도움이 되는 것이다.
② 함수는 코드를 모듈식으로 만든다. 코드 줄이 많은 큰 파일을 생각해 보자. 코드를 함수로 나누면 코드를 읽고 사용하는 것이 정말 간단해진다.
③ 함수는 추상화를 제공한다. 예를 들어, 우리는 라이브러리 함수를 내부 작업에 대해 걱정하지 않고 사용할 수 있다.

3. 함수 선언

함수 선언은 컴파일러에게 매개 변수의 수, 매개 변수의 데이터 유형 및 반환 함수 유형을 알려준다. 함수 선언에 매개 변수 이름을 쓰는 것은 선택 사항이기야 하지만, 정의에 넣을 필요가 있다.

 

예시:

// C++ Program to show function that takes
// two integers as parameters and returns
// an integer
int max(intint);

// A function that takes an int
// pointer and an int variable
// as parameters and returns
// a pointer of type int
int* swap(int*, int);

// A function that takes
// a char as parameter and
// returns a reference variable
char* call(char b);

// A function that takes a
// char and an int as parameters
// and returns an integer
int fun(charint);

4. 함수의 유형

① 유저 정의 함수

사용자 정의 함수는 큰 프로그램의 복잡성을 줄이기 위해 특별히 맞춤화된 사용자 정의 코드 블록이다. 이 함수는 일반적으로 맞춤형 함수라고도 알려져 있으며, 전체 프로그램의 복잡성을 줄이면서 사용자가 직면한 문제를 만족시키기 위해 만들어졌다.

 

② 라이브러리 함수

라이브러리 함수는 빌트인 함수라고도 한다. 이러한 함수는 이미 정의된 컴파일러 패키지의 일부로, 특별하고 다른 의미를 가진 특수 함수로 구성된다. 빌트인 함수는 정의하지 않고 바로 사용할 수 있는 장점이 존재한다. 사용자 정의 함수에서는 함수를 사용하기 전에 함수를 선언하고 정의해야 하기 때문이다. sqrt(), setw(), strcat() 같은 것들이 라이브러리 함수에 속한다.

5. 함수에 전달되는 파라미터

함수에 전달되는 파라미터를 실제 파라미터라고 한다. 예를 들어, 아래 프로그램에서 5와 10은 실제 파라미터다.
함수에 의해 받는 파라미터를 형식 파라미터라고 한다. 예를 들어 아래 프로그램에서 x와 y가 형식 파라미터다.

파라미터를 통과시키는 방법은 일반적으로 2가지다.

① Pass by Value: 이 파라미터 전달 방식에서는 실제 파라미터의 값이 함수의 형식 파라미터에 복사된다. 실제 파라미터와 형식 파라미터는 서로 다른 메모리 위치에 저장되므로 함수의 변경 사항은 호출자의 실제 파라미터에 반영되지 않는다.

② Pass by Reference: 실제 파라미터와 형식 파라미터 모두 동일한 위치를 참조하므로, 함수 내부에서 변경된 내용은 발신자의 실제 파라미터에 반영된다.

6. 함수 정의

pass by value는 함수 fun()을 사용하여 x 값을 수정하지 않는 경우에 사용된다.

 

예시:

// C++ Program to demonstrate function definition
#include <iostream>
using namespace std;

void fun(int x)
{
     // definition of
     // function
     x = 30;
}

int main()
{
     int x = 20;
     fun(x);
     cout << "x = " << x;
     return 0;
}

 

출력:

x = 20

7. 포인터를 사용한 함수

함수 fun ()은 정수(또는 정수의 주소)에 대한 포인터 ptr을 기대한다. 그것은 주소 ptr에서의 값을 수정한다. 역참조 연산자 *는 주소에서의 값에 접근하는 데 사용된다. *ptr = 30에서 주소 ptr에서의 값은 30으로 변경된다. 주소 연산자 &는 어떤 데이터 유형의 변수의 주소를 얻는 데 사용된다. 함수 호출 문장 fun(&x)에서 x의 주소는 x의 주소를 사용하여 수정할 수 있도록 전달된다.

 

예시:

// C++ Program to demonstrate working of
// function using pointers
#include <iostream>
using namespace std;

void fun(int* ptr) { *ptr = 30; }

int main()
{
     int x = 20;
     fun(&x);
     cout << "x = " << x;

     return 0;
}

 

출력:

x = 30

8. 함수에서 인지해야 하는 점

① 대부분의 C++ 프로그램은 사용자가 프로그램을 실행할 때 운영 체제에서 호출하는 main()이라는 기능을 가지고 있다.

② 모든 함수에는 반환 유형이 있다. 함수가 아무런 값을 반환하지 않으면 void가 반환 유형으로 사용된다. 또한 함수의 반환 유형이 void인 경우에도 함수 정의 본문에서 반환문을 사용할 수 있으며, 아래의 예시과 같이 함수의 종료를 상징하는 '반환' 문만 언급하면 상수, 변수 등을 지정하지 않는다.

 

예시:

void function name(int a)
{
     ....... // Function Body
         return; // Function execution would get terminated
}

 

③ 파라미터 없이 호출할 수 있는 함수를 선언하려면 void fun(void)을 사용해야 한다. 참고로 C++에서 빈 목록은 파라미터 없이만 호출할 수 있는 함수를 의미한다. C++에서 void fun()과 void fun(void)은 모두 동일하다.

9. Main 함수

main 함수는 특수한 함수다. 모든 C++ 프로그램은 main이라는 이름의 기능을 포함해야 한다. 그것은 프로그램의 진입점 역할을 한다. 컴퓨터는 main 함수의 시작부터 코드를 실행하기 시작할 것이다.

 

① 파라미터가 없는 형태

// Without Parameters
int main() { ... return 0; }

 

② 파라미터가 있는 형태

// With Parameters
int main(int argc, char* const argv[]) { ... return 0; }

 

main 함수에 매개변수 옵션이 있는 이유는 명령줄에서 입력을 허용하기 위해서다. 매개변수가 있는 main 함수를 사용하면 프로그램 이름 뒤에 있는 모든 문자 그룹(공간으로 구분)을 argv라는 이름의 배열에 원소로 저장한다.
main 함수에는 반환되는 int의 형태가 있으므로 항상 코드에 반환문이 있어야 한다. 반환되는 번호는 호출 프로그램에 프로그램의 실행 결과가 무엇인지 알려주는 데 사용된다. 반환되는 0은 문제가 없었음을 나타낸다.

10. C++에서의 재귀

같은 함수 내에서 함수를 호출할 때 C++에서는 그것을 재귀라고 한다. 따라서 같은 함수를 호출하는 함수를 재귀 함수라고 한다. 함수 호출 후에 어떤 작업도 수행하지 않고 스스로 호출하는 함수를 꼬리 재귀라고 한다. 꼬리 재귀에서는 일반적으로 리턴문과 함께 같은 함수를 호출한다.

 

구문:

recursionfunction()
{
recursionfunction(); // calling self function
}

11. 함수에 배열 전달

C++에서는 배열 로직을 재사용하기 위해서 함수를 만들 수 있다. C++에서 배열을 함수에 전달하기 위해서는 배열 이름만 제공하면 된다.

 

구문:

function_name(array_name[]); //passing array to function

 

예시:

#include <iostream>
using namespace std;
void printMin(int arr[5]);
int main()
{
     int ar[5] = { 30, 10, 20, 40, 50 };
     printMin(ar); // passing array to function
}
void printMin(int arr[5])
{
     int min = arr[0];
     for (int i = 0; i < 5; i++) {
          if (min > arr[i]) {
              min = arr[i];
          }
     }
     cout << "Minimum element is: " << min << "\n";
}

출력:

Minimum element is: 10

12. C++ 오버로딩 (함수)

이름은 같지만 매개변수의 개수나 종류가 다른 둘 이상의 멤버를 만들면 그것을 C++오버로딩이라고 한다. C++에서는 오버로드가 가능하다. C++에서 오버로딩의 유형으로는 함수 오버로딩, 연산자 오버로딩이 있다. 여기서는 함수 오버로딩만 학습하도록 한다.

 

함수 오버로딩은 이름은 같지만 매개변수가 다른 두 개 이상의 함수를 가지는 과정으로 정의된다. 함수 오버로딩에서는 서로 다른 유형이나 인수를 사용하여 함수를 재정의한다. 컴파일러는 이러한 차이를 통해서만 함수를 구별할 수 있다. 함수 오버로딩의 장점은 동일한 작업에 대해 다른 이름을 사용할 필요가 없기 때문에 프로그램의 가독성을 높인다는 것이다.

 

예시1:

// program of function overloading when number of arguments
// vary
#include <iostream>
using namespace std;
class Cal {
public:
     static int add(int a, int b) { return a + b; }
     static int add(int a, int b, int c)
     {
          return a + b + c;
     }
};
int main(void)
{
     Cal C; // class object declaration.
     cout << C.add(10, 20) << endl;
     cout << C.add(12, 20, 23);
     return 0;
}

출력:

30

55

 

예시2:

// Program of function overloading with different types of
// arguments.
#include <iostream>
using namespace std;
int mul(intint);
float mul(floatint);

int mul(int a, int b) { return a * b; }
float mul(double x, int y) { return x * y; }
int main()
{
     int r1 = mul(6, 7);
     float r2 = mul(0.2, 3);
     cout << "r1 is : " << r1 << endl;
     cout << "r2 is : " << r2 << endl;
     return 0;
}

출력:

r1 is : 42
r2 is : 0.6

 

728x90

'C++' 카테고리의 다른 글

C++ 매개변수 전달 총정리  (0) 2024.03.30
C++ return문 총정리  (0) 2024.03.17
C++ 범위 기반 for문 총정리  (0) 2024.03.14
C++ for, while, do while 루프(Loop) 총정리  (1) 2024.03.14
C++ 점프문 총정리  (1) 2024.03.14