본문 바로가기

(비정기) Dlbo's Post

객체지향 이야기 5. MFC와 객체지향.






으흠.

시작부터 지저분한 소스코드가 널려있군요.

눈치 빠르신 분, 혹은 MFC를 공부해 보신 분은 아시겠지만

MFC의 Hello Window?!코드입니다.

4개의 파일로 나눴습니다.

각각 클래스에 해당하는 .h파일과 .cpp파일입지요.

왜 cpp파일이느냐... 하면...

MFC가 클래스 기반이니 C++로 쓸 수 밖에 없어서라는 답변밖에는 못하겠군요 ㄱ-;;

MFC는 윈도우즈 API를 객체지향적으로 재구성한 클래스의 집합입니다.

자세히 보시면 CHelloApp 클래스에서 생성된 theApp객체를 생성합니다.

메인함수가 생략된 대신, 이 객체를 생성하면서 프로그램이 시작되지요.

이 때, InitInstance라는 메소드를 이용해 내부에서 윈도우 객체를 하나 만듭니다.

이름하여 사용자가 CFrameWnd에서 상속한 CMainFrame.

afx_msg로 선언된 메소드들은 모두 MainFrame.cpp에 구현된 메시지맵과 매칭됩니다.

메시지맵은 해당 파일 맨 아래에 코드도 아닌것이 기묘하게 생긴 친구들이지요.

으흠... 쓸데없이 MFC 이야기만 했군요. MFC와 객체지향의 이야기를 해야 하는데 말이죠.

API는 Application Programming Interface를 의미합니다.

프로그래머들이 OS에 맞는 프로그램을 기계어 수준에서 컨트롤 할 필요 없도록,

OS 제작자들이 제공하는 인터페이스 셋이라고 볼 수 있습니다.

가끔 "리눅스는 시스템콜이고, 윈도우만 API라 부른다!"는 사람이 있는데요.

.....

리눅스 제작자인 토발즈 리누즈도 처음에 API라 했다는데요 뭐 -_-;

쌩까고 지나가자구요;

이 API는 C와 어셈블리를 기반으로 쓰여졌습니다.

정말 절차지향의 극치를 보여주는 구성이었지요.

물론 모듈화와 여러가지 과정을 거쳐서 객체형 코드로 변화하긴 했지만,

여전히 유지보수에 많은 어려움을 겪게 됩니다.

이에 따라 마이크로소프트는 대책을 강구하여, 객체지향에 맞도록 API를 묶(?)어버리는 촌극을 치룹니다.

비객체지향 언어인 C를 조금 발전시켜서, C++이라고 이름붙여 버리고는, API를 클래스화 시켜버린 것이죠.

이를 Microsoft Foundation Class라 부릅니다. 줄여서 MFC라고들 부르지요.

비주얼 스튜디오 6.0의 C++ 컴파일러에서는 MFC의 클래스들의 조상이 모두 같은 것이 아닙니다.

급하게 묶었으니 별 수 있나요 ㅡ,.ㅡ;

닷넷부터는 CObject클래스에서 모든 클래스가 파생되어 나오도록 바뀌었다고는 하지만,

너무 급하게 대충대충 묶었던 잔재가 아직 여전히 남아있습니다.

HWND(윈도우 핸들)을 인자로 요구하면서 HWND를 리턴하거나 알려주는 함수가 없어서

다시 API를 사용해서 찾아야 하는 촌극이 가끔 발생하지요. (말씀드렸듯, 닷넷에서는 많이 나아졌습니다.;;)

하.지.만.

마이크로소프트의 이 행동이 완전히 삽질만은 아니었습니다.

MFC는 API들을 객체지향적인 입장에서 해석해 묶어둔 터라,

조금 엉성해지긴 했어도 개발자들의 개발속도를 엄청나게 높여주었지요.

정말 객체지향에서 요구하는대로 "레고를 조립하는"수준의 프로그래밍을 하도록 해줬다고 해야 할까요?

--------------------------------------------------------------------------------------------------

왠지 모르게 요즘 점점 글빨이 안받습니다. ㄱ-;;;