STL을 공부해보니..

Tags:

http://tinyurl.com/2xhkn 앞서의 질문은 여기에 포스팅해서 물어보고 있음..

C++을 처음 접한건 중2인가 쯤이었는데.. 그때쯤 C언어를 확실히 쓸 수 있다는 생각이 들었던 상황이었고, 또 마침 C++이라는 언어가 뜨기 시작했던 것 같다. 내 기억이 맞다면 아마 그 때 난 피터 노턴의 책을 읽으면서 C++의 기본을 배워갔는데, 아쉽게도 디자인 패턴이란 개념이 그때에도 몇몇 사람들에게 알려지고 있었으나 난 그정도의 정보는 얻지 못한채 동물을 상속받은 고양이가 야옹~, 강아지가 멍멍~ 거린다는 예제나 입력해보는 정도였다. 덕분에 멤버십에 있을땐 사용가능언어에 C++도 적으면서도 햇수는 십년에 달하지만 실력은 초중급이라고 밖에 쓸 수밖에 없었다.

결국 지금까지 generic programming이란 것을 template 이라고만 생각했다. algorithm, function object adapter, container, iterator 등으로 이루어진 폰노이만, 값 모델, 성능 저하 없는 일반화 등을 모토로한 STL은 그걸 착각이었다고 말해준다. 심지어는 STL의 창시자중 한명은 generic programming은 template이 아니라고 설명해 놓았다.

그럼 뭐냐구? 무지 뜬구름 잡는거 같은 설명이라 옮겨도 별 의미는 없을 것 같다. 한번 STL을 공부해보면 내 말을 이해할 듯.. Object의 자식이 아닌 타입을 컨테이너에 저장할 수 있고, 플러그 가능한 일반화된 알고리즘에 자료구조를 플러그시키는 방식등은 정말 감동이다. 역시 C++이란 생각이 들더만.. 더군다나 인터페이스 자체에 시간 복잡도가 제약으로 주어져서 구현되었단 사실은 더욱 충격이다. 자바의 컬렉션 프레임워크도 좋다. 물론 대단히 좋다. 하지만, 자바는 결코 절대로 C++의 STL을 넘어서는건 불가능하다. 언어 자체가 그렇다.

linux기반의 프로젝트들도 점차 C#으로 옮겨간다는데 때아니게 C++에 빠져버렸다. C++을 하게되면 힘든점은 자바의 JFC나 닷넷의 BCL, VC++의 MFC 등이 없다는 것이다. 하지만 그런 것들만 해결된다면 내가 잘 아는 도메인내에서(어쨌든 나로선 C++로 전문적 쓰레드 프로그래밍을 할 일도, 네트워크 프로그래밍을 할 일도 없다)는 강력한 툴이 될 것 같다…

특히 낮에 보았던 function object를 사용해서 vector<int> 내의 모든 값들을 곱하는 프로그램은 그야말로 감동 그 자체였다. 함수 포인터를 가지고 그동안 삽질하면서 나름대로 다형적인 C를 구사해보려고 노력했었지만, 역시 고수들이 만들어놓은 STL의 함수 객체의 개념에 비하면 아무것도 아니었다. 효율적이면서도 잘 모듈화된 함수 객체. 과연 이런 것이 가능할거라는 생각조차도 나로선 하기 힘들었다.

덕분에 .NET에서의 delegate가 왜 그렇게 정의되었는지도 이해가 된다. 이젠 함수포인터, 리스너, 함수 객체, delegate로 이어지는 흐름을 알겠다.

내친김에 Effective C++ 2nd 도 주문했다. 50가지 C++의 주제들을 다룬다는데 아직은 static_cast 같은 추가된 RTTI관련 기능이나 More Effective C++에서 등장하는 더블 디스패치(아직은 안읽어서 뭘 디스패치 하겠단 건지 모르지만) 등의 베이스 아이디어가 소개된다고 한다.. 그래서 기대 중이다..

적당히 하고 다음 논문 준비나 해야하는데, 체질상 어쩔 수가 없다. 일단 프로그래밍 공부에 빠지는 시즌이 다가오면 그것에 미쳐버린다…

처음 자바를 만났을 때가 그랬다. C#을 처음 만났을 때도. 자바의 기본서 (자바 프로그래밍 바이블을 봤음)을 보는데는 1주일이 걸렸다. 정말 그렇게 재미있을 수가 없었다. 매일같이 콘솔에서만 작업하다가 뭔가 인터넷환경에서 돌아가는걸 그렇게나 쉽게 만들 수 있다니. C#은 자바의 판박이었던 덕에 (기본문법이 거의 같다) 문법을 아는데는 하루면 충분했다. 문제는 서서히 언어들이 머리속에 쌓여가면서 서로 헷갈린단거지.

