2008. 12. 16. 20:30 책 정리/C++ Template

C++ 템플릿은 상당히 자유롭게 코딩을 할 수 있는 "즐거움" 선사해 준다. 이런 "즐거움" 자신이 생각한게 무척 잘 돌아간는 느낌에서 온다. 그러면 이제 무척 잘 돌아간다는 "사례"를 한가지 들어 보자.

만약 자신이 문자열을 정렬하는 로직을 만들어야 한다고 가정하자. 문자열 정렬을 위해서, ① 문자열이 있어야 하고, ② 문자열이 저장된 원소의 타입을 알아야 되고, ③ 정렬 방법에 대해서 알아야 한다.

여기서 큰 문제가 하나 있다. 각 나라마다 문자열을 정렬하는 기준이 다르고, 특정 나라는 문자열을 정렬하는데, 많은 방법 들이 있기 때문이다.


이 중, ①, ② 은 원래 생각할 수 있을 법한 것이기에 크게 생각을 요구(.. 유니코드 쓰지 뭐. 아니면 UTF-8 이나..)하지 않고, ③ 의 경우.. 정렬 방법이 크게 생각을 요구한다. 왜냐하면 문자열 정렬에서 가장 중요한게 문자열 정렬 방법이기 때문이다.

문자열 정렬 방법이 각 나라나, 지역, 용도에 따라 바뀌기 때문에, 문자열 정렬은 "변수의 개념"으로 봐도 무리가 없다. 변수의 개념으로 써야 한다는 것까지 생각 되었다면, 이 "변수의 개념"을 런타임 변수로 사용 할 것이냐? 컴파일 타임 변수로 사용 할 것이냐? 로 생각을 줄일 수 있다.


먼저 "런타임 변수"로 두고 사용 한다면?

정렬 하는 함수의 포인터를 넘겨서, 그 정렬 기준에 맞게 정렬을 시키면 된다. 하지만 여기서 지적되는 문제점은 정렬 기준이 함수 포인터 이기 때문에, 문자열이 많으면 많을 수록 불필요한 호출 비용을 문자열 갯수에 비례하게 물어야 한다는 단점이 지적 된다.



그렇다면 "컴파일 타임 변수"로 사용 한다면?

여기서 컴파일 타임 변수라 한다면, C++ 에서 숫자 상수나, 전역 변수나 전역 변수의 포인터,함수 포인, 멤버 함수 포인터, 그리고 타입, 사용자 정의 타입등 을 예로 들 수 있다. ... 이런 문구를 보면, 딱 생각 나는게 있지 않는가?

그렇다 바로! "템플릿" 이다! 템플릿으로 으로 정렬을 전달하게 되면 컴파일 타임에 정렬을 정할 수 있게 된다.


컴파일 타임에 어떻게 하면, 문자열 정렬 기준을 전달 할 수 있을까?

기본적인 예로 소스 코드를 보자, 소스 코드를 보면 한눈에 들어 오니, 더 편할 것이라고 생각 한다.

string 클래스는 전체적인 흐름에서 신경쓸 필요가 없고, compare 함수와 Cmp 클래스를 보도록 하자. compare 함수의 요구 템플릿 매개변수가 두개인데, 두번째 매개변수를 어떻게 사용 하는지 유심히 보면, 내부에서 static 함수를 호출 하여, 비교를 한다.

만약 Cmp 내부 함수의 형식만 맞쳐주고, 그 상세 구현 상태만 변경해 준다면, 정렬 기준이 쉽게 변하는 것을 볼 수 있을 것이다.


이것은 한가지 "템플릿 매개변수 결정하기 알고리즘"을 말해준다고 나는 생각한다.

1. 무엇이 변수 인가?
2. 그 변수가 컴파일 타임에 결정해도 무리가 없는가?
3. 사용하기에 불편한가?

3번까지 왔을 때, 긍정적이라면, 그것은 충분히 템플릿 매개변수로써 사용 될 수 있다는 것을 의미한다.


총평

좀 더 공부 해야 되겠다고 생각한다. 특히 문제를 발견하는 알고리즘과 문제를 정의하는 알고리즘, 문제를 해결 하는 알고리즘 쪽이 너무 부족하다. 언제까지 감에 의존해서 코딩 할 수는 없다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요