1. Default parameter

  • C와 달리 C++는 함수호출부분에서 전달인자(Argument)값 생략 가능
  • 전달인자 없이 함수가 호출된 경우 함수정의 부분에 선언된 Default 매개변수 사용
  • 전달인자가 2개 이상인 경우 가장 왼쪽 매개변수와 짝을 맞춰 값 전달
  • 전달인자가 2개 이상인 경우 Default 매개변수 값은 반드시 오른쪽부터!
  • 전달인자가 3개 이상인 경우 Default 매개변수 중간값을 반드시 기술
#include <iostream>
using namespace std;

int TestFunct(int nParam1, int nParam2 = 10, int nParam3 = 20)
{
    return nParam1 * nParam2 * nParam3;
}

int main()
{
    cout << TestFunct(10) << endl;

    return 0;
}

// 실행결과 2000


2.1 함수 오버로딩(Overloading)

  • C에서는 동일한 이름을 갖는 함수가 존재할 수 없음
  • C++에서는 함수 오버로딩을 통해 동일한 이름의 함수가 여러개 존재할 수 있음
  • 함수 오버로딩은 매개변수의 개수가 다르거나 매개변수 type이 달라야 함
  • Return type이 다른 경우는 함수 오버로딩 X
#include <iostream>
using namespace std;

// 함수 오버로딩(Overloading)에서 중요한 요소는 매개변수(Parameter)
// 매개변수의 type, 개수에 의해 함수 오버로딩 수행
// Return type만 다를 경우 오버로딩 구현 불가능!
int Add(int a, int b, int c)
{
    return a + b * c;
}

int Add(int a, int b)
{
    return a + b;
}

double Add(double a, double b)
{
    return a + b;
}

int main()
{
    cout << Add(10, 20) << endl;
    cout << Add(10, 20, 30) << endl;
    cout << Add(1.2, 2.3) << endl;

    return 0;
}


2.2 함수 오버로딩의 모호성(Ambiguous) 문제

  • Default 매개변수, 함수 오버로딩을 함께 사용할 경우 모호성 문제 발생
  • 전달인자 생략과 오버로딩으로 인해 모호성 에러가 발생
  • C++에서는 함수 오버로딩 보다 template 사용 권장
#include <iostream>
using namespace std;

void TestFunc(int a)
{
    cout << "TestFunc(int)" << endl;
}

void TestFunc(int a, int b = 10)
{
    cout << "TestFunc(int, int)" << endl;
}

int main()
{
    // error: call to 'TestFunc' is ambiguous 발생
    // 어떤 함수를 호출해야 하는지 모호함, 함수 오버로딩을 사용할 때 주의해야 하는 부분!
    // 이러한 모호성 때문에 C++에서는 함수 오버로딩 보다는 Template 사용을 권장
    TestFunc(5);


    return 0;
}


2.3 함수 템플릿(Template)

  • 함수 오버로딩은 사용자의 편의성과 확장성을 위해 사용
  • 개발자는 비슷한 코드를 여러 번 구현해야 함(소스코드 증가, 메모리 문제 등)
  • template 사용
  • 함수 오버로딩 없이 여러 종류의 type 호출 대응
#include <iostream>
using namespace std;

template <typename T>
T Add(T a, T b)
{
    return a + b;
}

int main()
{  
    // int 호출
    cout << Add(3, 4) << endl;
    // double 호출
    cout << Add(3.3, 4.4) << endl;

    return 0;
}


3. inline 함수

  • 함수 호출은 스택 메모리 사용 증가
  • 성능 문제로 함수 대신 매크로 사용
  • 매크로는 type을 지정할 수 없음
  • C++은 함수와 매크로를 합쳐 놓은 inline 함수 제공
  • 함수 앞에 inline 키워드 입력
#include <cstdio>
#define ADD(a, b)((a) + (b))

int Add(int a, int b)
{
    return a + b;
}

inline int AddNew(int a, int b)
{
    return a + b;
}

int main()
{
    int a, b;
    scanf("%d%d", &a, &b);

    printf("ADD(): %d\n", ADD(a, b));
    printf("Add(): %d\n", Add(a, b));
    printf("AddNew(): %d\n", AddNew(a, b));

    return 0;
}


4. namespace

  • 함수, 변수, 클래스 등을 특정 범주로 묶어주기 위한 문법
  • 동일한 변수 이름 또는 함수 이름 등의 충돌을 막기 위한 방법
  • namespace는 중첩 가능
  • using 키워드를 통해 매번 namespace 입력을 생략할 수 있음
#include <iostream>
// 아래 주석을 제거하면 main() 함수에서 std:: 생략 가능
// using namespace std;

namespace TestFunc
{
    int nData = 100;
}

int main()
{
  std::cout << TestFunc::nData << std::endl;

  return 0;
}


본 포스팅 내용은 이것이 C++이다를 학습한 내용을 바탕으로 요약한 글입니다. 코드에 문제가 있을 수 있으며 다소 부정확한 내용이 있을 수 있으니 참고하시기 바랍니다. 잘못된 내용이 있다면 덧글로 남겨주시면 내용을 반영하여 수정하도록 하겠습니다. 감사합니다.



[Reference]

[1] 이것이 C++이다, p.57-91