가끔 누군가 내게 프로그래밍 공부에 대해서 물어볼 때가 있다. 그럼 난 무슨 무슨 책을 보라고 얘기해준다. 가장 답답한건, 그들이 절대로 내가 말해준 책은 펼쳐보지도 않으면서 입으로만 ‘공부해야하는데’ 라고 말하는 거다. t모씨도 한때는 절대 수시간 삽질 한 뒤에만 질문을 올리라는 글을 홈페이지에 올린적이 있었다. 사실, 그렇게 말하는게 이해가 간다.

물론 내가 누군가 묻는 질문에 금방 답을 해주면, 그 사람은 쉽게 그 지식을 습득한다. 하지만 더욱 중요한 것은 그 지식을 습득하기 위한 절차와 방법의 습득이다. 예를들자면, 소공 프로젝트때 모씨가 내게 코딩에 대해서 뭔가를 물어본적이 있었다. 난 그냥 ‘알아서해. 무조건 찾아서 무조건 해놔’라고만 했다. 물론 나도 모르는 내용이었으니까 그렇게 답해줄 수 밖에 없었다. 아마 내가 그때 바로 물어본 내용을 찾아서 알려준다면 물어본 이보다는 빨리 찾아서 가르쳐 줄 수 있었을 거다. 하지만 그렇게 되면 내게 물어본 사람은 계속 내게 의존할 수 밖에 없고, 나는 서서히 내 할일을 못하고 대답해주기에만 바빠야한다. 그럼 물어보는 이는 내게 모르는 것이 없다며 서서히 선망의 시선을 가지게 되고, 그러면서 결국 나와 그 사람간에는 넘을 수 없는 단계 같은 것이 존재하는 것 처럼 보이게된다. 하지만 그런 단계같은 것은 애시당초 존재하지 않는다. 그래선 서로에게 득이 안된다.

얼마전에도 누군가 내게 C#으로 프로그래밍을 할때 도움을 달라고 말했다. 난 기본서 몇권을 보라고 말해주었고, 거기에 ADO.NET 책 하나도 봐야한다고 말했다. 그랬더니 문법 공부는 이미 끝냈다고 내게 말했다. 그리고 며칠뒤 내게 한 질문은 ‘Console.Write’와 ‘Console.WriteLine’ 이 다른 점이 무엇인가 하는 것이다. 한마디로 기가 막혔다. 이정도까지 노력하지 않는 사람에게는 아무것도 가르쳐주고 싶지 않다. (그래 나 성격 더럽다.)

프로그래밍은 가속이 붙는 공부이다. 만약 처음 언어를 배운다면 그걸 자유자재로 다루는데는 굉장히 긴 시간이 걸린다. 더군다나 C부터 시작한다면 수년이 걸릴 수도 있다. 하지만 하나가 끝나면 다른 하나로 넘어가는데 긴 시간이 걸리지 않는다. 나역시 C 완전히 알았다고 생각하는데는 초등학교 5학년부터 고2까지의 시간이 걸렸다. C++의 기본문법을 아는데는 (물론 C++의 문법이상은 나도 모른다) 일주일이 걸렸다. 자바역시 기본문법은 일주일이 걸렸다. 그후로는 파이썬은 약 2일이 걸렸다. C#은 1일이 걸렸다. 문제는 그 다음 얼마나 그 언어로 이루어진 프레임워크를 아는가의 문제인데, 그것은 결국 얼마나 많이 쓰고 얼마나 오래쓰냐의 문제이다. 그리고 내가 그 언어에 대해서 모르는 내용을 어디서 어떻게 찾아보는가를 익히는 것이다. 뉴스그룹도 좋은 소스이다. 정말 어려운 프로그래밍 문제라면 뉴스그룹(http://groups.google.com이 좋다)을 사용해보기를 추천한다. 만약 자기가 정말 관심있는 언어가 있다면 관련된 언어의 뉴스그룹을 1년만 매일같이 읽어도 한국내에선 중수에서 고수의 반열에 오를 수 있다. 결국, 내가 겪을 문제는 남도 겪는다. 한마디로 남의 경험에서 쉽게 배운다는 것이다.

