본캠프 17일차_C++ 문법(9)_템플릿

YU YEON WON·2025년 8월 27일

1. 오늘 학습 내용(키워드)

템플릿에 대해 배웠다.
일단 함수 오버로딩에 대해 배워야 템플릿 사용을 이해할 수 있다.

  • 함수 오버로딩
    • C++에서는 동일한 이름의 함수를 여러 개 정의 할 수 있다.
    • C++에서는 함수 이름과 매개변수 타입 정보를 함께 사용해 구분하기 때문.
    • 함수 이름 구분을 위해 내부적으로 고유한 이름을 부여하는 것을 네임 맹글링(Name Mangling)이라고 한다.
    • 함수의 반환형만으로는 오버로딩이 성립하지 않는다.
    • 함수 오버로딩을 적용하려면, 이름이 같아도 각 함수가 명확이 구분되어야 함.
#include <iostream>
using namespace std;

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

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

void print(string s) 
{
    cout << "문자열: " << s << endl;
}

int main() {
    print(10);        // 정수 버전 호출
    print(3.14);      // 실수 버전 호출
    print("Hello");   // 문자열 버전 호출
    return 0;
}

위는 변수 타입만 다른 함수이다.

  • 함수 오버로딩이 되려면, 호출되는 함수가 분명해야 함
  • 애매모호한 경우로 오류가 발생하는 경우
    - 타입 변환이 가능한 매개변수로 인해 두 개 이상의 오버로딩된 함수가 호출 후보가 되는 경우
    - 디폴트 매개변수로 인해 함수 호출 형태가 중복되는 경우
    - 매개변수의 타입만 포인터와 배열로 다른 겨우
    - 함수의 반환 타입만 다른 경우


    이제 템플릿에 대해 알아보자
  • 템플릿
    • 템플릿은 템플릿 타입에 관계없이 일반화된 코드를 작성하기 위한 문법이다.
      • 정의 : templat <typename T>
      • 이 의미는 어떤 타입이 올지 모르겠으나, 그 타입을 T라고 부르겠다는 의미.
      • 이후에는 일반화하려는 타입 자리에 실제 타입 대신 T를 사용하면 된다.
#include <iostream>
using namespace std;

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

int main() 
{
    cout << add(3, 4) << endl;        // 정수
    cout << add(2.5, 3.1) << endl;    // 실수
    return 0;
}

위는 템플릿 사용 예시 이다.

  • 클래스를 템플릿으로 만들 수 있고 배열에 원소를 추가하고 삭제하는 기능을 가진 클래스를 정의할 수 있다.
#include <iostream>
using namespace std;

template <typename T, int SIZE>
class MyArray 
{
private:
    T data[SIZE];
public:
    void set(int index, T value) 
    {
        if (index >= 0 && index < SIZE) 
        {
            data[index] = value;
        } else 
        {
            cout << "인덱스 범위 초과!" << endl;
        }
    }
    T get(int index) const 
    {
        if (index >= 0 && index < SIZE) 
        {
            return data[index];
        } else {
            cout << "인덱스 범위 초과!" << endl;
            return T(); // 기본값 반환
        }
    }
    
    void printAll() const 
    {
        for (int i = 0; i < SIZE; ++i) 
        {
            cout << data[i] << " ";
        }
        cout << endl;
    }
};

int main() {
    MyArray<int, 5> intArray;
    for (int i = 0; i < 5; ++i) 
    {
        intArray.set(i, i * 10);
    }
    intArray.printAll(); // 출력: 0 10 20 30 40
    
    MyArray<string, 3> strArray;
    strArray.set(0, "Hello");
    strArray.set(1, "C++");
    strArray.set(2, "World");
    strArray.printAll(); // 출력: Hello C++ World
    
    return 0;
}

위는 템플릿을 이용한 배열 클래스이다.

2. 느낀점

코드를 읽는(해독)하는 것이 중요한 것 같다. 읽을 줄 알아야 쓸 수 있을 것 같다.
새로운 유형의 코딩 문제를 볼 때, 낯선 함수, 키워드가 나오면 당황하는 것 같다. 읽고 해석하는 연습을 지속적으로 해야겠다.

3. 내일 학습 할 것

코드 디버깅 해보기 whatch, cout 등, 5번째 과제 수행(언리얼에터 액터 배치 후 비주얼 스튜디오로 코드 작성 후 디버깅 해보기)

profile
🕹️🎮🍱✈️📸 안녕하세요! 게임개발에 도전하고 있습니다!

0개의 댓글