C&JAVA 이야기 하면서 프로그래밍 언어 전체를 다룰 수 있다면 좋겠다. 일정 매수 넘어가면 출판비 증가률으 현저히 낮아 진다고 한다.
1
Linux로 치면 GTK, 멀티플랫폼에 많이 쓰이는 QT와 같은 녀석인데... 나는 이 녀석이 10년 전에 죽어버릴 줄 알았다. 그래서 삼성 소프트웨어 멤버십 들어갈 때 프로젝트는 QT로 만들었고, 과제는 WPF 과제를 했다. 윈도 8부터 메트로 UI가 나오면서 MFC는 역사의 뒤안길로 사라질 것이라 생각했었지만... 최근 Windows 10 + Visual Studio 2015를 쓰면서 생각이 바뀌었다.
정작, Visual studio 2015를 웹 인스톨러로 깔았을 때 Visual C++ 용 Foundation Library를 포함시키지 않는다. MFC가 기본이 아니라는 말이다. 그러나 업계에서는 Visaul Studio 6을 아직도 쓴다. Microsoft MSDN 구독자 다운로드에서는 더 이상 찾아볼 수 없다. 이 두 가지 사실만 보더라도 Micorsoft는 MFC를 버리려고 부단히 애를 쓰는 것 같다. 나도 MetroUI를 쓸 수 있는 XAML, WPF를 쓰는 게 좋지 MFC의 고전적인 UI는 마음에 들지 않아서 이제 끝난 기술이라 생각을 했다. 위의 스크린샷을 보면 Microsoft(이하 '마소') 내부에서는 여전히 MFC 지원팀이 제 목소리를 내려고 노력하는 것이 보였다. 이런 상상들에 모던 하지 않아서 싫던 MFC UI가 빈티지 하게 보이기 시작했다.
또 마소에서 MFC를 쉽게 버릴 수 없는 이유는 Visaul Studio C++을 이용하는 엔지니어 대부분이 고급 개발자 이상이라는 사실이다. 삼성에서 안드로이드 개발만 하던 6년간에도 C++을 하는 개발자가 외에는 수준급 엔지니어를 만나 본 적이 없다. 최근 임베디드 프로젝트를 많이 진행해서 잘한다고 정평이 나 있는 학생을 만났을 때, 크로스 컴파일러의 개념과 저수준 라이브러리 링킹을 이해하지 못하고 있어서 많이 의아했었다. 그것은 내가 최신 기술을 몰라서 그랬다. 많이 추상화되어 있어서 gcc로 arm toolchain을 만들고, 그 크로스 컴파일러로 컴파일할 필요도 없고, 부트 스트랩 로더를 올려서 특정 메모리 영역에 다운로드하고 점프시켜줄 필요도 없는 것이었다. 모든 것이 추상화가 되어 있어서 그냥 책에서 나온 대로 소스를 치면 바로 보드에 다운로드되고 실행이 가능했다.
그래 나도 어셈블리 잘 쓰지도 않고 삼성 엔지니어 시절 때는 어셈블리로 실컷 디버깅하고 나니 소스 붙이는 방법을 늦게 배워서 소스 자체로 실시간 플랫폼 디버깅이 가능하다는 것을 알게 되었다. 추상화가 나쁜 것은 아니란 말이다.
글이 길어 진다. 이런 여러가지 생각에도 불구하고 MFC를 배우는 이유에 부연 설명 없이 결론을 낸다면 단지옛 코드를 이해한다는 수준에서 그쳐야 한다. 그러나 주변에 MFC 프로그래머들과 협업하기 위해서는 우선 그들의 시각에 맞춰서 같이 프로그래밍을 해 줘야 더 나은 플랫폼으로 바꿀 수 가 있다. 사람을 움직이려면 '돈'이나 '기술'이 있어야 하는데. 돈이 있어서 명령을 내릴 수 있는 입장이 아니라면 '기술'로서 승부를 해야 한다는 말이다. 그리고 내막을 다 알고 있는 엔지니어와 발을 맞추고 내 편으로 만들면 '돈' 보다 마이그레이션이 성공할 가능성이 훨씬 높다. 그리고 함께 더 나은 기술로 전직하고 발전한다. 변화라는 게 이래서 어려운 것이다. 아무리 색다른 요리도 기존에 좋아하는 요리의 맛이 들어가야 옳고, 해외 여행을 가서 그 나라에서 살고 싶지 않은 이상 여행 가이드의 통역만으로 충분하다. 지금 나오는 기술들이 MFC보다 미칠듯이 매력적인가 따져보면 그것도 아니다. 그래서 이것은 기존 프로그래머들의 잘못이 아니다. 이런 보수적 성향이 새로운 것에 대한 '안정성'에 끊임없는 의문을 던지게 한다. 이렇게 나 자신을 세뇌한다. 젠장할 MFC 왜 이렇게 많이 쓰는 거야.
중식 요리사라도 일식도 조금 만들 줄 안다면 자체 점심 시간에 인기있는 요리사가 될 것이다. 본업은 잊지말자
2
위의 샘플을 만들기 전에 이런 단계들이 있다.
MFC를 모르는 학생들 대상이고, offline으로 보는 독자의 요청에 의해서 완전 basic부터 설명을 해 보려 한다.사실 요즘 SUPERSELL 게임에 몇백만원 넣고, 나오는 만화 다보고, 넷플릭스 가입해서 시간을 떼워도 심심함이 사라지지 않아서 이번 글은 장편으로 가 보려한다. 화끈허게~ 장편으로 가자고!
3
개발자를 오래 쉰 사람들을 위해. 간단히 "CPU와 메모리의 장난"부터 시작한다. 우리가 프로그램을 실행시키면 메모리에 올라가고 CPU의 fetch 가 그 코드들을 가져가서 프로그램 실행을 해 준다. CPU안에 자체 API가 들어 있고, 모든 프로그래밍 언어는 CPU API를 추상화 시켜 놓은 것에 불과하다. CPU라 함은 인텔을 말한다.AMD가 인텔을 앞지른 적도 있는데도 인텔이 잘 되는 이유는... 10년전 인텔에 개발자 등록을 하면 API 책 8권을 공짜로 보내줬는데 AMD는 온라인상에서도 개뿔 제대로 지원을 안해줬다. 조립은 AMD로 다 맞추는 충성심을 보여줬었는데도 말이다.
그래서 GCC보다 인텔 컴파일러가 병렬처리에 더 좋고, 속도도 빠르다. 그러나... 일부 퍼포먼스는 GCC가 앞서는데... 아무래도 FSF에 리처드 스톨만을 포함해서 천재들이 많다. 인텔에 날고기고 하는 사람들이라 해도 MIT 교수보다 나은 사람이 몇이나 될까?
CPU를 관리하는 운영체제가 알아서 보호모드로 만들어서 메모리 보호를 해 주고 fetch 기능을 수행하고 프로그램 카운터를 실행하는 프로그램에 맞춰준다. 그래서 우리를 실행 파일만 만들면 된다. 실행 파일을 만들면 운영체제가 메모리에 올려주어 그것을 프로세스로 만들어 준다.
운영체제마다 파일 시스템이 다르다. 윈도우의 실행파일은 exe다. PE 파일 포멧이다. 리눅스는 ELF, 맥은 HFS+다. 리눅스 진영이 열심히 고생을 해 준 덕택에 PE를 맥이나 리눅스에서 읽을 수 있게 되었다. 윈도우 또한 맥 파일을 읽을 수 있다.
돈 주고 사야 하긴 하지만 ^^;;
MFC에서 초점은 exe를 만드는 것이다. exe와 연결되는 dll을 만들기도 하지만. 흠... 리눅스의 .so는 dll이고 .a는 *.lib 정도로 봐도 좀 무방하다. 흠좀무 처럼 유행어 만들려고 했는데... 시도하지 말아야 겠다.
맥은 .dylib, .a 이다. 어차피 LLVM이 GCC 기반이라 GCC로 linux용 mac용은 다 만든다. BSD 계열이던 SystemV 계열이던 다 UNIX에서 나온거고 C를 만든 데니스 리치 손아귀에 있는 거다. 맥도 bash sehll 쓰니 명령어도 똑같다.
우리가 많이 듣던 Win32 Console Application도 exe만드는 것인데 뭐가 다른 것일까? 우리가 윈도우 창을 만들려면 네모 상자만 그려가지고는 되지 않는다. 창 제목도 그려야 하고 그 아래 움푹 들어간 것 같이 다른 색의 선을 긋고 그림자 효과도 내고...
이걸 하나하나 다 하기 귀찮으니까 MFC로 하는 거다. 그래서 사실 마소 안의 MFC Developer들이 새끈하게 템플릿을 변경해 주면 MFC로 짠 프로그램 이지만 모던한 UI를 가질 수도 있는 것이다. MFC 유저가 사라지지 않고 마소 내에서 해당 엔지니어들을 대우해주면 그렇게 바꾸지 않을까 상상도 해보지만. 대기업에서 굴러먹은 경험 상 그들이 로또가 되어서 상사와 겁나 싸우지 않는 이상 어려울 것 같다.
자 그럼 MFC가 알아서 다 그려 준다고 했으니, C++을 아는 상태에서는 용어만 알아도 금방 적응할 수 있다.
4
SDI = Single Document : 윈도우 키 + R 눌러서 notepad 치면 나오는 메모장 형태의 창이다.
MDI = Multiple Documents : 창 안에 창을 띄울 수 있는 형식이다. 생짜로 짠다고 생각하면 끔찍
Resource View = 안드로이드로 치면 XML 의 리소스 에디터와 같다. 리소스 뷰는 *.rc 파일을 클릭하면 열리게 된다.
리소스 뷰는 res폴더 아래 midp, hdip 와 같은 존재다. 리소스가 들어가는 곳이다. VS 프로젝트 폴더에 res 자체가 있다. res에 넣으면 자동 인식하기도 한데 수동으로 넣어주는게 좋다. PNG를 넣으면 PNG 폴더가 생기면서 자동으로 naming이 된다. strings.xml에 string 넣고 resource name을 정하는 것이 자동으로 된다고 생각하면 되겠다.
더 자세한건 여기 참조.
Picture Control = ImageView 다. 그림 파일을 넣을 수 있다.
4
//#error 보안 문제: 연결 문자열에 암호가 포함되어 있을 수 있습니다.
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.