본서의 2 장에서는 C 프로그래밍의 기초를 다룹니다. 여러분이 주목해야 할 사항은 C 언어의 기초를 다루는 것이 아니라 “C 프로그래밍”의 기초를 다룬다는 점입니다. C언어의 기초를 다룬다면 2 장의 내용은 주로 C언어의 문법과 구문을 위주로 설명하게 될 것입니다. 그러나, 본서는 C 프로그래밍의 기초를 다루기 때문에 C 언어를 사용해서 어떻게 프로그래밍하는가를 설명합니다. 단순히 연산자, 데이터타입, 형 변환, static 키워드, 포인터, 배열, 함수 등과 같은 C언어의 문법을 설명하기 위한 내용을 다루지 않습니다. 이러한 내용은 C 언어를 이해하는데 기본적인 내용이 되지만 실제 프로그래밍을 배우기 위해서는 C언어의 표현력이 필요합니다. 표현력은 글로 말하면 문장력이 되겠지요. 글을 쓸 때 단어와 문법만 안다고 글이 이루어지는 것이 아닙니다. 글에 글쓴이의 의도가 분명히 담기고 글쓴이가 말하고자 하는 바가 잘 표현되어야 합니다. 그것이 바로 표현력이요 문장력입니다.

본서에서도 C 프로그래밍을 통해서 바로 이러한 C언어를 사용하여 프로그램을 작성하기 위한 표현력과 문장력을 다룹니다. 물론, C언어의 문법적 내용과 기본적으로 제공되는 내장함수(built-in function)에 대해서도 잘 알고 계셔야 합니다. 하지만, 여기에 머무르지 마시고, 보다 발전된 방향으로 나가셔야 합니다. 그 길을 제시하기 위해 본서는 존재하는 것입니다. 물론, 많은 양의 내용을 통해서 프로그래밍의 길을 제시하는 것이 좋을 수 있지만, 본서는 그렇게 많은 양을 포함하고 있지 않습니다. 즉, 핵심적이고 함축적으로 꼭 필요하다고 생각하는 바를 축약해서 본 서의 2 장에서 C 프로그래밍을 설명하고 있습니다.

사실, 본서는 알고리즘(Algorithm)이라고 하는 전산학의 한 분야와 데이터구조라고 하는 관련 분야를 공부하기 위한 기초 단계라고 생각하시면 됩니다. 어떤 면에서는 본서가 C언어의 문법과 구문 공부에서 알고리즘과 데이터구조를 공부하기 위해 교각이 될 수 있지만, 실제로 알고리즘과 데이터구조를 이론적으로 배우는 것보다는 이렇게 구체적인 프로그래밍 언어의 하나인 C언어를 통해서 배움으로써 실무적으로나 실용적으로 많은 도움이 될 것입니다. 흔히 거론되고 있는 Practical C Programming이라는 말이 있는데, 이는 본서보다 한 번 더 진전된 과정을 다룹니다. 즉, 실제 응용분야에서 적용되고 사용되는 C 프로그래밍을 다룹니다.

본서는 C 언어 공부의 관점에서 살펴보면 다음과 같은 위치에 있습니다.

  1. C 언어의 기초(문법과 구문) 공부

  2. C 프로그래밍의 기초 ==> 본서

  3. 알고리즘과 데이터구조

  4. Practical C Programming(실용적 C 프로그래밍)

위와 같이 순번을 매겨서 C 언어 학습과정을 묘사했는데, 실제 이러한 순번은 큰 의미가 없습니다. 왜냐하면 학습자마다 공부하는 순서가 다룰 수 있기 때문입니다. 필자의 경우는

  1. 알고리즘과 데이터구조 공부 ->

  2. C언어의 기초(문법과 구분) 공부 ->

  3. C 프로그래밍의 기초와 4. Practical C Programming 동시 학습

순으로 공부하였습니다. 필자의 생각으로는 1. 2. 3. 4. 순서대로 공부하는 것이 정순(正巡)이라 생각합니다. 물론, 여러분은 다른 방법으로 공부하고자 할지도 모릅니다. 하지만, 공부 순서가 어떠하든 간에 분명한 것은 C언어의 학습과정이 크게 이상의 네 가지 분야로 분류된다는 점입니다. 필자의 주관적인 판단이 들어있지만 그래도 필자가 경험한 바에 의하면 상기의 네 가지 구분은 C언어 학습에 대부분 유효하게 적용된다고 생각합니다.

