Media Log

이펙티브 C++ - 10점
스콧 마이어스 지음, 곽용재 옮김/피어슨에듀케이션코리아

한 동안 계속 C로만 코드를 짜다가 최근 회사를 옮기면서 C++를 다시 하고 있는데 C++로 코딩하는게 그렇게 재미있을 수가 없다.

이 책은 2006년도에 회사에 갓 들어가서 한 번 읽었던 책인데, 최근 읽은 Effective STL이 너무 재미 있어서 5년여 만에 다시 꺼내어 읽어 본 책이다.
두번째로 읽었지만 그 당시 읽었던 것보다 더 재미있게 읽었고 정말 많은 부분을 놓치고 지나갔었다는 것을 알게 되었다.

이 세상에 스캇 마이어스처럼 C++를 재밌고 간결하게 설명할 수 있는 사람이 있을까? 있을수도 있지만 아마 비야네 스트롭은 아닐 것이다. 비야네의 책은 좋은 책임에는 분명하지만 정말 재미없고 어렵다. -.-

책을 읽다가 문득 궁금했다. 혹시 이제 C++11 버전 에디션을 하나 내지는 않을까? 어쩌면 이미 준비하고 있는 것은 아닐까?
그래서 한 번 메일을 보내서 물어봤는데, 맙소사 스캇 마이어스가 내게 답장을 해주다니.

안타깝게도 아직은 계획에 없다고 한다. 새 버전의 책은 분명히 쓸만한 가치가 있지만 C++11을 Effective하게 사용하는 법을 쓰기 위해서는 먼저 그에 대한 충분한 경험이 필요하기 때문이라고 한다.
뭔가 새 버전만 나오면 남에게 뒤질세라 대충 공부해서는 얼른 책 한권을 만들어 내는 요즘 세상에 참 멋진 해커가 아닌가?
아마도 스캇 마이어스가 말하는 충분한 경험이란 꼴랑 두세달 공부하는 것은 아닐 것이다.
오래 기다려야 할 것 같아서 안타깝긴 하지만 언젠가는 꼭 다음 에디션이 나오게 되지 않을까 싶다.
저작자 표시 비영리 동일 조건 변경 허락
신고
  1. kwon at 2011.08.24 16:28 신고 [edit/del]

    저도 읽을 때마다 재미나게 읽고 놓쳤던 부분을 항상 찾게 되서 읽게 되는 책이예요~ 보물같은 책!!!ㅋ

    Reply
  2. 방문자 at 2013.07.01 00:51 신고 [edit/del]

    c++11버전을 준비중이라고 합니다.
    지나가던 길에 소식 전하고 갑니다.

    Reply

submit

C++을 사용하다 보면 다른 언어의 라이브러리들이 부러운 경우가 많이 있다.

정규표현식은 그 중 하나였는데, 다행히도 VS2008 SP1 이상을 쓰고 있다면 TR1이 내장되어 있어 다른 어떤 써드파티 라이브러리를 연결하지 않고도 #include <regex> 한 줄만 추가해줌으로써 쉽게 사용할 수 있게 되었다.

다음은 원하는 문자열을 매치해서 결과를 받아보는 간단한 예제이다.
const std::string s("Hello World");

std::tr1::smatch m;
std::tr1::regex rx("(\\w+) (\\w+)");
bool fMatched = std::tr1::regex_match( s, m, rx );

if ( fMatched )
{
    std::cout << "size : " << m.size() << std::endl <<
                    "match0 : " << m[0] << std::endl << 
                    "match1 : " << m[1] << std::endl << 
                    "match2 : " << m[2] << std::endl;
}

size : 3
match0 : Hello World
match1 : Hello
match2 : World

match 객체의 첫번째 요소에는 매치된 모든 문자열이 담기게 되고, 그 다음 요소들 부터는 캡쳐한(괄호로 둘러싼) 문자열들이 저장된다. 위 예제에서는 첫번째 단어와 두번째 단어를 캡쳐해봤다. -물론 캡쳐 없는 괄호 (?: )을 사용해서 캡쳐 기능을 제거할 수도 있다.
파이썬이나 C# 등의 다른 정규식 라이브러리에서도 대부분 위와 흡사한 인터페이스를 제공한다.

다음 코드는 문자열을 치환한다.
const std::string s("Hello World");
std::tr1::regex rx("^\\w+");
std::string t = std::tr1::regex_replace( s, rx, std::string("Great") );
std::cout << t << std::endl;

위 코드는 첫 번째 단어를 "Great" 라는 문자열로 치환시킨다.
Great World


치환할 때 백레퍼런스도 역시 사용이 가능하다.
std::tr1::regex rx("(^\\w+)");
std::string t = std::tr1::regex_replace( s, rx, std::string("Great $1") );

첫번째 캡쳐그룹을 치환시에 재사용 하였다.
Great Hello World


간단하게 설명하기 위해서 예제의 실용 가치가 없어져 버렸지만, 잘 응용하면 많은 곳에 적용할 수 있을 것이다.

예전에 이메일 검증 함수를 골뱅이와 .을 찾아가면서 CString의 Find 함수로 떡칠을 하면서 만든적이 있었는데, 시간이 지나고 어느 날 RFC 문서에서 이메일 형식 명세를 보다가 아 내가 엉터리로 만들었구나 하고 깨달았던 기억이 난다. Email이나 URL 형식 같은 것들은 정규식 없이 검증 함수를 만들기엔 생각보다 훨씬 복잡하다.

다른 언어들보다 사용법이 조금 까다롭고 보기에도 좋지는 않지만, 이 정도만으로도 C++ 프로그래머들은 고마움에 눈물이 날만하다.

C++0x에서는 파이썬의 r""이나 C#의 @"" 같은 raw string 기능도 언어에 포함될 예정인데, 그 때가 되면 조금 더 보기 좋게 정규식을 사용할 수 있을 것이다.

신고
  1. Favicon of http://kate.textcube.com BlogIcon Briller_Kate at 2009.07.02 00:55 신고 [edit/del]

    태정님 블로그에서 주로 볼 수 있었던 @_ @ 포스트! ^^;

    Reply
  2. 이종협 at 2011.04.14 15:32 신고 [edit/del]

    제법인데 ㅋㅋㅋ regex 때문에 골머리 아퍼~
    AutoCad 쉐리들은 왜케 프로그램을 잘만들어서 귀찮게 하는지..

    Reply

submit