제네릭 프로그래밍의 역사 그리고 이와 관련된 프로그래밍요소(템플릿,자료구조,알고리즘)

를 자세한 설명없이 간략하게 알아보겠습니다.

비템플릿템플릿

class SomeINTAdd {

   int some;

   void add(int data){ some=some+data}

}

class SomeStrAdd {

   string some;

   void add2(string data){ some=some+data}

}

...... Type만큼 코드가 있어야함

class SomeAdd <T>{

   T somenum;

   void add(T data){ some=some+data  }  

}


템플릿이 등장하기전에는 유사하게 작동되는 코드를 복사 붙여넣기한후 또 작성해야 했습니다.

코딩에서 Crtl+CV는 유사한 객체의 코드 일관성을 유지하는 방법중 하나였습니다. 

어떠한 언어에서는 이러한 템플릿 개념을 제네릭과 같이 묶어 제네릭으로 소개하기도하지만 두개념은 약간의 차이가 있습니다.

제네릭은 Type에 의존하지 않고 여러 Type을 다루기위한  방법이고 템플릿은 이때 사용되는  구체적인 언어스펙입니다.

제네릭 프로그래밍은 템플릿의 기능을 사용한것이고 C++ STL에서 정립 되기시작하였습니다. 


JAVA나 C# 초기버전의 경우 템플릿 프로그래밍이 없었으며 C++의 영향을 받아 이후 도입이 되었습니다. 

( 템플릿을 지원하기 시작한시점 : JDK4 , .net framework 2 ) : 그 이전에는 언어가 템플릿을 지원하지 못해 제네릭을 사용하지 못하였습니다. 


메타 프로그래밍은 , 기본 언어스펙에 이러한 템플릿기능이 없거나(C++에서도 언어스펙이 낮을때, 제네릭 컨셉이 없어서, StlPort가 사용됨)

언어에서 지원하지 않는 특수한 언어스펙을 지원해야할시(ex>TypeScript)  컴파일러가 개입하여 작동 코드를 생성해주는것 자체를이야기합니다.

과거의 C++은 오늘날 모던 프로그래밍에 언어스펙뿐아니라 OOP 이용방식에도 직/간접적으로 주었습니다.

( 이제 언어스펙은 평준화되고 각각의 길을 걷고 있기때문에 C++을 필수로 익힐필요는 없어보입니다.)


어쨋든 우리는 이러한 템플릿을 이용한 제네릭의 요소를 잘 사용을 하면 되겠습니다. 

그것이 제네릭 프로그래밍입니다. 제네릭과 같은 클래스 자체를 설계하기 위해 이용하는 것은 템플릿 프로그래밍입니다. (이둘의 차이는 아주 큽니다.)

Array<동물> 동물우리;

Array<과일> 과일상자;


동물은 동물우리에 담고 과일은 과일상자에 분리해서 담는것입니다. 그리고 그것을 담을수 있는 도구는 Array 임을 아는것입니다. 

실수로 과일상자에, 동물을 담으면 친철한 컴파일씨가 오류를 낼것입니다. ( 동물이 못들어가서 튀어나옴  )


여기서 담는도구는 자료구조일수 있습니다.  Array,List,Queue,Tree(Map) 등  자료구조는 다음과 같이 설명될수 있습니다.

과일상자.push(apple);

과일상자.pop();


자료구조는 무엇을 담기위해 담는 속도 , 그것을 찾는 속도 또는 꺼집어낼때 순서등을 고려하여

성능을 극대화하려고 작성된것이 알고리즘이며 이것은 제네릭 내부에 숨겨져 있습니다.

자료구조의 알고리즘을 직접 작성하지 않더라도 ( 과거에는 면접시 손코딩으로 자료구조를 작성해야하는 시기가 있었습니다.)

자신이 구현하고자 하는 도메인로직에서 어떠한 자료구조가 적합한지 선택을 해야하기때문에

Array VS List VS Map , Stack VS Queue  무엇이 효율적인지 자료구조의 특성을 아는것은 중요합니다.


  • No labels
Write a comment…