네 번째, Practical C Programming은 기술적인 프로그래밍을 포함하고 있어, 실제 적용하고자하는 시스템이나 업무 및 수학적 논리에 대한 어느 정도의 지식을 갖추고 있어야 가능합니다. 기술적인 프로그래밍이란 말을 들어보셨나요? Technical Programming(TP)이라고 하는데, 이 TP는 하드웨어 시스템과 관련된 지식을 바탕으로 프로그램을 작성하는 분야입니다. 어셈블리어 수준에서의 프로그래밍이 사실 TP라고 할 수 있지요. 물론 TP는 반드시 어셈블리어를 사용하여 프로그래밍 할 경우만을 말하는 것은 아닙니다. 이 TP 또한 Practical C Programming의 한 분야라고 할 수 있습니다. 사실, Practical C Programming은 매우 광범위한 분야를 다룹니다. 혹시 Design Pattern(DP)이란 말을 들어본 적이 있나요? DP는 C++로 프로그래밍하는 기법을 담고 있는데, 실무 프로그램을 작성하는데 매우 요긴하게 사용된다고 합니다. C++ 프로그램의 구조를 결정짓고 C++ 프로그램의 유사성을 연구하여 프로그램을 작성하기 위한 기법을 체계화한 것이 DP라고 할 수 있습니다. 사실, DP는 재사용 가능한 프로그램을 작성하기 위한 객체지향 프로그래밍 언어의 기법입니다. 그러므로, C++ 뿐만아니라 JavaSmalltalk와 같은 언어로도 DP가 가능합니다. 이 모두가 Practical C Programming의 분야에 해당합니다.

실제 Practical C Programming은 여러분이 직장에서 직업을 갖고 프로그래밍하게 되는 영역 전체를 포괄합니다. 즉, 아마추어가 아닌 프로이자 베테랑(전문가)로 나아가기 위한 영역이 됩니다. 실제적이고 가장 도움이 되는 지식은 바로 이 Practical C Programming을 통해서 얻을 수 있습니다.

본서에서는 Practical C Programming의 기초가 되는 C 언어를 구사하는 문장력과 표현력을 배울 겁니다. 다소 알고리즘과 데이터구조가 도입되지만 그렇게 어려운 알고리즘과 로직을 가지고 있지는 않습니다. 다만, 한가지 알고리즘과 로직을 여러 방향으로 사고할 수 있도록 해주고 다양한 방식으로 표현하도록 여러분을 도와줄 겁니다. 여러분은 한가지 문제가 어떻게 다양한 방식으로 해결되는지를 지켜봐야할 겁니다. 가장 중요한 것은 여러 가지 해법들 중에서 문제에 가장 적합한 해법을 찾아내는 것입니다. 그리고 그 해법에 맞추어 프로그래밍을 해나가는 것입니다.

필자는 쉬운 문제를 통해서 여러 가지 다양한 사고를 할 수 있도록 문제를 약간씩 변형시켰습니다. 따라서, 여러분은 각각의 문제들이 어떤 차이를 지니고 있는지 확인하시고, 그 문제가 어떻게 다양한 해법으로 풀이되는지를 터득하십시오. 그러니까 이를 도표로 나타내면 다음과 같습니다.

     문제 1.           -------------> 해법 1
                       -------------> 해법 1의 변형1
                       -------------> 해법 1의 변형2.
                       ...
                       -------------> 해법 1의 변형n1

     문제 1의 변형1    -------------> 해법 2
                       -------------> 해법 2의 변형1
                       -------------> 해법 2의 변형2.
                       ...
                       -------------> 해법 2의 변형n2

           ...           ... 
   문제 1의 변형M-1   -------------> 해법 M
                       -------------> 해법 M의 변형1
                       -------------> 해법 M의 변형2.
                       ...
                       -------------> 해법 M의 변형nn

위와 같이 광범위하게 다양한 문제와 해법이 존재하게 됩니다. 여러분은 이와 같은 많은 경우의 수를 이해하셔야 합니다. 최소한 어느 정도 파악하고 계시고 어느 문제가 중요하고 어느 해법이 필요하다는 것을 이해하셔야 합니다. 그리고, 위에 도시한 경우의 수는 단지 문제 1에 대한 경우의 수를 생각한 것입니다. 만약 문제의 종류가 많아지면 더 광범위한 경우의 수가 존재할 겁니다.

가능한 총 문제의 종류와, 그 중 한 문제에 대한 변형된 문제의 종류 그리고 이에 대한 해법 그리고 이 해법들 중의 한 해법에 대해 파생되는 아류적 변형 해법들... 이와 같이 생각해 보면 이론적으로 문제의 유형을 문제의 궁극적 시원으로 무한 전개해 나갈 수 있으며, 해법의 유형을 궁극적 종착지로 무한 전개해 나갈 수 있습니다. 위에 도시해 놓은 경우의 수는 복잡한 경우의 수들 중에서 한 부분을 포착하여 단순히 간략하게 표시한 것일 뿐입니다.