본문 바로가기

[게임 개발자를 위한 C++ 문법] 템플릿

@iamrain2025. 8. 20. 11:42

함수 오버로딩

C++에서는 동일한 이름의 함수를 여러 개 정의할 수 있다.

함수 이름과 매개변수 타입 정보를 함께 사용해 구분하기 때문이다.

 

이런 식으로 함수 이름 구분을 위해 내부적으로 고유한 이름을 부여하는 것을 Name Mangling이라고 한다.

단, 함수의 반환형만으로는 오버로딩이 성립하지 않는다.

 

함수 오버로딩을 적용하려면, 이름이 같더라도 함수가 명확히 구분되어야 한다.

  • 매개변수 타입이 다른 경우
  • 매겨변수의 갯수가 다른 경우

오버로딩 호출

오버로딩이 되지 않는 경우

호출 시점에 호출할 함수가 명확하지 않으면 컴파일 오류가 발생한다.

  • 타입 변환이 가능한 매개변수로 인해 두 개 이상의 오버로딩된 함수가 호출 후보가 되는 경우
  • 디폴트 매개변수로 인해 함수 호출 형태가 중복되는 경우
  • 매개변수의 타입만 포인터와 배열로 다른 경우
  • 함수의 반환 타입만 다른 경우

오버로딩의 순서

C++에서는 아래와 같은 명확한 우선순위 규칙에 따라 호출할 함수를 결정한다.

  1. 정확한 매개변수 타입 일치
    호출 인자 타입과 매개변수 타입이 정확히 일치하는 경우
  2. 타입 승격 변환
    승격 : 값이 손실되지 않는 방향으로 변환하는 것
    • `char` or `short` → `int`
    • `float` → `double`
    • `bool` `int`
  3. 표준 타입 변환
    승격보다는 조금 더 광범위하다. 값 손실이 발생하는 경우도 있다.
    • `int` → `double`
    • `double` → `int`
    • `double`  `float`

  4. 사용자 정의 타입 변환
    클래스 타입의 변환 함수나 생성자 등을 통해 이뤄지는 변환

 

템플릿

템플릿은 타입에 관계없이 일반화된 코드를 작성하기 위한 문법이다.

 

템플릿을 이용한 일반화된 함수는 아래와 같은 형태로 정의한다.

`template <typename T>`

`T`는 어떤 타입이 올지 모르니 `T`라고 부르겠다는 의미다.

템플릿 클래스

클래스도 템플릿으로 사용해 일반화할 수 있다.

배열에 원소를 추가하거나 삭제하는 기능을 가진 클래스를 정의할 때도 템플릿을 활용해 다양한 타입의 데이터에 대해 동작하도록 일반화할 수 있다.

 

배열을 템플릿 클래스로 구현한 예시

#include <iostream>
using namespace std;

template <typename T>
class Array {
    T data[100];
    int size;
public:
    Array() : size(0) {}

    void add(const T& element) {
        if(size < 100)
            data[size++] = element;
    }

    void remove() {
        if(size > 0)
            size--;
    }

    void print() {
        for(int i = 0; i < size; i++)
            cout << data[i] << " ";
        cout << endl;
    }
};
iamrain
@iamrain :: Annals of Unreal

iamrain 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차