트랙백: STL에 대한 논란: 아는 만큼 보인다. - object 님
음... 저는 아직도 STL에 대한 논란이 존재한다는 것이 더 놀랍습니다. 개인적으로 C++ 언어 자체는 별로 마음에 안들지만, 그럼에도 불구하고 요즘 C++을 즐겨 사용하는 가장 큰 이유는 바로 STL 때문입니다. 만일 지금의 C++ 에서 STL이 빠져있었더라면 저는 C++에는 눈길도 주기 않았을 겁니다.
STL을 싫어하는 이유 중 하나가 코드가 예쁘게 나오지 않는다는 것도 있다지만, 그건 STL의 설계가 개판이라기 보단 예초에 C++ 언어의 한계입니다. C#이나 요즘의 자바처럼 foreach 문 같은 걸 제공하는 것도 아닌 환경에서 iterator를 깔끔하게 쓰는 것도 쉽지가 않습니다. 하지만, 이것도 #define 매크로로 조금은 깔끔하게 다듬을 수 있고, 아니면 boost에서 제공하는 foreach를 쓰면 아주 깨끗하게 쓸 수 있습니다. 하지만 사실 더욱 STL 답게 쓰려면 for 문으로 iterator를 탐색하지 말고, for_each() 와 함수 객체를 조합하는게 더 낫습니다. 그리고 이쪽이 성능에 있어서도 더 나은 결과를 보입니다.
제가 생각할 때 STL은 C++이 가진 한계를 라이브러리 차원에서 확장시킨 대단한 물건입니다. 원래 C++ 언어의 스펙에 없던 것을 반은 억지로 구현하려는 것이다 보니 코드가 깔끔하게 나오지 못하는 건 사실 어쩔 수 없습니다. (특히나 함수형 프로그래밍의 개념을 흉내내려는 그 모양새에서는 정말 눈물이 나올 지경이었습니다.) 하지만 그럼에도 불구하고 STL은 프로그래머가 해야될 삽질을 너무나 많이 줄여주고 있습니다. 그래서, 정말 쓰면 안되겠다 싶을 경우가 아닌한 STL의 도입은 거의 필수로 생각하고 있습니다.
"아는 만큼 보인다"는 말이 저는 정말 공감합니다. 저도 디자인 패턴과 Smalltalk나 Haskell 같은 제 3세계(?) 언어들을 공부해 보고 나서야, 'STL에서는 왜 그런 식으로 했는가' 라는 게 조금 보이기 시작했습니다. C++의 표준 라이브러리를 설계하는 인간들이 절대 바보가 아닙니다. 아무리 엿 같이 보여도 그 설계에는 다 이유가 있었습니다. 저는 솔직한 심정으로, 저런 거지같은 C++에서 STL을 그런 수준으로까지 설계해낸 것 자체가 너무 대단하다고 생각합니다. 저라면 죽었다 깨어나도 저런 미친짓은 불가능해요...
아직도 STL을 왜 쓰는지 모르겠다고 생각된다면, '디자인 패턴' 관련 책을 한번 정독해서 읽어보길 권합니다. 그리고 Ruby 같은 객체지향 스크립트 언어나 혹은 Smalltalk(강추!)를 대충이라도 한번 공부해 보고, 그러고도 시간이 남아 돈다면 LISP나 Haskell 같은 함수형 언어도 살짝 맛을 보는 것도 권장합니다. 간단히 말해, 이들 언어에서 하는 짓거리를 C++에서 그나마 비슷하게 흉내내는 것이 STL이라고 할 수 있겠습니다.
음... 저는 아직도 STL에 대한 논란이 존재한다는 것이 더 놀랍습니다. 개인적으로 C++ 언어 자체는 별로 마음에 안들지만, 그럼에도 불구하고 요즘 C++을 즐겨 사용하는 가장 큰 이유는 바로 STL 때문입니다. 만일 지금의 C++ 에서 STL이 빠져있었더라면 저는 C++에는 눈길도 주기 않았을 겁니다.
STL을 싫어하는 이유 중 하나가 코드가 예쁘게 나오지 않는다는 것도 있다지만, 그건 STL의 설계가 개판이라기 보단 예초에 C++ 언어의 한계입니다. C#이나 요즘의 자바처럼 foreach 문 같은 걸 제공하는 것도 아닌 환경에서 iterator를 깔끔하게 쓰는 것도 쉽지가 않습니다. 하지만, 이것도 #define 매크로로 조금은 깔끔하게 다듬을 수 있고, 아니면 boost에서 제공하는 foreach를 쓰면 아주 깨끗하게 쓸 수 있습니다. 하지만 사실 더욱 STL 답게 쓰려면 for 문으로 iterator를 탐색하지 말고, for_each() 와 함수 객체를 조합하는게 더 낫습니다. 그리고 이쪽이 성능에 있어서도 더 나은 결과를 보입니다.
제가 생각할 때 STL은 C++이 가진 한계를 라이브러리 차원에서 확장시킨 대단한 물건입니다. 원래 C++ 언어의 스펙에 없던 것을 반은 억지로 구현하려는 것이다 보니 코드가 깔끔하게 나오지 못하는 건 사실 어쩔 수 없습니다. (특히나 함수형 프로그래밍의 개념을 흉내내려는 그 모양새에서는 정말 눈물이 나올 지경이었습니다.) 하지만 그럼에도 불구하고 STL은 프로그래머가 해야될 삽질을 너무나 많이 줄여주고 있습니다. 그래서, 정말 쓰면 안되겠다 싶을 경우가 아닌한 STL의 도입은 거의 필수로 생각하고 있습니다.
"아는 만큼 보인다"는 말이 저는 정말 공감합니다. 저도 디자인 패턴과 Smalltalk나 Haskell 같은 제 3세계(?) 언어들을 공부해 보고 나서야, 'STL에서는 왜 그런 식으로 했는가' 라는 게 조금 보이기 시작했습니다. C++의 표준 라이브러리를 설계하는 인간들이 절대 바보가 아닙니다. 아무리 엿 같이 보여도 그 설계에는 다 이유가 있었습니다. 저는 솔직한 심정으로, 저런 거지같은 C++에서 STL을 그런 수준으로까지 설계해낸 것 자체가 너무 대단하다고 생각합니다. 저라면 죽었다 깨어나도 저런 미친짓은 불가능해요...
아직도 STL을 왜 쓰는지 모르겠다고 생각된다면, '디자인 패턴' 관련 책을 한번 정독해서 읽어보길 권합니다. 그리고 Ruby 같은 객체지향 스크립트 언어나 혹은 Smalltalk(강추!)를 대충이라도 한번 공부해 보고, 그러고도 시간이 남아 돈다면 LISP나 Haskell 같은 함수형 언어도 살짝 맛을 보는 것도 권장합니다. 간단히 말해, 이들 언어에서 하는 짓거리를 C++에서 그나마 비슷하게 흉내내는 것이 STL이라고 할 수 있겠습니다.




