제공: 한빛 네트워크
저자: 최흥배
STL이 무엇인지 알고 계십니까?
C++를 주 프로그래밍 언어로 사용하고 계신 분들은 알고 있으리라 생각합니다. STL은 C++ 언어의 "표준 템플릿 라이브러리 (Standard Template Library) "의 약자입니다.
STL을 간단하게 말하자면 일반적으로 많이 사용될 수 있는 자료구조와 알고리즘 모음 라이브러리가 말할 수 있습니다.
STL은 C++ 언어가 처음 만들어질 때부터 있었던 것이 아니고 1998년에 C++ 표준이 정해지기 전인 1993년 말 무렵에 Alex Stepanov가 C++ 언어의 창시자인 Bjarne Stroustrup에게 보여준 후 준비 기간을 걸쳐서 1994년에 표준 위원회에 초안이 통과됩니다.
참고로 C++ 표준은 1989년에 시작되어 1998년 9월에 마무리되었습니다.
STL은 어떻게 만들었을까요?
답은 위에 STL의 실제 이름에 포함 되어 있습니다. 좀 더 힌트를 드린다면 세 개의 단어 중 중간에 있는 것입니다.
네, 템플릿(Template)으로 만들어 진 것입니다.
STL을 이해하려면 STL을 만들 수 있게 해준 C++의 템플릿에 대한 이해는 필수입니다. 또, 템플릿은 C++를 더욱 강력하게 사용하는 데 꼭 필요합니다.
C++ 언어를 공부한 사람은 템플릿에 대해 잘 알고 있을까요?
예전에 C++을 잠시 공부했던 분이나 근래에 공부하고 있는 분 중 아직 C++ 책을 한, 두 권 본 정도라면 템플릿이라는 단어가 생소할 수 있습니다.
위에 언급했듯이 템플릿은 C++이 세상에 나오면서 같이 나온 것이 아니고 1994년 무렵에야 세상에 조금씩 소개되다가 1998년에 C++ 표준이 정립되고서야 C++ 언어의 한 부분으로서 인정되었습니다.
1994년까지는 템플릿을 지원하는 C++ 컴파일러가 없었고, MS의 C++ 툴로 유명한 Visual C++도 버전 6에서는 템플릿을 완벽하게 지원하지 못했으면 Visual Studio .NET 2000 에서부터 제대로 지원을 하게 되었습니다(아직도 템플릿 기능을 100% 완벽하게 지원하지는 못합니다.).
2000년도 이전에 나온 C++ 입문서를 보면 템플릿에 대하여 빠뜨린 것이 꽤 많습니다.
근래 나오는 입문서에서도 빠져 있기도 하며 또 보통 C++ 입문서에서는 가장 뒷부분에 나오다 보니 공부를 하다가 중간에 포기하는 분들은 클래스라는 것은 알아도 템플릿은 잘 모릅니다.
개인적으로 C 언어를 생각하면 포인터가 떠오르고, C++ 언어를 생각하면 클래스와 템플릿이 떠올라집니다. 이유는 C 언어나 C++ 언어를 배울 때 정확하게 이해하기 가장 어려웠던 것이고 제가 배웠던 다른 언어들에 비해 크게 달랐던 것이기 때문입니다.
포인터는 처음 배울 때 문법적인 사용 방법이 잘 이해가 안 돼서 어려웠지만, 클래스나 템플릿은 문법적인 사용 방법이 어려운 것이 아니고 이것들이 프로그램 설계와 관계된 것들이라 사상 부분을 이해하기 어려웠습니다.
객체 지향 프로그래밍(OOP) C++
C++ 언어를 소개할 때 가장 먼저 이야기하는 것이 객체지향이라는 것입니다. 현대 언어들은 거의 다 OOP 베이스의 언어이던가 지원을 하고 있습니다.
C 언어와 C++ 언어는 이름이 비슷하듯이 비슷한 부분이 많습니다. C 언어로 프로그래밍할 때는 절차 지향적 프로그래밍을 하게 됩니다. C++도 절차 지향 프로그래밍을 할 수 있습니다. 그러나 제대로 된 C++ 프로그래밍을 하려면 객체 지향 프로그래밍을 해야 합니다. 보통 C 언어를 배운 후 바로 이어서 C++를 배울 때는 객체 지향 프로그래밍(Object-Oriented Programming)에 대한 이해가 부족합니다. 그래서 C 언어로 프로그래밍할 때와 같은 절차 지향 프로그래밍을 하여 이른바 "C++를 가장한 C 프로그래밍"을 한다는 소리를 듣기도 합니다. C++ 언어로 객체 지향 프로그래밍을 할 수 있는 것은 C 언어에는 없는 클래스가 있기 때문입니다.
[질문] C++로 할 수 있는 프로그래밍 스타일은 절차적 프로그래밍, 객체 지향 프로그래밍만 있을까요?
[답] 아니오. Generic Programming 도 가능합니다.
Generic Programming 이라는 것을 들어 보셨나요?
제가 프로그래밍을 배울 때는 일반적으로 C++ 언어를 배우기 전에 C 언어를 공부했습니다. C 언어를 처음 공부했던 시기가 제 기억으로는 1994년쯤입니다. 그 당시의 다른 초보 프로그래머들처럼 포인터의 벽에 부딪혀 좌절하고, 도망(?)가서 3D Studio라는 그래픽 툴을 공부하다가 제가 할 것이 아니라는 생각에 포기하고, 1995년에 다시 C 언어를 공부하였고 이후 바로 C++ 언어를 공부했습니다.
이때도 OOP라는 단어는 무척 자주 들었고 C++로 프로그래밍을 잘한다는 것은 OOP를 잘한다는 것과 같은 뜻이었습니다.
대학을 다닐 때부터 제 용돈의 많은 부분은 프로그래밍 책을 사는 데 사용되었습니다. 그중에서 저는 C++ 언어 책을 꽤 많이 구매하여 보았습니다(다만, 제대로 이해한 책은 별로 없었습니다. -_-;;; ).
책에서는 언제나 OOP 단어는 무수히 많이 보았지만, Generic Programming이라는 단어를 그 당시에 본 기억이 없습니다. 제가 Generic Programming이라는 단어를 알게 된 것은 2001년 무렵입니다. C++ 언어를 공부한 지 거의 6년이 되어서야 알게 되었습니다.
아마 지금 공부하시는 분들도 Generic Programming이라는 단어는 좀 생소할 것입니다.
Generic Programming은 한국에서는 보통 "일반적 프로그래밍"이라고 이야기 합니다. 저도 처음에는 그렇게 들었습니다.
그러나 이것은 잘못된 표현이지 않을까 생각합니다. 영어 사전을 보면 Generic 이라는 것은 "총칭(總稱)적인" 이라는 뜻도 있는데 이것이 "일반적"이라는 단어보다 더 확실하며 제가 2004년에 일본에서 구입한 "C++ 설계와 진화(Bjarne Stroustrup 저)"라는 일본 번역서에도 Generic은 총칭으로 표기하고 있습니다.
그럼 Generic Programming은 무엇일까요?
네이버 사전에서 Generic 이라는 단어를 검색하면,
3【문법】 총칭적인
the generic singular 총칭 단수 《보기:The cow is an animal.》
라는 부분이 있습니다. 보기의 영문을 저의 짧은 영어 실력으로 번역을 하면 "암소는 동물이다" 입니다. 소는 분명히 고양이나 개와는 다른 동물이지만 "동물"이라는 것으로 총칭할 수 있습니다.
대체 C++언어에서 무엇을 "총칭"화 할까요?
제가 만드는 프로그램은 Windows 플랫폼에서 실행되는 "온라인 게임 서버" 프로그램입니다. 온라인 게임 서버를 만들 때는 어떤 기능이 있어야 되는가를 정한 후 클래스를 만듭니다. 클래스는 아시는 바와 같이 멤버 변수와 멤버 함수로 이루어져 있습니다. 그리고 멤버 함수도 그 내용은 저의 생각에 의해 변수들이 조작으로 되어 있습니다.
"암소는 동물이다"라는 식으로 C++ 언어에서 총칭을 하는 것은 변수의 타입(type)을 총칭화 하는 것입니다.
- 템플릿을 이용하면 총칭화된 타입을 사용하는 클래스와 함수를 만들 수 있습니다.
- 템플릿을 사용하면 타입에 제약을 받지 않는 로직을 기술 할 수 있습니다.
- Generic Programming을 하기 위해서는 템플릿이 꼭 필요합니다.
STL이 무엇으로 만들어졌나요? 네 템플릿으로 만들어졌습니다. STL은 Generic Programming으로 만들어진 가장 대표적인 예입니다.
긴 설명은 그만하고 코드를 볼까요?
제 나름대로 템플릿을 이해하는 데 도움이 되었으면 해서 이런저런 이야기를 했는데 과연 도움이 되었는지 모르겠네요. 아마 설명만 듣고서는 템플릿에 대해 명확하게 이해를 하지 못하리라 생각합니다. 우리 프로그래머들은 정확하게 이해하려면 코드를 봐야겠죠?
템플릿은 크게 함수 템플릿과 클래스 템플릿으로 나눌 수 있습니다.
다음 시간에는 함수 템플릿에 대해서 이야기하겠습니다.