프로그래밍/C++

C++ 함수: 정의, 호출, 매개변수, 반환값, 그리고 오버로딩

shimdh 2025. 1. 31. 21:57
728x90

1. 함수의 기본 개념

1.1 함수란 무엇인가?

함수는 특정 작업을 수행하는 코드 블록입니다. C++에서 함수를 사용하면 코드를 재사용하고, 프로그램의 가독성을 높이며, 복잡한 문제를 작은 단위로 나눌 수 있습니다. 함수는 입력을 받아 처리한 후 결과를 반환할 수 있습니다.

1.2 함수의 기본 구조

C++에서 함수를 정의할 때는 다음과 같은 기본 구조를 따릅니다:

반환형 함수이름(매개변수 목록) {
    // 함수 본문
    return 반환값; // 선택 사항
}
  • 반환형: 함수가 실행된 후 반환되는 값의 데이터 타입을 지정합니다. 반환값이 없는 경우 void를 사용합니다.
  • 함수이름: 함수를 호출할 때 사용할 이름입니다. 함수 이름은 의미 있는 이름으로 지어야 코드의 가독성이 높아집니다.
  • 매개변수 목록: 함수에 전달될 입력 값을 정의합니다. 매개변수가 없을 수도 있습니다.

1.3 예제: 두 숫자의 합계 계산

다음은 두 숫자를 더하는 간단한 함수를 정의하고 호출하는 예제입니다:

#include <iostream>
using namespace std;

// 두 숫자의 합계를 계산하는 함수 정의
int add(int a, int b) {
    return a + b;
}

int main() {
    int num1 = 5;
    int num2 = 10;

    // add 함수를 호출하여 결과를 저장
    int sum = add(num1, num2);

    cout << "두 숫자의 합은: " << sum << endl; // 출력: 두 숫자의 합은: 15

    return 0;
}

위 코드에서 add 함수는 두 개의 정수 매개변수를 받아서 그 합계를 반환합니다. main 함수 내에서는 add 함수를 호출하여 결과를 출력합니다. 이처럼 함수를 사용하면 동일한 코드를 반복하지 않고도 여러 번 재사용할 수 있습니다.


2. 매개변수와 반환값

2.1 매개변수(Parameter)

매개변수는 함수를 호출할 때 외부로부터 값을 전달받기 위한 변수입니다. 즉, 함수의 입력으로 작용합니다. 매개변수를 통해 함수가 처리할 데이터를 유연하게 조정할 수 있습니다.

  • 형식:

    return_type function_name(parameter_type parameter_name) {
        // function body
    }
  • 예시:

      int add(int a, int b) {
          return a + b;
      }
    
      int main() {
          int sum = add(5, 10); // 여기서 '5'와 '10'이 매개변수에 전달됩니다.
          std::cout << "Sum: " << sum; // 출력: Sum: 15
          return 0;
      }

위의 예제에서 add 함수는 두 개의 정수형 매개변수를 받습니다 (a, b). 이 값들은 더해져서 결과를 반환합니다.

2.2 반환값(Return Value)

반환값은 함수가 실행된 후 호출자에게 돌려주는 값입니다. C++에서는 모든 함수가 반드시 값을 반환해야 하는 것은 아니지만, 대부분의 경우 어떤 결과를 얻고 싶기 때문에 반환값이 필요합니다.

  • 형식:

    return_type function_name(parameters) {
      // processing...
      return value; // value는 return_type과 일치해야 합니다.
    }
  • 예시:

     double multiply(double x, double y) {
         return x * y; // 곱셈 결과를 반환합니다.
     }
    
     int main() {
         double result = multiply(3.5, 2); // result에 곱셈 결과 저장됨
         std::cout << "Result: " << result; // 출력: Result: 7
         return 0;
     }

이 예제에서 multiply 함수는 두 개의 실수형 매개변수를 받아 그들의 곱을 계산한 후 해당 값을 호출자에게 반환합니다.


3. 함수 오버로딩

3.1 함수 오버로딩이란?

C++에서는 동일한 이름을 가진 여러 개의 함수를 만들 수 있는 기능인 함수 오버로딩이 지원됩니다. 이는 서로 다른 매개변수 목록을 가진 여러 버전의 같은 이름의 함수를 만들게 해줍니다. 오버로딩된 함수들은 컴파일러가 각 호출에 맞는 적절한 버전을 선택하도록 합니다.

3.2 예제: 정수와 실수 덧셈을 위한 오버로딩

다음은 정수와 실수 덧셈을 위한 오버로딩 예제입니다:

#include <iostream>
using namespace std;

// 정숫값 더하기 (오버로드)
int add(int a, int b) {
   return a + b;
}

// 실숫값 더하기 (오버로드)
double add(double a, double b) {
   return a + b;
}

int main() {
   cout << "정숫값 덧셈 결과 : " << add(3, 4) << endl;         // 출력 : 정숫값 덧셈 결과 :7 
   cout << "실숫값 덧셈 결과 : " << add(3.5, 4.5) << endl;   // 출력 : 실숫값 덧셈 결과 :8 

   return 0;
}

위 코드에서는 동일한 이름인 add를 가지고 있지만 하나는 정수형 데이터를 받고 다른 하나는 실수형 데이터를 받습니다. 이렇게 함수 오버로딩을 사용하면 같은 이름의 함수를 다양한 데이터 타입에 대해 사용할 수 있습니다.


