C++에서는 Template라는 형태로 Generics를 제공해 왔습니다. 패턴적인 측면에서는 C#의 Generics와
크게 다르지 않으나, 결정적인 차이가 있다면 C#에서는 CLR이 지원한다는 것입니다. 일종의 매크로(템플릿에 제공된 각 형식
매개 변수에 대한 특수화된 형식을 생성)일 뿐인 C++의 Template과는 달리 Generics는 Runtime시에 JIT
컴파일러에 의해 적절히 해석되고 Native Code로 컴파일된다는 것입니다.
C++와 같은 후기 바인딩 방식에서는 단지 클래스 또는 인터페이스의 상속을 통한 바인딩이었기에 Logic의 확장이
어려웠고, 형식의 안정성에서의 문제점도 꼼꼼히 따져야만 했습니다. 적어도 전달되는 클래스는 같은 클래스에서 상속을 받거나 같은
인터페이스를 구현해야 했습니다. 물론, COM의 IUnknown 같이 자기기술자[Self-Descriptor]를 가진
클래스/인터페이스를 만들면 해결할 수 있겠지만 그 노력은 만만치 않습니다. C#의 Generics를 적용하면 'Logic'과
'Logic에 의해 다뤄지는 객체'를 명확하게 구분할 수 있습니다.
결국 Domain/Business Logic을 구현이라는 점에서는 크게 다를 바가 없지만 그 유연성에 있어서는 상당히 선택의 폭이 넓어졌다고 할 수 있습니다.
-- JAVA의 Generics (Parametric polymorphism) --
Java의 Generics는 Pizza라는 프로젝트로부터 시작되었으며, 이후 GJ라고 이름이 붙여졌고, JSR로 바뀐
것입니다. Sun사는 Java Virtual Machine을 수정할 필요가 없는 구현을 선택했습니다. 따라서 Sun사는 수정되지
않은 가상 시스템에서 Generics를 구현함으로 해서 많은 단점들을 가지게 되었습니다.
Java Generics는 어떤 실행 능률도 높여 주지 못합니다. Java Compiler는
List<Integer>라는 Parameterized Type을 만들면 Integer를 Object로 모두 변환하고
필요한 곳에 (Integer)형 변환을 실행합니다. 이는 수정되지 않은 Java Virtual Machine이 값
형식(Value Type)에 대해 Generics를 지원하지 못하기 때문입니다. 따라서 Java의 Generics에서는 실행
효율성을 얻을 수 없습니다.
Java의 Generics는 erasure of the type parameter(매개변수 타입의 말소)라는 것에
의존하기 때문에 Runtime시에 List<Integer>는 List라는 클래스와 동일한 클래스로 표현됩니다. 이것은
어떤 클래스가 List<Integer>인지 List<String>인지 Runtime시에는 알 수 없다는
것입니다. 이는 Runtime시에 Generics 형식의 Instance에 대한 형식 매개 변수를 확인할 수 있는 방법이 없으며
다른 리플렉션(Reflection) 사용이 엄격하게 제한된다는 의미입니다.
출처 : vs 2005로 배우는 C# 게임 프로그래밍
델파이2009에도 Generics가 추가 되었군요.
Template의 영향력이 크네요.
STL과 같은 구조의 라이브러리가 전언어에서 구현가능하겠군요.
STL은 Standard Template Library약자로
98년에 C++표준이 되어 C++컴파일러에는 모두 포함되어 있다.
VC6에 포함된 STL은 딩컴웨어의 라이브러리를 사용하고 있으며 C++표준이 된 해에 발표된 툴이라 그런지 STL관련 문제가 너무 많다. 그래서 VC6을 사용하는 STL사용자들은 VC에 STLPort를 설치해서 사용한다. 다행히 VC최신 버젼은 STL에 많은 지원을 해주고 있으며 STL관련 기능도 많이 추가되어서 기본 STL라이브러리를 사용해도 무방하다.
다운로드 http://sourceforge.net/projects/stlport STLport 는 5.0 부터는 wrapper 모드(컴파일러의 iostream사용)를 더 이상 지원하지 않아서 STLport의 iostream을
꼭 사용해야한다. 이전버전을 사용할때 wrapper모드를 사용할꺼면 입출력관련 컴파일과정이 필요없다.
STLPort의 입출력라이브러리를 사용할때 VC 프로젝트에서 CRT라이브러리를 DLL로 사용하면 STLPort관련 DLL도 같이 배포 해야된다. 좀 불편한 사항이라 Static라이브러리를 기본으로 사용하게 컴파일하는 방법을 같이 설명한다. (필자는 5.1.5를 사용중인데 그전 4.6.2를 사용할때 Static라이브러리로 컴파일이 잘 안되서 5.1.5로 바꿨다. Static라이브러리에 대한 설명은 5.1.5에서만 설명하겠다.)
※ VC6에 최신 Platform SDK을 사용하면 VC용 입출력라이브러리를 그냥 사용해도 상관없다는 분도 계신데 sstream을 사용하려고 선언하기만 해도 102개의 error와 9개의 warning이 발생하니 필자는 사용안할수가 없었다. ㅡ.ㅡ; (4.6.2 사용시..)
STLPort 5.1.5, 5.2.0 설치
정적라이브러리(Static)로 사용방법은 아래 주석으로 표시한 두줄의 차이 밖에 없으며 configure에서 --rtl-dynamic 의미는 동적(dynamic) C,C++ 라이브러리 사용시 STLport를 정적으로(statically) 링크할 수 있도록 한다는 것이다. 위와 같이 설정하면 실제 컴파일된 결과물은 CRT라이브러리가 Multithread DLL설정으로 사용시 필요한 라이브러리만 생성되므로 아래 4,5번 과정을 --rtl-dynamic빼고 한번, 설정하고 한번으로 해서 컴파일하면 VC에서 CRT를 사용하는 3가지 쓰레드 모델에 모두 적용가능한 라이브러리를 만들수 있다.
STLPort를 다운받아서 압축을 푼다.
1. stlport\stl\config\user_config.h에서 아래값 설정 #define _STLP_NEW_PLATFORM_SDK // Platform SDK를 사용하는 환경에서 사용시 #define _STLP_USE_MFC // MFC 사용시
Include files: "..\Microsoft Visual Studio\VC98\stlport\include"
STLPort 4.6.2 설치
STLPort를 다운받아서 압축을 푼다.
1. stlport\stl_user_config.h에서 아래값 설정 #define _STLP_NEW_PLATFORM_SDK 1 // Platform SDK를 사용하는 환경에서 사용시 #define _STLP_USE_MFC // MFC 사용시 2-1. wrapper 모드로 사용하는 경우(컴파일러의 iostream 사용) STLport에서 제공하는 iostream을 사용하지 않는 경우 컴파일할 필요가 없다. - stl_user_config.h 파일의 # define _STLP_NO_OWN_IOSTREAMS 1 부분 주석 해제 - stlport 디렉터리를 ..\Microsoft Visual Studio\VC98\include에 복사 - VC++에서 Tool -> Option -> Directories -> include files 에 stlport 디렉터리 등록 - 위의 디렉터리를 상위로 설정하고 사용해야 STLport의 헤더 파일을 사용합니다.(설치 끝)
2.2. STLport의 iostream을 사용하는 경우 STLport 라이브러리를 컴파일해야 한다. - 시작 버튼 메뉴의 Platform SDK 에 보면 Open Build Environment Window 라는 도스창 띄워주는 단축 아이콘이 있다. 이중에서 자신의 운영체제 맞는 것을 선택하여 도스창을 띄운다. - STLport 압축을 푼 디렉터리에서 src 디렉터리로 이동 - nmake -f vc6.mak install (VC++ 6인 경우, 다른 컴파일의 경우 다른 make 파일 선택) - 컴파일이 끝나면 헤더파일, lib(VC의 lib 디렉터리), dll(system32 디렉터리) 파일들이 설치된다. - VC++에서 Tool -> Option -> Directories -> include files 에 stlport 디렉터리 상위로 설정 등록
문제 해결
위에서 _STLP_NEW_PLATFORM_SDK, _STLP_USE_MFC는 기본으로 설정해야 된다. 1. 설치시 error C2733 ... InterlockedIncrement... 에러가 발생한다. (c:\program files\microsoft visual studio\vc98\include\stlport\stl\_threads.h(122) : error C2733: second C linkage of overloaded function 'InterlockedIncrement' not allowed) PlatformSDK 설치 후에 Visual Studio 6를 설치하거나 DirectX등을 설치할경우 IncludeSetting 에서Platform SDK Include Path 의 우선순위가 낮게 설정 되는데 Platform SDKInclude Path의우선순위를 제일 위로 올려주고 STLport-xxx\stlport\stl\config\stl_user_config.h 파일의 #define _STLP_NEW_PLATFORM_SDK 1 부분을 주석을 제거 해주시면 정상 처리 됩니다. 2. Visual C++ 에서 메모리 릭이 날 때? stlport/stl/config/hosts.h에서 #define _STLP_LEAKS_PEDANTIC 1 #define _STLP_USE_NEWALLOC 1 #define _STLP_USE_MALLOC 1 를 설정해준다.
STLport에서 구현된 allocator로 인해 몇몇 릭을 검출하는 툴에서 메모리 릭이
발생하는데 진짜 메모리 누수로 생기는 릭이 아니라 릭을 검출하는 시점에 의해 생기는
잘못된 보고이다. 이러한 가짜 릭이 걱정된다면 이 전처리를 사용한다.
반드시 _STLP_USE_NEWALLOC 또는 _STLP_USE_MALLOC과 같이 사용해야 한다.
2009.10.11
이전엔 없던 에러가 발생한다. 예전에 받아논 STLPort파일(5.1.5)은 컴파일이 잘되는데 새로받은건 안된다;; 아직 해결못함.