그 부분에 있어서 알려드리자면 MFC의 진입장벽에 대한 이야기가 아니라 다른 플랫폼그건 MFC 의 문제이지 C++ 의 문제가 아닙니다. 본래 글은 OOP 의 문제를 C++만의 문제로 끌어오셨던 같고 지금의 비원님께서는 MFC 를 문제를 C++ 로 끌어오신던거 같습니다.
MS 도 이러한 MFC 의 진입 장벽에 대한 문제를 고민했습니다. (당연히..)
.NET 프레임워크를 소개하기 위한 그래프로, 기간에 따른 숙련도를 그래프로 보여줬는데....
MFC 는 처음에는 거의 배우는 것이 없다가 어느 시간에 가서 갑작스럽게 숙련도가 높아지는 계단형 그래프로 표기를 했습니다. 반면 .NET 은 그것을 최대한 일직선이 되도록 방향을 잡은 것이지요.
여하튼, MFC 의 문제점은 MS 도 개선하려고 노력했던 부분입니다. C++ 과는 전혀 관계가 없습니다.(C# 은 MFC 가 없는걸로 알고 있습니다. - 틀리다면 지적해주세요 - 애당초 MFC 의 문제를 개선한 .NET 프레임으로 시작한 것인데... 그걸 언어적 비교로 비교를 하시면 좀 곤란할 것 같습니다.)
으로 옮겼을 때 지식이 0으로 리셋된다는걸 의미한다는 그래프였습니다. 즉 VB를 하다가
MFC를 하면 단지 언어가 바뀌었음에도 불구하고 기존 지식은 거의 제대로 써먹을 수가
없었죠. 그래서 닷넷 플랫폼이 나온 이유중에 하나가 그 지식을 리셋하지 않고 점진적으로
나아갈 수 있다는게 핵심이었습니다. 이건 닷넷 플랫폼 만든 사람한테 들은겁니다. :^)
C++의 자유와 더불어 툴이 좋았습니다. VB는 툴은 좋았는데 자유가 없었지요.C++ 빌더는 UI만들때 아주 좋다고 합니다
하지만 , 여기서 C++ 빌더의 장점이 , C++ 언어가 좋아서 그런것일까요? 아님 라이브러리가 좋아서 일까요?
사실 패턴은 언어에 아주 많이 종속적입니다. 만일 언어에서 패턴을 지원하면 특별히 그 패턴을 구현하기 위해서 해주어야 할 것이 없지요. 그래서 C++이 요새 나온 다른 언어들에 비하면 불편한것이 사실입니다. 즉, 이 말은 비용은 따르지만 C++과는 상당한 차이가 날 수도 있습니다. (C#으로 옵저버 패턴 구현하는 것과 C++로 구현하는데 최소 2배 이상의 시간 차이가 걸립니다. 단순히 타이핑으로 쳐도 말이죠.)책임과 비용
일단 이 책임에 대해 곰곰히 생각해 보면, 도구(언어, 실천 방법) 사용자의 비용 문제로 이어집니다. 즉 다중패러다임을 표방하는 C++에 학습 비용이 크다고 불평합니다. 하지만 다른언어도 생각해보면 OOP의 실천방법을 알아야 하는 비용은 똑같습니다.
OOP 디자인중 중복된것을 일반화해 보급된 Pattern이라는 것이 있습니다. 이것도 모르면 실천할수 없는 도구입니다(물론 몰라도 경험에 따라 자연스럽게 쓰고있는 경우도 많습니다). 여기서 OOP를 실천하는 도구들(Pattern, Refactoring등)을 활용하는데에는 비용이 따른다는것을 알수 있습니다. 다른 언어라고 비용이 따르지 않을까요? C++이 OOP의 실천방법들을 사용자가 수행하는데 어떠한 제약을 가하고 있지 않는다는점에서 위의 인용부분을 공감하기 힘듭니다. 무엇이 허술한것 일까요.
공통 조상은 필요에 따라 없으면 만들어서 넣고 언어에서 제공하면 (C#이나 자바) 그냥 쓰면 됩니다. C++은 없으니 필요에 따라 구현해서 쓰면 됩니다. 그리고 경험상 C#으로 코딩할 때 상당히 유용하게 써먹을 수가 있었습니다. 예를 들자면 객체의 해쉬 코드를 얻을 때, 문득 "이 객체가 아까 그 객체인지 어떻게 체크하지?"와 같은 질문이 생겼을 때 그냥 해쉬 코드로 비교해주면 끝입니다. 물론 C++에는 없으니 구현해서 써야겠지요. :^)앞의 몇 분의 지적에서 암시되어 있듯이 C++에 공통 조상(common ancestor)이 없다.라는 말은 좀 부정확한 표현이고(원한다면 예를 들어 class Object {..} 하나 만들면 되므로) 좀 더 구체적으로 말하면 다음 두 가지 중 하나일 것입니다.
1. 언어 자체의 내장 공통 조상 클래스가 없다. (이는 이를테면 int는 없어야 하며 대신 Object::Int 같은 것이 있어야 한다 같은 주장과도 관련이 있겠습니다.)
2. 단일한 공통 조상에서 시작하는 단일한 클래스 계통구조(hierarchy)를 가지는 표준 클래스 라이브러리를 제공하지 않는다.
이 두 가지 제약이 C++에서 OOP를 하는데 어느 정도나 걸림돌이 되는지를 각각 구체적으로 논의해 보면 좋을 것 같습니다.
그리고 성능으로 치자면 아주 미세한 수준입니다. 차기 C++에서 언어 수준으로 제공되면 아주 편할것 같습니다.
- 물론 그럴 가능성은 거의 제로라고 보입니다.
맞습니다. 1~20년 지나고 보면 웃음만 나오는 분도 계실겁니다. 프로그램 만드는데 패턴과 리펙토링이 꼭 필요한것이 아닙니다. 리펙토링은 이미 모든 프로그래머가 써온것이었고, 패턴도 이미 쓰고 있던겁니다. 유용한 도구임에는 확실하나 그 이상은 아닙니다."OOP를 실천하는 도구들(Pattern, Refactoring등)" 이라고 하셨는데 Refactoring 은 외부에 영향을 주지 않고 코드를 개선하는 방법일 뿐, OOP 와 별다른 관계가 없다고 봅니다. 물론 'OOP 코드 역시 Refactoring 으로 개선할 수 있다' 정도의 관계는 성립하겠습니다. Pattern 에 대해서는... 제가 Pattern 을 바라보는 시각은 OOP 를 실천하는 도구가 아니라 그저 "몇몇이 모여서 남들이 잘 써오고 있던 일반적인 문제 해결 방법들에 - 자기들 마음대로 - 이름을 붙여놓은것" 입니다. 그래서 "OOP 디자인중 중복된것을 일반화해 보급된 Pattern이라는 것" 이라는 문장, 특히 "보급" 이라는 단어는 적절한 표현이 아니라고 생각합니다. 아, '이름을 보급했다' 라는 관점에서는 적절한 표현일 수 있겠습니다.
그래서 닷넷 플랫폼이 나왔습니다. 물론 여전히 C++은 어렵습니다. 저도 C++을 좋아하진 않지만 가장 즐겨쓰는 언어입니다. 제가 생각하기에 C++이 사용되는 이유는 딱 하나입니다. 프로그래머는 자유를 원하지만 다른 언어에 비해서 C++이 그나마 자유가 있기 때문입니다.제가 C++ 에 대해 이야기 하는것은 '필요 이상으로 프로그래머에게 많은것을 요구한다' 라는것입니다. (그리고 그런 노력으로 얻게 된 것들중 많은 부분들이 'C++ 에서 한발자국만 벗어나면 쓸모없는 노력과 경험이 된다' 라는 것이 불쾌합니다.) 이것은 '성능을 위해서는 수고를 감수해야 한다' 라는 일반론으로 해명될만한 수준이 아닙니다. 성능을 위해서 10 의 노력만 기울여도 충분할것을 C++ 은 100의 노력을 요구하고 있으니까요. '선택의 자유를 준다' 라는 옹호도 저는 부당하다고 봅니다. 저에게는 운동장에 비행기 부품을 늘어놓고 '이제 당신은 날 수 있다' 라고 말하는 것과 다를바 없다고 느껴집니다.
파이썬을 배우고 싶으면 파이썬을 배우면 되는 것이고 자바를 배우고 싶으면 자바를 공부하면 됩니다. 어려운 C++을 해서 다행히(?) 파이썬도 쉽게 배우고 자바를 쉽게 배웠기 때문에 C++에 쏟은 내 노력이 아깝지 않다. 라는건 저같은 사람에게는 이해하기 힘듭니다. C++때문이 아니라 본인께서 득도(?)를 하신것이고 많은 고민을 통해서 언어를 바라보는 시각이 달라진 것이지 C++에서 배웠던 지식이 파이썬이나 자바를 공부할 때 도움이 된다는 것은 말이 안됩니다. 예를 들어서 C++에서 배웠던 const자리에 따른 값상수, 주소상수 구분법 같은건 솔직히 공부하면서도 웃겼습니다. 그리고 로우 레벨에 대한 것은 C++은 아무것도 가르켜 주지 않습니다. C++은 프로그래밍 언어이고 로우 레벨에 대한 것은 그 관련 분야를 C++언어로 작성하면서 터득했기 때문입니다. 그러므로 C++과는 아무런 관련이 없습니다.필요 이상으로 많은것을 요구한 만큼 , 그 만큼 제값을 한다고 생각합니다
그리고 C++ 한발자굳만 벗어나면 쓸모없는 노력과 경험이라는 건, 극단적인 비약을 하신거라 생각합니다
C++를 배워서 파이썬, 루아, 자바를 배울때 도움이 됐었고 , C++의 로우레벨적인 요소때문에
다른 언어의 구현 내부도 예측가능하게 되었습니다
[여러 언어를 배우는 목적중에 , 다른 언어의 방식으로 문제를 해결할수 있는 방법을 배우는것이 큰데
C++의 다양한 해결방식은 , 문제 해결 방식의 폭도 더 키워줄수 있다고 생각합니다 ]
맞습니다. 이것만 알면 지금 이렇게 서로 길게 말하지 않고 프로그램 만들 시간을 벌 수 있었을 겁니다. 솔직히 지금 시간 아깝지 않나요... (저도 아깝습니다.)특정 상황에 맞는 가장 적합한 도구를 선택해야지 C++이 만능이 아닙니다