또 누군가는 내게 나만큼 오라클을 다루는데 얼마나 걸리냐고 말했다. 그래서 1년이 걸린다고 말했다. 난 오라클을 다루는데 뛰어난 사람이 아니다. 하지만 자격증을 따는데 1년, 그 뒤로 열정적으로 공부했던 기간이 1년정도였으니 합하면 2년이다. 그래서 1년이라고 대답해준 것이다. 정말로 1년만 관심을 갖고 공부하면 어디가서 오라클 DB하나의 주제만으로는 쉽게 밀리지 않는다. 더 간단하게 말해서 오라클 메뉴얼 전부와 그분야의 책 10권 이상만 읽으면, 적어도 한국내에서는 쉽게 밀리지 않는다. 결국, 무진장 진입 장벽도 낮고 쉽다. 심지어 한국 OTN(oracle technology network) 홈페이지의 포럼에 가면, 최신 버젼의 문법들과, 조금은 상당한 난이도에 속하는 내용들에 대답을 척척하는 사람들이 무척이나 많다. 문제는 그동안 계속 관심을 가지고 공부하는게 쉽지 않고, 그렇게 알게 된 지식이 그렇게 높은 값이 매겨지지 않는다는데 있을 뿐이다.

Comments

4 responses to “STL을 공부해보니..”

  1. nobody Avatar
    nobody

    오~ 너 오라클 자격증 있냐?

  2. 민구 Avatar
    민구

    어.. 군대에서.. ㅋㅋㅋ

  3. trax Avatar

    ㅎㅎ, 드디어 STL의 세계에 온 것을 환영합니다….
    근데, 예전에 홈페이지에서 delegate에 대해서도 말했던 것 같은데… 이제서야…. 이해하셨다고 말하시면… 흑… ^^

    STL은… 앞으로도 저도 5년 정도는 더 공부해야할 거라 생각해요. Effective C++ 2nd 사기로 한 것 잘 했어요. 읽어볼만한 책이지만, 너무 많은 걸 기대하진 마시길. 충분한 경험이 있을때 읽어야 더 깊은 맛이 나올 것 같아서 일단 보긴 했지만, 전 나중에 다시 볼 생각이랍니다.

    그리고 C++ In Depth 시리즈 5권 전권이 번역되어 나왔는데 꼭 읽어보시기 바랍니다. 사실, Accelerated C++ 같은 경우에는 제가 바보 같아서 3번이나 읽었어야 했던 비운이 있습니다. ^^

    나중에 또 재미있는 책들을 원하시면 말하시구요.
    아, Software Exorcism도 읽어보세요. XP나 소프트웨어 공학쪽하고 비슷하긴 한데, 역시나 얻을거리가 많다고 생각합니다.

    그리고, Code Generation in .NET, Apress에서 이번에 2003/4월에 나온 원서가 있는데 읽어보시길.
    물론, 컴파일러론을 공부했겠지만 이론적인 것보단 실질적인 면에서 정말 재밌게 볼만한 책이 될거라 생각합니다.

    delegate 뿐만 아니라 attribute-oriented programming(?)이라고 제가 마구 불러 버리는 것은 VC++ 뿐만 아니라 .NET language들의 특징이기도 한데… 이것이 AOP가 현재 언어에 적용되어 있는 것이라고…(한때 민구씨가 AOP에 관심이 있는 wegra님에게서 영향을 받은듯한 글을 썼지만), 그것에 대해서는 Applied .NET Attributes, Apress 2004/3월에 출간된 책을 읽어보시기 바랍니다. 굉장히 얇은 책이지만 이것만으로도 굉장히 얻을게 많답니다.

    프로그래밍 언어에서 이제 상수(const)를 쓰지 않는 것이 유형이 되어 가고 있습니다. 뭐, 아직도 학교나 학원, 일반 초보 프로그래머… 아니 심지어 중급자나 고급자들도 상수는 꼭 써야하는 것이라고 말하겠지만, Applied.. 를 읽어보시면 상수는 어떨 때 써야하는지에 대한 보다 분명한 기준도 세우실 수 있을거라 생각합니다. ^^

    – serene

  4. 민구 Avatar
    민구

    아무래도, 그때 delegate에 대해서 생각한 것과 지금와서 생각한 것은 또 다르네요.. 그때도 뭔지는 알았죠. 다만 왜 그렇게 만들어졌을까는 몰랐지만..

    추천서 목록 고마워요.. acclerated C++도 굉장히 어려운 책 같던데.. 역시나 t모씨는 벌써 읽으셨군요.. ㅋㅋㅋ (안본책이 뭐유?)

    말씀하신 책들은 꼭 읽어볼께요.. ^^

Leave a Reply

Your email address will not be published. Required fields are marked *