C언어를 공부해본 사람이라면 누구나 알만한 프로그램이자 처음으로 작성해보는 프로그램이 있죠.
바로 Hello, World 혹은 Hello, C 라는 문자열을 출력하는 프로그램입니다. 이 프로그램이 얼마나 유명하냐면 프로그래밍 언어별로 이 문자열을 출력하는 소스를 컬렉션한 웹사이트가 있을 정도입니다. (보러가기)
그 중에서 오늘 이 포스트에서 작성할 언어는 바로 C언어 입니다. 그리고 C 언어 중에서도 Text 화면(콘솔)에서 동작하는 C언어와 Windows와 같은 GUI 화면에서 동작하는 C언어 소스를 비교해 보려 합니다.
먼저 사용자환경이 콘솔 즉 CLI (Command Line Interface) 환경인 C 언어 입니다. CLI를 지원하는 운영체제에서 C언어로 코딩한다면 소스코드는 100% 동일합니다.
콘솔(DOS) Hello,C 소스
위의 프로그램 소스는 주석과 공백라인을 제외하고 6 줄 뿐 입니다.은 너무도 유명해 더 설명이 필요 없을 정도 입니다. C 언어를 처음 배우는 사람은 누구나 이 프로그램을 작성하고 컴파일하고 실행해봅니다.
이 소스코드는 윈도의 콘솔프로그램(DOS 창에서 실행되는 프로그램)과 리눅스, 그리고 HPUX, Solaris, AIX 등은 물론 다른 운영체제에서도 컴파일하여 실행프로그램을 만들 수 있습니다. 아래 창은 위의 소스코드를 컴파일하면 생성되는 exe 파일을 실행시킨 화면입니다. 컴파일 시 생성될 실행파일명으로 hello-console-c.exe를 지정하였습니다.
위의 프로그램은 Visual Studio 라는 마이크로소프트에서 제공하는 개발환경에서 코딩하고 컴파일 했습니다. 즉 컴파일러가 Visual Studio의 C 컴파일러입니다. Visual Studio는 당연히 Windows 운영체제에서 실행되는 프로그램을 개발할 때 사용하는 통합개발환경입니다. 그리고 Windows와 Visual Studio는 위 화면처럼 명령프롬프트라는 콘솔환경(DOS 환경이라고도 함)에서 실행되는 GUI가 없는 프로그램도 개발하고 사용할 수 있도록 지원합니다. 하지만 최근에는 GUI가 없는 Console 프로그램은 일반사용자들은 거의 사용할 일이 없기 때문에 사실 앞의 “Hello, C”를 출력하는 C 프로그래밍언어는 단지 C언어의 문법과 여러 프로그래밍 개념을 배울 때만 사용합니다.
만약 C언어의 문법과 구조체, 함수, 포인터 등등 여러 프로그래밍 개념들을 공부했다면 다음으로 이해해야하는 것은 Windows 프로그래밍의 특징입니다. (Windows 운영체제를 주로 사용한다는 가정하에…)
전 C#, C++(MFC, ATL), Visual Basic 등의 언어로 프로그래밍 공부를 하기 전에 꼭 Visual C++ API를 사용해서 기본적인 Windows 프로그램의 밑바닥 구조를 이해하라고 이야기해주고 싶습니다.
아래는 Windows GUI를 갖는 가장 간단한 … 즉 Windows 창에 “Hello, Win3 2″를 출력하는 프로그램 소스입니다. 앞의 콘솔(도스창)모드에서 동작하는 프로그램 소스코도와 비교해보세요.
윈도 Hello,C 소스
무척 복잡해보이죠? 네..복잡합니다. -.-
그럼 컴파일한 뒤 실행된 화면을 봅니다.
무척 썰렁하긴 하지만 윈도 창이 있고 타이틀바도 있고 최소화 버튼, 최대화 버튼, 종료 버튼이 있는 윈도 프로그램입니다.
콘솔C 소스는 크게 이해하는데 문제가 없습니다. C를 공부하기 시작한 스타터도 쉽게 이해할 수 있죠. 하지만 윈도C 소스코드를 처음보는 사람이라면 거의 멘붕에 가까운 느낌을 받을 수 있습니다. “Hello, Win32” 문자열 하나를 화면에 표시하는데 뭐이리 복잡한 소스코드가 필요한가 생각이 들기 때문이죠.
하지만 이 윈도C 소스를 이해하는 것은 Windows 운영체제가 프로그램을 실행시키고 관리해주는 메카니즘을 이해하는데 큰 도움이 됩니다. 사실 인터넷을 검색해보면 다이얼로그 윈도에 “Hello, C”나 “Hello, Window”를 표시하는 프로그램 소스는 있지만 위 소스코드처럼 메인윈도에 표시해주는 소스는 찾기 힘듭니다.
이런 윈도C 소스코드는 “Win32 API” 로 작성된 소스코드 입니다. Win32 API는 “Windows 32bit 용 API (Application Programming Interface)”의 준말입니다. 소스코드의 확장자는 CPP로 저장되지만 컴파일할 때는 순수하게 Windows 운영체제의 C 라이브러리를 이용해 컴파일 됩니다. DOS나 Unix 운영체제에서 제공되는 기본 라이브러리와 같은 것이라고 이해하면 됩니다. 모든 프로그램의 소스코드는 스스로 실행하는 것이 아니라 운영체제가 한줄~한줄~ 대신 실행해주는 것입니다. 즉, 프로그램은 운영체제와의 커뮤니케이션을 위한 것이죠.
하지만 Windows 프로그램의 모든 소스코드를 Win32 API를 이용해 작성하는 것은 엄청난 “노가다”를 요구하는 작업입니다. 그래서 MS에서는 MFC, ATL 등 C언어, C++언어 개발자를 위해 미리 만들어 놓은 일종의 라이브러리를 제공합니다. 또한 Visual Studio는 MFC나 ATL 등을 사용하기 편리하게 최적화해 놓은 통합개발환경 입니다.
위의 윈도C 소스코드를 한줄~한줄 구글링해가면서 분석해보면 윈도가 프로그램을 구동하는 방식을 이해할 수 있습니다.