덧글
사실 C쪽 문자열 처리는 귀찮은게 많아서.. -_-
그리고 결국 그렇게 구현하는 게 정당하다... 라는 것도 알게되구요...
주위 사람들한테도 권해보고 싶은데, 아직은 공부가 깊지 않아서 그런지
high-order function 이나 first-class function 개념을 이용한 추상화
프로그래밍이 좋다 뭐 이런 두리뭉실한 이야기 외에는
딱히 뭐가 좋다고 말하기가 어렵더군요 ^^;
오브젝트님 홈피에서 트랙백 보고 왔다가 , 흐뭇한 백합 만화도 잘 보고 갑니다.
앞으로 자주 들려야 겠습니다..ㅎㅎ
Anti design pattern 이란 책이 나왔지요.
그리고 STL 보다 훨씬 나은 인터페이스도 이미 예전에 다 시도가 되었답니다.
small talk 와 c/c++ 이 동일한 목적을 가져야 한다는걸 지식이라고 자랑하신다니...
참 이런걸 철없는 아이들이 보고 또 용팔이스런 망상에 빠질까 걱정되는군요.
아는만큼 보인다 하셨습니까? 고작해야 언어의 추상적 상징성에만 집착하는건 개발자의 지식이 아닙니다.
용팔이의 지식일 뿐이지요. 자아충족을 위한...
제가 어디에서 C++과 Smalltalk가 동일한 목적을 가져야 한다고 얘기 했나요? 적어도 템플릿과 STL은 다른 언어들의 패러다임을 수용하기 위해 도입된 겁니다. C++의 장점을 살리면서도 멀티패러다임까지 받아들여서 지금까지 발전해온 언어인 겁니다. 이것은 프로그래밍 방식의 문제이지, 목적과는 관계가 없습니다.
프로그래밍 언어가 고도의 추상성을 추고해야 되는 이유는 당연히 있습니다. 물론 이것만이 전부라 할 순 없지만, 이 글은 STL에 관한 주제이기 때문에 여기에 초점이 맞춰지는 겁니다. 제가 여기서 프로그래밍의 원론적인 부분까지 서술해야 할까요? 그럴바엔 아예 책을 하나 쓰겠습니다.
일단 글의 목적자체가 STL을 옹호하기 위한 거였으니까, 그런식으로 해석되었다고 하면 할 수 없습니다만...
글쓰신 분은 C/C++을 얼마나 알고 계시나요?
C++이 가진 한계라.. 그게 어떤 거지요?
C++ 언어의 스펙에 없던 것을 반은 억지로 구현한 것이 STL이라는 말은 난생 처음 들을 뿐더러, C++ 언어의 스펙에 없던 것을 어떻게 구현할 수 있었는지도 참 궁금하네요.
C언어를 만든 커니건과 데니스 리치가 만든 굉장히 얇은 C 언어 책에 이렇게 쓰여 있죠.
"C is not a big language, and it is not well served by a big book."
하지만 그 C언어로 굉장히 많은 어마무지한 일들을 하고 있습니다
스트로스트롭 교수님이 듣고 기절하실 얘기를 참 많이도 하셨군요.
C++은 초기에는 C에 객체지향 개념을 추가한 정도 수준에서 점차 표준을 확장하면서 지금까지 발전해온 언어입니다. 하지만 언어의 확장은 비단 스펙이나 문법적 확장만 있는게 아닙니다. 일례로 Smalltalk같은 경우는 60년대에 설계된 언어임에도 문법적 변화보단 라이브러리 차원에서 언어의 기능을 확장해 왔습니다. STL같은 경우도 그 예에 속한다 할 수 있겠습니다.
그리고 실례지만, 제가 언어적 차원에서 C/C++은 깊이 공부해왔다고 자부합니다. 그리고 현재 C++로 밥벌어 먹고 살고 있지요. 어셈블리부터 Smalltalk에 이르기까지 다양한 수준의 언어들을 써보고 공부하면서 느끼고 생각해 온 것들입니다. 언어만 공부한지 대략 10년은 넘었습니다.
강산이 변한다는 시간만큼 C++과 파스칼, 등등을 써봤습니다 .특히 C++은 10년내내 써본 입장에서 글을 좀 끄적여봅니다.
제가 보기엔 오히려 비하하는 글쓴님들의 기술적 수준이 낮아 보이네요.
디자인 패턴의 진정한 의미가 뭔지도 글쓴님의 문맥이 뭘 의미하는지도 모르면서
C++이 가진 언어적 한계라는게 구현이 안된다 뭐이런걸로 받아 들인다면 이제 갖 C++좀 배워서 사용해볼까 하는 단계군요...
C++은 확실히 언어적 한계가 있습니다. 중구 난방으로 확장되서 정리 되지 못한 기법들, 언어적 지원, 구조(.h .c) 컴파일러의 한계.. 전혀 모르고 계시는듯..
글쓴님은 그런것중에서 다른 언어들의 제네릭프로그래밍의 패러다임에 맞게 발전되어 추가된 STL의 장점을 얘기 하는데...
문맥을 이해하지 못하고 무조건 디자인 패턴을 써야 한다..라고 받아 들이고 비유하자면. 좌파니 우파니식으로 꼭나눌려고 하는 식이군요...
"small talk 와 c/c++ 이 동일한 목적을 가져야 한다는걸 지식이라고 자랑하신다니.."
특히 이런 문장의 글이 나오는걸 보니 딱 대학교 갖졸업하고 이제 C++이 최강이다란식으로 갖 개발의 세계에 입문한 티를 팍팍 내시면 자기 5년 10년뒤에 보세요.. 얼마나 챙피한지.. 쯔쯔... 자기가 공부한것이 아는것이 세상의 모든 지식인것마냥..
자신의 지식과 남의 지식을 비교하여 남을 깍아 내리면 자신이 빛난다는 생각의 느낌이 너무 드는군요....
서핑하다 참 긴글 써봅니다.
개발자들에게 철학책이 정말 필요하다는걸.. 새삼 느껴지는군요.