===============================================================
[참고] 아래의 내용은
http://www.constructor.co.kr/board/board.php?act=READ&content_idx=23&board_idx=2&category_idx=2
에서 가지고 왔습니다.
===============================================================
1. 강좌 [1/2] 시작하기
Firmware 프로그래머나 마이컴을 다루는 엔지니어의 경우 자신의 보드에서 PC 나 다른 기기와 통신을 위한 목적이든 디버깅을 위한 것이든 시리얼 통신을 빈번하게 구현하게 됩니다.
저의 경우 PC 와 자신의 보드와의 시리얼 통신을 구현할 경우 아래 프로그램과 같이 콘솔 입력이 가능하고 타겟으로 부터 오는 데이터를 스트링이나 HEX 형식등 여러 형태로 표현이 가능한 프로그램을 사용합니다.
그러나 좀더 정형화되어 송,수신되어질 데이터를 송수신할 필요가 있다거나 단순히 시리얼 포트로부터 수신되는 데이터를 모니터링 하는 이상의 기능이 필요하다면 자신만의 시리얼 통신 프로그램 제작을 고려하게 될 것입니다.
이 글에선 VC++ 을 이용하여 윈도우용 시리얼 통신 프로그램을 제작하는 것을 다루게 되며 VC++ 개발 환경에 생소한 Firmware 프로그래머나 콘솔프로그래밍을 주로 하였던 프로그래머 입장에서 윈도우용 어플리케이션 프로그래밍 제작을 시도할 때에 느낄 수 있는 난해한 점들에 대해서 먼저 언급할 것이며 이는 OOP 에 대한 설명이 주가 될 것입니다.
이 글을 쓰기위한 도구로 모니터 프로그램이 내장된 8051 보드를 가지고 테스트 할 것이며 이 글이 끝날때 즈음엔 타겟보드의 모니터링 프로그램과 연계되어 동작되는 시리얼 통신 프로그램이 만들어지고 명령을 송신하는 버튼들, 메모리 덤프 명령시 받아온 데이터를 롬라이터 프로그램등에서 처럼 HEX 블록으로 표시, 8051 프로그램의 HEX 나 BIN 파일을 타겟의 모니터 프로그램으로 전송할 수 있는 기능, 콘솔 명령을 입력할 수 있는 박스 등 그 외 여러가지 기능을 첨가하게 될 것입니다.
2. MFC 와 OOP
도스용, 혹은 콘솔 프로그래밍만 다뤄왔던 프로그래머가 C++ 문법을 익혔더라도 윈도우 어플리케이션 제작을 위해 Visual C++ 을 접하게 될 경우 몇가지 난제에 부딪히게 됩니다.
다분히 제 경험으로 미루어 짐작하건데 그 대부분의 원인은 OOP 와 MFC Frame Work 에 대한 생소함에 있음을 판단하고 이 글의 많은 부분을 OOP 에 대한 설명과 이것이 Visual C++ 에 어떻게 적용되는지를 다루게 될 것입니다.
컴퓨터를 소프트웨어로 제어하기 시작한 이래 프로그래밍 방식에 있어 다음과 같은 발전에 이루워져 왔습니다.
순차적 프로그래밍 ---> 구조적 프로그래밍 ---> 객체지향 프로그래밍(OOP)
순차적 프로그래밍
말 그대로 프로그램의 흐름이 코드의 시작부터 차례대로 진행되는 방식.
프로그램 중간에서 제어의 흐름을 변화시키기 위해서 LABEL 을 이용한 점프가 빈번하게 이루어지며 코드의 크기가 커질경우 제어의 흐름을 파악하기가 어려운 점이 있어 플로우차트(흐름도) 를 작성하여 이를 보완합니다.
기계어(어셈블러), 오리지널 베이직 이나 코볼 등 인터프리터 언어 및 각종 스크립트 언어가 이에 해당됩니다.
구조적 프로그래밍
위에서 언급한 순차적 프로그래밍의 단점을 보완하기 위한것으로 각 흐름의 점프되는 루틴들을 모듈로서 설계하여 코드 내에서 기능별 구조화를 이룰 수 있습니다.
대개 기능별 모듈들의 최소단위는 함수로서 정의 되어지며 프로그래머는 화일단위로 각 함수들을 큰 기능별로 분류하게 됩니다.
C 나 파스칼, MS Q-Basic 등이 이에 해당됩니다.
객체지향 프로그래밍 (OOP)
기능별 모듈을 클래스로서 한정시키고 속성과 실제 처리를 포함시켜 외부에서의 접근에 대한 보안을 설정하고 독립성을 유지시키기 위하여 은닉화(Encapsulation) 시킬 수 있으며 상속을 통해 메소드에 대한 중복정의(overloading)와 재정의(overriding) 로서 기능적 보완과 확장을 이룰 수 있도록 합니다.
C++, Java, Python, C#, 오브젝트 파스칼(델파이) 등이 해당됩니다
구조적 프로그래밍으로 설계된 기능별 모듈(함수, 같은 기능으로 묶여진 함수들을 포함하는 파일) 을 다른 환경의 프로젝트에 사용할 경우 다른 모듈과의 연계성(다른 모듈과의 데이터 교환을 위한 전역변수나 여러 설정등) 때문에 코드의 수정없이 이를 적용시키거나(프로그래밍시 처음 설계부터 각 모듈들의 독립성을 고려하여 설계되어야 함) 이 모듈의 기능을 확장시키기가 어렵습니다.
이런 단점들을 극복하기 위해 OOP 가 출현함으로서 코드의 재사용성과 이로 인한 프로그램 생산성 향상을 기대할 수 있습니다.
아래는 OOP 거론시 자주 언급되는 OOP 의 세가지 특징을 나열하였습니다.
1) 캡슐화(Encapsulation)
2) 상속성(Inheritance)
3) 다형성(Polymorphism) - 중복정의(overloading)와 재정의(overriding)
객체지향 프로그래밍을 한다고 하면 각 기능별 모듈들은 Class 단위로 정리되어지며 이들은 캡슐화에 의해 다른 모듈이나 객체들과 독립성을 유지하고 내부 변수나 함수들이 은닉되어 보안을 유지하며 Class 설계시 상속성과 다형성에 입각하여 초기 기본적 기능의 정의로부터 시작하여 부가,확장시켜 나가게 될 것입니다.
Visual C++ 로 윈도우 어플리케이션을 제작할 경우 C++ 로 MFC 라이브러리를 사용하여 제작하게 됩니다.
MFC Library(Microsoft Foundation Class Library) 는 윈도우 프로그램을 제작할 때 사용되어지는 C 함수인 Windows API 들을 위에서 설명한 객체지향 언어의 특징을 살려 C++ Class 들로 정리하여 정의해 놓은 것입니다.
윈도우 어플리케이션 프로그래머는 이 MFC 를 사용하여 자신이 필요한 기능의 객체(클래스)를 사용하거나 좀더 부가된 기능이 필요하다면 이를 상속받은 클래스를 정의하여 기능을 확장시켜줌으로서 윈도우 프로그래밍이 가능합니다.
이들 클래스들은 MSDN 문서에 예제를 포함하여 자세히 설명돼 있습니다.
마찬가지로 Java 에서도 MFC 와 같이 자바 프로그래밍에 있어 전부라 할 수 있는 Java Runtime Library 를 지원해주며 이에 대한 Document 는 아래 링크에서 볼 수 있습니다.
아래링크는 Java Standard Edition Runtime Library 의 API 문서이며 Java 프로그래밍시 빈번히 조회되는, MFC 프로그래머가 MSDN 을 띄워놓고 상시 참조하는것과 같은 성격의 사이트입니다.
http://java.sun.com/j2se/1.4.2/docs/api/
3. MFC Frame Work
C 콘솔 프로그래밍에서 아마도 가장 간단하게 프로세스를 구현한 코드는 아래와 같을 것입니다.
voidmain(void) { while(0){}; } |
그러나 Windows API 에서 하나의 윈도우를 띄우기 위한 프로세스를 구현한 최소코드는 아래와 같습니다.
//-->#include <WINDOWS.H>;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);HINSTANCE g_hInst;LPSTR lpszClass="First";intAPIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance ,LPSTR lpszCmdParam,intnCmdShow){ HWND hWnd; MSG Message; WNDCLASS WndClass; g_hInst=hInstance; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=(WNDPROC)WndProc; WndClass.lpszClassName=lpszClass; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&WndClass); hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,(HMENU)NULL,hInstance,NULL); ShowWindow(hWnd,nCmdShow);while(GetMessage(&Message,0,0,0)) { TranslateMessage(&Message); DispatchMessage(&Message); }returnMessage.wParam;}LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam){switch(iMessage) {caseWM_DESTROY: PostQuitMessage(0);return0; }return(DefWindowProc(hWnd,iMessage,wParam,lParam));} |
윈도우 프로그램을 만들게 되면 위와같이 윈도우를 정의 및 생성해주고 메세지 처리를 위한 콜백함수를 등록해주며 메세지루프를 만들어줍니다.
이것이 윈도우 프로그래밍을 위해 작성해 줘야 할 가장 기본적인 골격입니다.
이와 같은 내용은 대부분의 Visual C++ 관련책자에서 다루는 내용이니 참고하시기 바랍니다.
MFC 윈도우 프로그램 제작을 위한 프로젝트를 생성하게 되면 위와같은 전체적 구조는 MFC Frame Work 라고 하는 일종의 코드생성기에 의해 작성된 소스로 제공되게 됩니다.
물론 이 구조는 위에 정리된 코드 그대로가 아닌 OOP 가 적용되어져 MFC 라이브러리로서 제공되며 프로그래밍 편의를 위한 기능들이 많이 덧붙여집니다.
이는 프로그래머가 생성하려는 윈도우 어플리케이션의 기능에 맞게 마법사에 의해 선택될 수 있는, 크게 두가지 형태로 제공되어지는데 첫번째는 Document/View 구조와 다른하나는 Dialog Based 구조입니다.
Document/View 구조는 MainFrame Window 에 여럿의 Child Window 가 속할 수 있으며 프린트 기능을 포함하여 화면에 출력을 담당하는 View 구조와 데이터 관리의 일관성을 담당하는 Document 구조로 나뉘며 Microsoft Word 나 기타 프린트 기능이 있는 프로그램들이 대부분 이 구조로 생성된 프로그램입니다.
Dialog Based 구조는 다이얼로그 타입의 윈도우가 기본적으로 생성되며 간단한 프로그램을 만들때 흔히 쓰여지고 대표적으로 윈도우 관리자 프로그램이 이 구조로 만들어진 프로그램들 중 하나입니다.
Visual C++ 윈도우 프로그래밍을 처음 접하게 되면 프로젝트 마법사가 생성해 주는 이 MFC Frame Work 구조의 윤곽에 대한 이해 부족으로 어려움을 겪습니다.
또한 MFC 프로그래머라도 이 구조를 속속들이 완전히 이해하는데는 경험상 다르겠지만 몇년이 걸려도 어려운 것입니다.
다음회 부터 MFC 시리얼 통신 프로그램 제작을 진행하겠습니다.
그리고 진행하면서 MFC Frame Work 에 대한 부분들도 언급할것입니다.
'Programming > C++' 카테고리의 다른 글
Mordern C++ Design (0) | 2008.08.07 |
---|---|
[VC++ 강좌] 시리얼 통신 프로그램 만들기 [2/2] (0) | 2006.03.08 |