cpp

C++ 함수

임베디드 친구 2024. 12. 18. 20:34
728x90
반응형

C++ 함수

C++에서 함수는 코드의 가독성을 높이고 재사용성을 제공하며, 프로그램의 구조를 체계적으로 설계할 수 있게 합니다. 이번 포스팅에서는 함수의 정의와 선언부터 고급 사용법까지 예제와 함께 살펴보겠습니다.


1. 함수란 무엇인가?

함수는 특정 작업을 수행하는 코드 블록입니다. C++에서 함수는 다음과 같은 구조로 정의됩니다:

반환형 함수이름(매개변수 목록) {
    // 함수 내용
    return 반환값;
}

주요 구성 요소

  • 반환형: 함수가 반환하는 값의 자료형을 나타냅니다. 반환값이 없을 경우 void를 사용합니다.
  • 함수 이름: 함수를 호출할 때 사용하는 이름입니다.
  • 매개변수 목록: 함수가 입력으로 받을 값을 정의합니다. 매개변수가 없을 경우 빈 괄호 ()를 사용합니다.
  • 함수 내용: 함수가 수행할 작업을 포함하는 코드 블록입니다.

예제: 간단한 함수

#include <iostream>

void greet() {
    std::cout << "안녕하세요, 소프트웨어 공장입니다!" << std::endl;
}

int main() {
    greet(); // 함수 호출
    return 0;
}

출력:

안녕하세요, 소프트웨어 공장입니다!

2. 함수 선언과 정의

C++에서 함수는 선언과 정의를 분리할 수 있습니다. 이는 코드의 구조를 개선하고 가독성을 높입니다.

함수 선언

함수 선언은 함수의 이름, 반환형, 매개변수를 정의하지만, 함수 내용은 포함하지 않습니다. 일반적으로 헤더 파일에 작성합니다.

반환형 함수이름(매개변수 목록); // 선언

함수 정의

함수 정의는 함수의 실제 동작을 구현합니다.

반환형 함수이름(매개변수 목록) {
    // 함수 내용
}

예제: 선언과 정의 분리

#include <iostream>

// 함수 선언
int add(int a, int b);

int main() {
    int result = add(5, 7);
    std::cout << "결과: " << result << std::endl;
    return 0;
}

// 함수 정의
int add(int a, int b) {
    return a + b;
}

출력:

결과: 12

3. 매개변수 전달 방식

C++에서 함수는 매개변수를 값에 의한 전달, 참조에 의한 전달, 포인터에 의한 전달 방식으로 받을 수 있습니다.

값에 의한 전달

값에 의한 전달은 매개변수로 받은 값의 복사본을 함수가 사용합니다.

void increment(int value) {
    value++;
}

int main() {
    int num = 10;
    increment(num);
    std::cout << "num: " << num << std::endl; // num은 변경되지 않음
    return 0;
}

출력:

num: 10

참조에 의한 전달

참조를 사용하면 원본 값이 함수에서 수정됩니다.

void increment(int &value) {
    value++;
}

int main() {
    int num = 10;
    increment(num);
    std::cout << "num: " << num << std::endl; // num은 11로 변경됨
    return 0;
}

출력:

num: 11

포인터에 의한 전달

포인터를 사용하여 원본 값을 수정할 수 있습니다.

void increment(int *value) {
    (*value)++;
}

int main() {
    int num = 10;
    increment(&num);
    std::cout << "num: " << num << std::endl; // num은 11로 변경됨
    return 0;
}

출력:

num: 11

4. 함수 오버로딩

C++에서는 동일한 이름의 함수를 매개변수의 타입이나 개수에 따라 여러 개 정의할 수 있습니다. 이를 함수 오버로딩이라고 합니다.

#include <iostream>

void print(int value) {
    std::cout << "정수: " << value << std::endl;
}

void print(double value) {
    std::cout << "실수: " << value << std::endl;
}

void print(const std::string &value) {
    std::cout << "문자열: " << value << std::endl;
}

int main() {
    print(10);
    print(3.14);
    print("소프트웨어 공장");
    return 0;
}

출력:

정수: 10
실수: 3.14
문자열: 소프트웨어 공장

5. 재귀 함수

함수가 자기 자신을 호출하는 것을 재귀라고 합니다. 재귀는 반복 작업을 간결하게 표현할 때 유용합니다.

예제: 팩토리얼 계산

#include <iostream>

int factorial(int n) {
    if (n <= 1) return 1; // 기본 종료 조건
    return n * factorial(n - 1);
}

int main() {
    int num = 5;
    std::cout << num << "! = " << factorial(num) << std::endl;
    return 0;
}

출력:

5! = 120

6. 람다 함수

람다 함수는 C++11에서 도입된 간단한 익명 함수입니다. 코드에서 간단히 함수를 정의하고 사용할 수 있습니다.

#include <iostream>

int main() {
    auto add = [](int a, int b) {
        return a + b;
    };

    std::cout << "3 + 4 = " << add(3, 4) << std::endl;
    return 0;
}

출력:

3 + 4 = 7

7. 결론

이번 포스팅에서는 C++ 함수의 기본 개념부터 오버로딩, 재귀, 람다 함수까지 다양한 내용을 살펴보았습니다. 함수를 적절히 활용하면 코드의 가독성과 재사용성이 크게 향상됩니다.

반응형

'cpp' 카테고리의 다른 글

C++ 포인터와 참조  (0) 2024.12.18
C++ 배열과 문자열  (0) 2024.12.18
C++ 반복문  (0) 2024.12.18
C++ 조건문 (Conditional Statements)  (0) 2024.12.17
C++ 입출력(I/O)  (0) 2024.12.17