C++ 일반 함수 제네릭화 질문입니다.

조회수 1138회
void insert (int a, int b[], int index) {
  b[index] =a;
}
void insert (char a, char b, int index) {
 *(b+index) = a;
}

이 두함수를 일반화한 제네릭 함수로 만드는것이 목표인데, 제네릭이라는 개념을 처음 접해서 이해가 되질 않네요..

저 두 함수를 제네릭화 해주시면 제네릭화된 모습을 비교해보면서 공부해보려고합니다 ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 일반화 프로그래밍은 어떤 로직을 작성할 때 특정 타입에 국한되지 않고 다양한 타입에서 동작할 수 있는 코드를 작성하는 것이라고 생각하시면 됩니다.

    C++에서는 템플릿 이라는 것을 통해서 일반화 프로그래밍이 가능하며, STL(Standard Template Library) 형태로 표준에서 여러 클래스 및 함수를 제공하고 있습니다.

    아래와 같이 여러 종류의 insert() 가 있습니다.

    void insert(int a, int b[], int index) { b[index] = a; }
    void insert(char a, char b[], int index) { b[index] = a; }
    void insert(double a, double b[], int index) { b[index] = a; }
    void insert(std::string a, std::string b[], int index) { b[index] = a; }
    

    b의 특정 indexa값을 넣는 작업을 합니다. 위의 여러 함수는 b[index] = a; 와 같은 방식으로 작성하게 될텐데 타입이 다르기 때문에 배열 타입에 따라 모두 오버로딩을 해주어야합니다.

    함수의 내용은 b[index] = a; 로 모두 동일하나 타입이 다르기 때문에 모두 하나하나 작성해 줘야합니다. 이는 코드가 중복되고 매우 번거롭고 실수를 야기하기 때문에 좋지 못합니다. C++에서는 템플릿을 작성하여 내용은 그대로 유지하되 특정 타입을 치환하는 식으로 동작할 수 있습니다.

    template<typename T>
    void insert(T a, T b[], int index) {
        b[index] = a;
    }
    
    int a1[10] = {};
    insert(1, a1, 0);
    double a2[10] = {};
    insert(1.0, a2, 0);
    

    insert 함수 템플릿은 b[index] = a; 의 내용을 갖지만 호출 시점에서 치환될 대상인 T가 결정됩니다. insert(1, a1, 0);a1 정수 배열이기 에 T=int가 되며, insert(1.0, a2, 0);a2가 실수 배열이기에 T=double이 됩니다.

    처음 코드와 다르게 한번의 템플릿만 작성함으로써 여러 타입에 대응하는 코드를 작성할 수 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)