이미 소장하고 있다면 판매해 보세요.
|
Chapter 1 효과적인 컨테이너(Container) 요리법
항목 1 : 적재적소에 알맞은 컨테이너를 사용하자 항목 2 : "컨테이너에 독립적인(container-independent) 코드"라는 환상을 조심하자 항목 3 : 복사(Copy)는 컨테이너 안의 객체에 맞게 비용은 최소화하며, 동작은 정확하게 하자 항목 4 : size()의 결과를 0과 비교할 생각이라면 차라리 empty를 호출하자 항목 5 : 단일 요소를 단위로 동작하는 멤버 함수보다 요소의 범위를 단위로 동작하는 멤버 함수가 더 낫다 항목 6 : C++ 컴파일러의 어이없는 분석 결과를 조심하자 항목 7 : new로 생성한 포인터의 컨테이너를 사용할 때에는 컨테이너가 소멸되기 전에 포인터를 delete하는 일을 잊지 말자 항목 8 : auto_ptr의 컨테이너는 절대로 만들지 말자 항목 9 : 데이터를 삭제할 때에도 조심스럽게 선택할 것이 많다 항목 10 : 할당자(allocator)의 일반적인 사항과 제약 사항에 대해 잘 알아두자 항목 11 : 커스텀 할당자를 제대로 사용하는 방법을 이해하자 항목 12 : STL 컨테이너가 쓰레드 안전성에 대한 기대는 현실에 맞추어 가지자 Chapter 2 vector와 string 항목 13 : 동적으로 할당한 배열보다는 vector와 string이 낫다 항목 14 : reserve는 필요 없이 메모리가 재할당되는 것을 막아 준다 항목 15 : 잊지 말자! string은 여러 가지 방식으로 구현되어 있다는 사실을... 항목 16 : 기존의 C API에 vector와 string을 넘기는 방법을 알아두자 항목 17 : 쓸데없이 남은 용량은 "바꿔치기(swap) 묘수"를 써서 없애 버리자 항목 18 : vector 보기를 돌같이 하자 Chapter 3 STL 연관 컨테이너(Associative Containers) 항목 19 : 상등 관계(equality)와 동등 관계(equivalence)의 차이를 파악하자 항목 20 : 포인터를 저장하는 연관 컨테이너에 대해서는 적합한 비교(비교 함수자) 타입을 정해주자 항목 21 : 연관 컨테이너용 비교 함수는 같은 값에 대해 false를 반환해야 한다 항목 22 : set와 multiset에 저장된 데이터 요소에 대해 키(key)를 바꾸는 일은 피하자 항목 23 : 연관 컨테이너 대신에 정렬된 vector를 쓰는 것이 좋을 때가 있다 항목 24 : map::operator[]나 map::insert는 효율 문제에 주의하여 선택하자 항목 25 : 현재는 표준이 아니지만, 해쉬 컨테이너에 대해 충분히 대비해 두자 Chapter 4 반복자(Iterators) 항목 26 : const_iterator나 reverse_iterator, const_reverse_iterator도 좋지만 역시 쓸만한 것은 iterator이다 항목 27 : const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자 항목 28 : reverse_iterator에 대응되는 기점 반복자(base iterator)를 사용하는 방법을 정확하게 이해하 자 항목 29 : 문자 단위의 입력에는 istreambuf_iterator의 사용도 적절하다 Chapter 5 알고리즘(Algorithms) 항목 30 : 알고리즘의 데이터 기록 범위(destimation range)는 충분히 크게 잡자 항목 31 : 정렬시의 선택 사항들을 제대로 파악해 놓자 항목 32 : 요소를 정말로 제거하고자 한다면 remove 류의 알고리즘에는 꼭 erase를 붙여 사용하자 항목 33 : remove와 비슷한 알고리즘을 포인터의 컨테이너에 적용할 때에는 각별히 조심하자 항목 34 : 정렬된 범위에 대해 동작하는 알고리즘이 어떤 것들인지 파악해 두자 항목 35 : 대소문자를 구분하지 않는 문자열 비교는 mismatch 아니면 lexicographical_compare를 써서 간단히 구현할 수 있다 항목 36 : copy_if를 적절히 구현해 사용하자 항목 37 : 범위 내의 데이터 값을 요약하거나 더하는 데에는 accumulate나 for_each를 사용하자 Chapter 6 함수자, 함수 객체, 함수, 기타 등등 항목 38 : 함수자 클래스는 값으로 전달되도록(pass-by-value) 설계하자 항목 39 : 술어 구문은 순수 함수로 만들자 항목 40 : 함수자 클래스는 어댑터 적용이 가능하게(adaptable) 만들자 항목 41 : ptr_fun, mem_fun, mem_fun_ref의 존재에는 분명한 이유가 있다 항목 42 : less는 operator<의 의미임을 꼭 알아두자 Chapter 7 STL 프로그래밍을 더 재미있게 해주는 팁 모음 항목 43 : 어설프게 손으로 작성한 루프보다는 알고리즘이 더 낫다 항목 44 : 같은 이름을 가진 것이 있다면 일반 알고리즘 함수보다 멤버 함수가 더 낫다 항목 45 : count, find, binary_search, lower_bound, upper_bound, 그리고 equal_range를 제대로 파악해 두자 항목 46 : 알고리즘의 매개 변수로는 함수 대신 함수 객체가 괜찮다 항목 47 : 쓰기 전용(write-only) 코드는 만들지 말자 항목 48 : 용도에 맞는 헤더를 항상 #include하자 항목 49 : STL에 관련된 컴파일러 진단 메시지를 해석하는 능력을 가지자 항목 50 : STL 관련 웹 사이트와 친구하자 부록 A : 로케일(Locale), 그리고 대소문자를 구분하는 문자열 비교법 부록 B : 마이크로소프트의 STL 플랫폼에 대한 첨언(添言) |
|
스캇 마이어스(Scott Meyers)는 C++ 소프트웨어 개발 분야에 있어서 전 세계적으로 잘 알려진 권위자 중 한 명이다. 공전의 베스트 셀러인 Effective C++와 More Effective C++의 저자인 그는 C++ Report의 칼럼니스트였으며, C/C++ Users Journal과 Dr. Dobb's Journal 등의 유수의 프로그래밍 잡지의 단골 기고자임과 동시에 전 세계의 의뢰인들에게 컨설팅을 해주고 있다. 또한 마이어스는 현재 NumeriX LLC 사와 InfoCruiser Inc.의 자문 위원회의 일원으로 활동하고 있으며, 브라운 대학(Brown University)에서 받은 전산학 박사 학위(Ph. D. of Computer Science)를 가지고 있다.
필자가 C++ 표준 템플릿 라이브러리(Standard Template Library, 이하 STL)에 대해 처음 지면상으로 이야기한 것은 1995년에 나온 필자의 저서 More Effective C++의 마지막 항목(35 번)을 STL에 대한 전반적인 소개로 마무리했을 때였던 것 같다. 그때 조금 더 잘 알았더라면 하는 생각도 들지만.. 어쨌든 그후부터 필자는 "언제 STL을 다룬 새로운 Effective" 시리즈를 쓸 것이냐는 메일을 받기 시작했다. 사실 STL에 대해 책을 쓸 생각을 바로 한 것은 아니었다. 처음 필자는 STL에 대해 남들에게 어떻게 해라..라고 설명해줄 정도로 STL을 매우 잘하지는 못했다. 하지만 시간과 함께 어느 정도 이것에 익숙해지면서, 필자의 머리엔 다른 생각이 들기 시작했다. "STL이란 라이브러리가 과연 효율적이고 확장 가능한 소프트웨어 설계의 돌파구를 보여준 것인가?"에 대한 의문은 결코 아니었으며, STL을 사용하게 되면서 생기는 그냥 넘어갈 수 없는 문제들이 있었다는 것이다. 간단하게 작성한 STL 프로그램이 아닌 이상 플랫폼간의 이식은 어려웠다. 왜냐하면 라이브러리의 구현 상태가 개발 도구마다 차이가 있는 데다가 템플릿(template)을 지원하는 정도도 C++ 컴파일러마다 "괜찮은 것"에서 "어처구니없는 것"까지 천차만별이기 때문이었다. STL은 처음 공부하기도 만만찮아서 "프로그래밍을 STL적으로 하기"란 쉽지 않다. 그리고 "STL 프로그래밍의 맛"을 조금 알고 난 후엔 중고급자 티 내면서 괜찮은 참조 자료를 구하려 하지만 이것도 어렵다. 무엇보다도 우리를 눈물짓게 하는 것은 소스코드에 나와 있지도 않은 클래스이니 함수이니 템플릿을 들먹이면서 C++ 컴파일러가 자포자기한 자세로 화면에 뱉어 내는 수천 문자의 진단 메시지이다. 필자는 STL이란 아주 훌륭한 개념의 라이브러리와 이를 만들기 위해 애써 주신 엔지니어들을 칭찬하고 좋아하지만, 현업 프로그래머들에게 이것을 추천하는데는 조금 불편했던 것이 사실이다. 결론적으로, "지금, STL을 효.과.적.으.로.(effectively) 사용할 수 있을까"에 대해 확신이 서지 않았던 것이다. 하지만 필자를 놀라움으로 몰고 간 "무엇"을 발견하기 시작한 것은 그 이후부터였다. 이식은 힘들고, 문서화 상태는 절망적이고, 컴파일러 진단 메시지는 전송선 잡음으로밖엔 보이지 않는데도, 필자에게 자문을 의뢰해온 많은 고객들이 "그래도(anyway)" STL을 쓰고 있었다는 것이다. 게다가, STL을 그냥 "가지고 논" 것도 아니고 소프트웨어 제품 코드에 사용하고 있었다! STL이 태초부터 "세련된(elegant)" 설계 체계를 가지고 있다는 사실은 누구도 부인할 수 없지만, 이식의 골치아픔과 부실한 문서화, 이해할 수 없는 에러 메시지 등등을 견뎌야 하는 프로그래머의 고통은 설계의 가치를 넘는 것일 테니까...라고 생각하던 필자에게 이것은 무척이나 뜻밖의 사실이었다. 꾸준히 늘어나고 있는 많은 전문 프로그래머들도 그랬을지 모르지만 필자가 무엇인가 깨닫게 된 것은 그때였다. STL이 아무리 마음에 들지 않게 구현되었을지라도, "전혀 없는 것"보다는 훨씬 나았다는 것!! 더욱이, STL을 둘러싼 주변 상황들이 좋아지기만 하고 있었다. 상용 라이브러리와 컴파일러들은 표준(ANSI 표준)에 근접해 갔고, 썩 잘 만들어진 문서도 어렵지 않게 구할 수 있게 되었으며(부록의 "참고문헌"을 봐 주기 바란다), 보기 싫던 컴파일러 진단 메시지도 많이 좋아졌다(대부분은 아직 만족할 만한 수준이 아니지만, 더 좋은 것이 나오기 전까지 대처할 수 있는 몇 가지를 항목 49에 실었다). 그리하여, "STL 진흥 운동"을 위해 필자는 기꺼이 할 수 있는 일을 시작하기로 결정했고, 이 책은 그 일의 결과이다: 여러분이 C++ 표준 템플릿 라이브러리(STL)를 잘 사용할 수 있도록 도와 줄 구체적이고 명확한 방법을 50 가지로 추려 묶은 것이다. 원래, 필자는 이 책을 1999년 후반기에 쓰고 싶었으며 그 생각에 따라 책의 전체 개요를 잡았지만 바로 예정을 바꾸었다. 책 작업을 잠시 중단하고 STL에 관련한 초심자 대상 교육 과정을 만든 후에 수 차례에 걸쳐 많은 프로그래머들을 가르쳤다. 그 후 약 1년이 지난 후에 다시 책 저술에 들어갔는데, 1년 전에 프로그래머들을 가르친 경험을 바탕으로 책의 전체 개요를 수정했다. 필자의 전작인 Effective C++가 성공적일 수 있었던 가장 큰 근본 이유가 현업 프로그래머들이 실제로 부딪히는 문제를 골격으로 잡았다고 생각하는데, 이번에 내놓은 Effective STL 역시 STL 프로그래밍을 하면서 발생하는 실제적인 문제를 가렵지 않게 해결해 주었으면 한다. 필자는 지금도 항상 C++를 좀 더 잘 이해하려고 노력하고 있는 사람중 하나이다. STL 프로그래밍을 더 멋지게 할 수 있는 방법을 알고 있든지 이 책에서 소개한 방법에 대해 의견이 있으신 분은 언제든지 필자에게 알려 주기 바란다. 상당한 공을 들여서 쓴 이 책을 가능한 더욱 정확하게 만드는 것은 필자가 계속 바라는 바이기 때문에, 혹시나 잘못 된 부분-기술적이든, 문법적이든, 인쇄 상태이든-을 발견해 알려주시면 기꺼이 그 분의 이름을 감사의 글(Acknowledgements)에 올려 드릴 것이다. 전자 메일 주소 estl@aristeia.com은 항상 열려 있으니, 많은 도움 부탁드린다. 이 책의 1쇄(first printing)가 나간 직후부터 필자는 수정된 내용을 리스트로 만들어 두었다. 여기엔 잘못된 부분의 수정, 불명확한 부분 세한 설명, 기술적으로 갱신된 내용이 -독자 여러분들의 의견과 함께 - 포함되어 있으니 꼭 참고하기 바란다. 정오표 리스트는 Effective STL의 공식 정오표 사이트인 http://www.aristeia.com/BookErrata/estl1e-errata_frames.html에서 볼 수 있다. 혹시 이 책의 변경 사항을 수시로 확인하고 싶으시다면, 필자의 메일링 리스트에 가입하는 것이 좋겠다고 생각한다. 필자는 메일링 리스트를 통해 C++에 관련된 흥미 있는 거리를 많은 분들께 제공해 드리고 있다. 좀 더 자세한 이야기는 http://www.aristeia.com/MailingList에서 접할 수 있을 것이다. --- 저자의 말 |
|
Effective STL에서 다루어진 내용의 하이라이트는 다음과 같다.
표준 STL 컨테이너(vector와 list 등), 비표준 STL 컨테이너(hash_set과 hash_map 등), 그리고 비STL 컨테이너(bitset 등)의 선택에 대한 조언 STL과 그것을 사용하는 프로그램의 효율을 극대화시킬 수 있는 테크닉 반복자(iterator), 함수 객체(function object), 할당자(allocator)의 동작 원리와, 각각을 가지고 작업할 때 해서는 안 될 일들에 대한 경험적 지식 이름이 같으나 미묘한(그러나 중요한) 측면에서 다른 동작을 보이는 알고리즘과 멤버 함수(예: find)를 적절히 골라 사용할 수 있도록 가르쳐 주는 가이드라인 이식성 문제와 이것을 피해 가는 확실한 방법에 대한 진지한 해설 |