4. 함수의 활용 사례

4.1 배열의 최댓값 찾기

함수는 단순한 계산뿐만 아니라 다양한 작업을 수행할 수 있습니다. 예를 들어, 배열의 최댓값을 찾는 함수를 구현할 수 있습니다.

#include <iostream>
using namespace std;

// 배열의 최댓값을 찾는 함수
int findMax(int arr[], int size) {
    int max = arr[0];
    for (int i = 1; i < size; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}

int main() {
    int numbers[] = {3, 7, 2, 9, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);

    int maxValue = findMax(numbers, size);
    cout << "배열의 최댓값은: " << maxValue << endl; // 출력: 배열의 최댓값은: 9

    return 0;
}

이 예제에서는 findMax 함수를 사용하여 배열에서 최댓값을 찾습니다. 함수를 사용하면 코드의 재사용성과 가독성을 높일 수 있습니다.


5. 함수의 고급 활용

5.1 재귀 함수

재귀 함수는 자기 자신을 호출하는 함수로, 복잡한 문제를 간단하게 해결할 수 있습니다. 예를 들어, 팩토리얼을 계산하는 재귀 함수를 작성할 수 있습니다.

#include <iostream>
using namespace std;

// 재귀 함수를 사용한 팩토리얼 계산
int factorial(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

int main() {
    int num = 5;
    int result = factorial(num);
    cout << num << "! = " << result << endl; // 출력: 5! = 120
    return 0;
}

5.2 함수 포인터

함수 포인터는 함수를 가리키는 포인터로, 동적으로 함수를 호출할 수 있게 해줍니다. 함수 포인터를 사용하면 프로그램의 유연성을 높일 수 있습니다.

#include <iostream>
using namespace std;

// 두 숫자의 합을 계산하는 함수
int add(int a, int b) {
    return a + b;
}

// 두 숫자의 곱을 계산하는 함수
int multiply(int a, int b) {
    return a * b;
}

int main() {
    // 함수 포인터 선언
    int (*funcPtr)(int, int);

    // 함수 포인터에 add 함수 주소 저장
    funcPtr = add;
    cout << "합: " << funcPtr(3, 4) << endl; // 출력: 합: 7

    // 함수 포인터에 multiply 함수 주소 저장
    funcPtr = multiply;
    cout << "곱: " << funcPtr(3, 4) << endl; // 출력: 곱: 12

    return 0;
}

6. 결론

C++에서 함수는 코드를 효율적으로 관리하고 재사용 가능하게 만들어 줍니다. 함수의 기본 구조, 매개변수, 반환값, 그리고 함수 오버로딩을 이해하면 더욱 유연하고 강력한 코드를 작성할 수 있습니다. 다양한 형태와 방식으로 함수를 활용하여 프로그램의 가독성과 유지보수성을 높여보세요.

// 예제: 문자열 길이를 구하는 함수
#include <iostream>
#include <string>
using namespace std;

int stringLength(string str) {
    return str.length();
}

int main() {
    int length = stringLength("Hello"); // length에는 5가 저장됩니다.
    cout << "문자열 길이: " << length << endl; // 출력: 문자열 길이: 5
    return 0;
}

이 예제에서는 문자열의 길이를 구하는 stringLength 함수를 정의하고 호출합니다. 이처럼 함수를 사용하면 코드의 재사용성과 가독성을 높일 수 있습니다.

C++ 함수를 잘 활용하면 복잡한 문제를 작은 단위로 나누어 해결할 수 있으며, 코드의 구조를 명확하게 만들 수 있습니다. 여러분도 필요에 맞게 함수를 적극 활용해 보세요!


7. 추가 예제: 문자열 처리 함수

7.1 문자열을 대문자로 변환하는 함수

다음은 문자열을 대문자로 변환하는 함수 예제입니다:

#include <iostream>
#include <string>
#include <algorithm> // transform 함수 사용을 위해 필요
using namespace std;

// 문자열을 대문자로 변환하는 함수
string toUpperCase(string str) {
    transform(str.begin(), str.end(), str.begin(), ::toupper);
    return str;
}

int main() {
    string text = "Hello, World!";
    string upperText = toUpperCase(text);
    cout << "대문자로 변환된 문자열: " << upperText << endl; // 출력: 대문자로 변환된 문자열: HELLO, WORLD!
    return 0;
}

7.2 문자열을 뒤집는 함수

다음은 문자열을 뒤집는 함수 예제입니다:

#include <iostream>
#include <string>
#include <algorithm> // reverse 함수 사용을 위해 필요
using namespace std;

// 문자열을 뒤집는 함수
string reverseString(string str) {
    reverse(str.begin(), str.end());
    return str;
}

int main() {
    string text = "Hello, World!";
    string reversedText = reverseString(text);
    cout << "뒤집힌 문자열: " << reversedText << endl; // 출력: 뒤집힌 문자열: !dlroW ,olleH
    return 0;
}

8. 마무리

이번 포스트에서는 C++ 함수의 기본 개념부터 고급 활용까지 다루었습니다. 함수는 프로그래밍에서 매우 중요한 개념이며, 이를 잘 활용하면 코드의 효율성과 가독성을 크게 높일 수 있습니다. 다양한 예제를 통해 함수를 직접 작성하고 호출해 보면서 실력을 키워보세요!

728x90