본문 바로가기

Programming Study/STL

STL에 들어가기에 앞서

STL(Standard Template Library)

- 표준 템플릿 라이브러리

- 다양한 제네릭 알고리즘과 데이터 구조로 구성된 범용 라이브러리

 

STL은 다음 네 가지의 기본적인 아이디어를 바탕으로 설계되었다.

- 제네릭 프로그래밍(generic programming)

- 효율성(efficiency)의 저하가 없는 추상화(abstraction)

- Von Neumann 계산 모델

- 값 개념(value semantic)

 

제네릭 프로그래밍

제너릭 프로그래밍은 C++이나 템플릿과는 아무런 관련이 없으며,

여러 유용한 소프트웨어 컴포넌트들을 체계적으로 엮어내는 방법을 연구하는 학문이다.

제네릭 프로그래밍의 목적은 알고리즘, 데이터구조, 메모리 할당 메커니즘, 그리고 기타 여러 소프트웨어적인 장치들을 발전시켜

이들의 재사용성(reuse), 모듈화(modularity), 사용 편이성(usability)을 보다 높은 수준으로 끌어올리고자 하는 것이다.

 

제네릭 프로그래밍의 개념은 많은 부분에서 추상 대수(abstract algebra)의 개념과 매우 유사하다

 

효율성의 저하가 없는 추상화

컴퓨터 과학 분야에서는 효율성에 관한 문제가 주요 관심사로 다루어진다.

어떤 연산이 수행 가능하다는 사실은 그 자체만으로 큰 의미를 가지지 못한다.

그 연산이 충분히 빠르게 수행될 수 있는지가 중요한 것이다.

이를 좀 더 체계적으로 다루기 위해서 STL에서 준비해 놓은 것이 몇 가지 있다.

 

첫번째로, STL은 복잡도(complexity)에 관련된 요구 사항을 인터페이스에서 직접 명시하고 있다.

두번째로, STL은 접근 연산을 효율적으로 수행하기 위해서 데이터 구조의 어떠한 부분도 숨겨지지 않도록 주의를 기울이고 있다.

 

Von Neumann 계산 모델

추상 수학에서는 간단한 수리적 사실들을 추상화의 기반으로 삼고 있다.

그렇다면 제네릭 추상 프레임 워크를 구축할 때는 과연 무엇을 추상화의 기반으로 삼아야 하겠는가?

STL 튜토리얼·레퍼런스 가이드의 필자는 오늘날 실제로 사용하고 있는 컴퓨터의 아키텍처만이

추상화의 확고한 기반이 될수 있다고 크게 믿는다고 말한다.

바이트 단위로 접근이 가능한 메모리의 개념과 포인터의 개념은 그 이전의 아키텍처에서 물려 받은 것이 아니라,

애플리케이션들의 요구들에 부응하기 위해 생겨난 아키텍처의 산물이다.

STL에서 가장 말이 많았던 부분은 주소와 이의 개념적 분류(반복자의 여러 종류를 의미)를

STL의 가장 핵심적인 부분으로 만들었다는 사실이다.

STL의 반복자 분류(입력 반복자, 출력 반복자, 순방향 반복자, 양방향 반복자, 임의 접근 반복자)는

모든 기본적인 시퀀스 알고리즘에게는 충분하지만, STL을 확장하여 다차원 구조를 처리할 수 있게 하려면

더 많은 종류의 반복자를 정의할 필요가 있다.

(실제로, 덱 반복자나 캐쉬 라인에서의 비일관적인 접근과 다중 프로세서 구현시에는,

성능을 높이기 위해 기본적인 시퀀스 알고리즘도 이차원 반복자를 필요로 한다.)

 

값 개념

STL에서는 컨테이너를 보다 범용화된 형태의 데이터 구조라는 관점에서 바라본다.

데이터 구조가 자신의 컴포넌트를 가지고 있듯이, 컨테이너도 자신의 컴포넌트를 소유한다.

데이터 구조를 복사할 때는 데이터 구조에 속한 모든 컴포넌트들도 같이 복사되며,

데이터 구조가 사라질 때는 마찬가지로 데이터 구조에 속한 모든 컴포넌트들도 같이 없어진다.

이는 컨테이너의 경우도 마찬가지이다.

데이터 구조와 컨테이너가 이러한 성질들을 가지고 있기 때문에, 일상 생활의 사물들의 핵심 속성이라고 할 수 있는

전체-부분(whole-part) 관계를 모델링할 때 데이터 구조와 컨테이너 구조를 이용할 수 있는 것이다.

물론, 전체-부분 관계가 일상 생활에서 관찰할 수 있는 유일한 관계는 아니며,

그 밖의 관계들은 반복자를 이용하여 모델링 할 필요가 있다.

부분(part)과 관계(relation)를 서로 혼동하는 것은 객체 지향 언어와 객체 지향 라이브러리에서 흔한 것으로,

이러한 혼동이 객체 지향 언어와 라이브러리에서 가비지 콜랙션 기능을 요구하는 주요 원인이 될 뿐만 아니라,

실세계 모델링에서 개념적인 혼동을 유발하는 주된 원인이기도 하다.

STL은 객체 지향적이지 않다.

STL이 전역 제네릭 알고리즘을 사용한다는 측면에서 뿐만 아니라, 이보다 더 중요한,

STL이 "객체를 일부분으로 가진다."라는 개념과 "객체를 가리킨다."라는 개념을 분리해 놓고 있다는 측면에서

STL은 비객체 지향적이다.

일반적으로 STL은 연산의 대상이 어떠한 타입이건 간에 복사 생성자, 소멸자, 대입, 상등

그리고 이들 간의 관계에 관련된 의미들이 내장 타입에서의 그것들과 일치한다고 가정하고 있다.

덧붙여서 STL은 <, >. <=. >= 연산자들이 정의되어 있는 객체들에 대해서 이 연산자들의 개념이 내장 타입에 대해서도

동일할 것이라고 가정하고 있다.

 

놀라운 사실 몇 가지

STL은 C++ 표준 라이브러리의 일부분으로 설계된 것이 아니었고,

제네릭 알고리즘과 데이터 구조를 이용한 최초의 라이브러리를 만들자는 의도에서 설계되었다.

반복자나 컨테이너와 같은 STL의 기본 개념들은 C++로 표현할 수가 없는 것들이다.

왜냐하면, STL은 C++에서는 해당 내용을 표현할 수 없는 여러 가지 엄격한 요구 사항들을 바탕으로 이루어져 있기 때문이다.

 

STL의 포인트는 STL은 확장가능성을 지닌 프레임 워크라는 것이다.

 

 

 

 

- STL 튜토리얼·레퍼런스 가이드 제2판 중 -

 

 

'Programming Study > STL' 카테고리의 다른 글

반복자(iterator)_2  (0) 2014.10.22
반복자(iterator)_1  (0) 2014.10.22
STL과 다른 라이브러리와의 차이점  (0) 2014.10.22
STL 컴포넌트 개요  (0) 2014.10.21
소개  (0) 2014.10.20