티스토리 뷰

Application/C/C++

초보자들을 위한 공부 가이드 C 언어

알 수 없는 사용자 2008. 2. 10. 02:54
초보자들을 위한 공부 가이드 C 언어
0. 소개

C 언어의 중요성에 대해서는 별로 언급할 것이 없겠습니다. 이 글을 읽으시는 분은 이미 그 중요성을 인식한 분일테니까요. 인터넷 검색 엔진에 "the c programming language"라고 쳐 넣을 후 결과를 보면 C 언어가 왜 중요한가에 대한 글이 끝없이 나옵니다. 덤으로 C 언어 강좌도 꽤 많은 것들이 있으니 한번 대충 훑어 보시는 것도 도움이 될 것 같네요.
어 쨌거나 요즘같이 C++, C#, JAVA, Delphi(Pascal), Visual Basic... 등등의 언어가 난무하는 시대에도 여전히 C 언어는 반드시 알아두어야 할 기본 언어입니다. 게다가 기초 문법만 따질 경우 일단 옛날의 베이직을 제외하면 가장 배우기 쉬운(제 생각에) 언어죠. 처음 프로그래머가 되기 위해 결심을 하신 분이라면 다른 언어를 배운다 하더라도 시간을 내어서 꼭 익혀두셔야만 하는 언어입니다.
1. 좋은 책들

1) The C Programming Language, Second Edition
Brian W.Kernighan ,Dennis M.Ritchie
Prentice Hall, 1988
2) C Primer Plus (The Waite Group's), Third Edition
Stephen Prata
Sams Publishing, 1998
3) Teach Yourself C in 21 Days, Fourth Edition
Peter Aitken and Bradley L. Jones
Sams Publishing, 1998
4) Turbo C 정복
가남사
C 를 처음 하시는 분이라면 2), 3)를 권합니다. 번역본도 있으니 그것으로 공부하셔도 전혀 문제 없습니다. 그 외에 다른 분들, 그러니까 한 번이라도 C를 접해본 적이 있는 분들(이미 아무 교재나 한 권 정도는 가지고 있으신 분들)께는 1)을 권하겠습니다. 모든 프로그래머들이 권하는 가장 좋은 책입니다. 1)의 경우에는 번역본을 추천하고 싶지 않습니다. 원래 원서 자체가 영어권 사람들 특유의 문체이면서도 어렵게 작성되어있고 번역본은 그것을 한국적 문체로 살리지 못했기에 읽는 것이 그야말로 고역입니다.
4) 의 경우에는 조금 첨언을 해야겠습니다. 이 책은 그야말로 방대한 내용을 담고 있습니다. Visual Studio의 MSDN에 해당한다고나 할까요. 하지만 Turbo C의 깊은 내용을 알아야 하는 경우가 아니라면 굳이 이 책을 사용하실 필요는 없을 것 같습니다. 이 책을 필요로 하시는 분들은 하드웨어를 직접 설계하시는 분들일 것입니다. 예를 들어서 공장 자동화 로봇의 로봇팔을 제어하는 프로그램을 코딩하여 그 하드웨어에 이식시키기를 원하는 분들, 혹은 Turbo C에서 제공하는 여러 CPU를 위한 크로스 컴파일러들에 대한 정보를 얻기를 원하는 분들에게는 Turbo C에 대한 정보가 필요하실 경우가 있을 겁니다. 그런 분들이 아니라면 이 책을 권하지 않겠습니다. 90년대 초라면 강력 추천 서적이었겠지만요... 어쨌거나 이것과 관련된 정보는 다른 전문가들을 통해서 얻으시는 것이 더 나을 것 같기에 이만 줄이겠습니다.
2. 공부하는 방법에 대한 첫 조언
자유게시판을 검색해 보시면 많은 고수분들의 공부법이 나와있습니다. 자신의 과거 경험이라든지 하는 것들도 함께요. 그것들을 살펴보면 한 가지 공통점이 있습니다. 바로,
"실습"
입 니다. 모든 학문이 그렇지만 자신이 직접 문제를 해결해보지 않는다면 아무런 발전이 없습니다. 프로그래밍 분야도 그것이 매우 심한데 범람하는 문법들과 주변지식들을 모두 외우는 것이 불가능한 이상 한 번이라도 실습을 해 보아야 시간이 지난 후에 다시 보았을 때 기억이 납니다. 혹은 다른 글을 읽을 때 연관을 지을 수도 있구요. 물론 책을 통독한 후에 실습을 하겠다 하시는 것도 좋습니다. 그런 것은 개인 취향이니까요. 단지 제가 드리고 싶은 말씀은 "실습을 통해 사용해 보기 전까지는 그 부분을 안다고 생각하지 말라"라는 것입니다. 여러 챕터의 내용을 뭉뚱그려서 하나의 프로그램을 작성하는 방식을 취하든, 각각의 작은 절에 나오는 사소한 예제들을 작성해 보든 그런 것은 알아서 취향에 맞게 하시기 바랍니다.
3. C 언어의 전체적인 구성

Data Types and Dealing with Data
Operators, Expressions, and Statements
Control Flow : Looping, Branching and Jumps
Fuctions
Arrays and Pointers
Structures
Input and Output
File Input/Output
인 터넷 강좌를 참조하여 나누어 본 분야들입니다. 당연한 얘기지만 C 책들의 차례를 보면 위의 내용들은 꼭 들어가 있습니다. 사실 위의 내용이 C를 구성하는 가장 중요한 문법들입니다. 책을 공부하시면서 자신이 어떤 부분을 공부하고 있는지 꼭 체크하면서 공부하십시오. 전체적인 흐름 속에서 공부하셔야 합니다. 물론 C가 완전히 처음이시라면 아무 생각없이 일단 책을 한 번 통독하는 것도 좋은 방법입니다. ^^
4. 각각의 요소를 공부하며 주의해야 하는 사항들
Data types
데 이터 타입을 공부하시면서 꼭 생각해야 하는 것은 하드웨어의 메모리 혹은 레지스터 상에 저장되는 실제 모습입니다. 많은 데이터 타입들이 있지만 어쨌거나 그것들은 모두 0 아니면 1 로 된 것일 뿐입니다. 컴파일러가 컴파일 할 때 체크를 해 줄 따름이죠. 그러니 데이터의 실제 모습이 무엇인지 손으로(즉 2진 숫자로) 쓰실 수 있다면 데이터 간의 변환을 이해하는 데에 도움이 됩니다.
아주 개인적인 의견이지만 데이터의 타입이나 size 그 자체에는 큰 신경을 쓰지 않으셔도 될 것 같습니다. 대부분의 경우 자신이 자주 쓰는 타입이 있게 마련이고 컴파일러마다, CPU의 종류마다 모두 변하는 속성이기 때문이죠.
Operators, Expressions and Statements
Control Flow
Functions
그 다지 어렵지 않습니다. 어떤 책을 보시든 그 책에서 언급하는 것을 잘 이해하시기 바랍니다. 사실 이 부분들은 긴 설명이 필요하지 않은데 일부 책들은 쓸데없이 내용을 불려서 설명하고 있습니다. 핵심적인 것들만 파악하고 넘어가셔도 크게 문제될 것은 없습니다. 단, 이 내용들이 비록 쉽기는 하여도 익숙해지는 데에는 연습과 시간이 필요하다는 것을 유의해 주시기 바랍니다.
한 가지 사족인데 C 언어의 문법에는 goto 라는 것이 있습니다. 옛날 C 이전의 언어들에서 필수적으로 사용하던 것인데 그 흔적이 남아있는 것이죠.(사실은 어셈블리의 jmp 명령을 매칭시킨 겁니다만...) 이 문법은 무시하시기 바랍니다. 공부하시는 것은 말리지 않겠습니다만 바로 잊어버리세요. goto를 사용해야 하는 상황이 있다면 그것은 프로그램의 구조가 나쁘다는 증거이니까요.
Arrays and Pointers
모 든 사람들이 누구나 동의하는 가장 중요한 부분입니다. 무슨 일이 있어도 완전 정복을 하셔야만 하는 부분입니다. 앞서 Data types에서 데이터의 실제 모습을 항상 떠올리려고 노력하라는 말씀을 드린 바 있습니다. Arrays and Pointers는 그 데이터들이 배열된 모습과 위치를 조작하는 도구들입니다. 이것들을 완전히 이해하여야 비로소 프로그래머가 될 수 있는 가장 기초적인 지식을 얻었다고 하실 수 있습니다. 그러니 철저하게 이해하시기 바랍니다.
Array와 Pointer는 기본적으로 컴퓨터의 CPU와 Memory 사이의 데이터 표현형식 및 전달에 직접적으로 관련되어 있는 부분입니다. 따라서 컴퓨터 분야 자체가 생소하신 분들은 대부분 이 부분을 공부하시면서 어려움을 겪게 됩니다. 하지만 끈기를 가지시기 바랍니다.
특별 히 공부하시는 방법을 알려드리긴 어렵겠습니다. 책의 챕터 뒤에 나와있는 배열 및 포인터 관련 문제들을 남김없이 풀어보시고 틀린 부분이 있으면 꼭 다시 내용을 확인하여 습득하시라는 말 밖에는... 통신상의 여러 질답란의 포인터 관련 내용들을 이해해 보려고 노력하시는 것도 도움이 될 듯... 이 부분과 관련된 좋은 책으로 '성안당'에서 나온 'C 포인터 정복'이라는 책이 있습니다. 사실 배열과 포인터는 일단 이해하고 나면 전혀 어렵지 않은 것이지만 설명하기는 쉽지 않기 때문에 이런 책도 나온 것 갈습니다. 단시간에 배열과 포인터를 정복하고 싶으시다면 위의 책을 구하셔서 하루나 이틀 정도 이 책에만 매달리시면 충분히 이해하고도 남을 겁니다. 단,,, 위 책은 상당히 옛날 책이기 때문에 절판되었을 가능성이 좀 있네요... ㅡ.ㅡa
이 부분을 완전히 이해하고 나면 함수(Function)의 인자로 포인터가 넘어갈 때와 변수값이 넘어갈 때를 구분하실 수 있으셔야 합니다. 그리고 '&'와 '*'의 사용법에도 주의하셔야 하구요. 굳이 첨언하자면 '&'와 '*'는 선언(Declare)할 때와 사용(Expression)할 때의 의미가 각각 서로 반대입니다.(C++에서도 마찬가지...) 무슨 말인지는 직접 공부하시면서 익히시길...
Structures
역시 아주 중요합니다. 기본적인 Data type들을 하나의 주머니에 넣어 한꺼번에 사용하게 만드는 것이 '구조체(Structure)'인데 나중에 C++과 같은 객체지향 언어의 클래스 개념의 기초가 되는 개념입니다. 이 것을 공부하실 때에도 Data type을 공부할 때처럼 실제로 데이터들이 어떤 식으로 배열되어 있는지, 크기는 어떻게 될 것인지를 생각하시면서 공부하시면 도움이 됩니다. 하지만 그런 것들을 생각하면서 공부하는 것이 Data types에서만큼 중요한 것은 아니므로 단순히 사용법만 아셔도 되겠습니다.(물론 하드웨어 제어를 위해 C 언어를 공부하시는 분이라면 무조건 아셔야만 합니다. 덤으로 bit-field 같은 것도 아셔야겠죠.)
I/O, File I/O
이 부분은 처음부터 너무 깊게 공부하실 필요 없습니다. 초보자에게는 어려운 내용이 별로 필요가 없거든요. 사용법들 중 간단한 것들만 실습해 보는 정도로도 충분할 겁니다. 고수준의 I/O는 필요할 때 공부하십시오.
5. 어떤 컴파일러를 사용하여 공부해야 하나?

Turbo C 1.0, 2.0, 2.1 etc...
Borland C++ 3.0, 3.1, etc...
둘 다 볼랜드 사에서 나온 도스(DOS)용 컴파일러 입니다. 인터넷에 불법으로 돌아다니는 것들이 있다고 하더군요. 구해서 공부해 보시길... 한글 번역본 중에 부록으로 들어있다고도 하구요. 설치 후 bin 폴더 안의 TC.exe를 실행시키면 됩니다. Borland C++에서는 파일 확장자를 .c 로 해 주어야 C 언어를 사용했다고 생각하고 컴파일합니다.(C++의 경우에는 확장자가 .cpp여야 합니다.)
Visual C++
아주 좋습니다만 처음 사용하는 분들이 프로그램을 시작해 보면 도대체 어디부터 손을 대야 하는지 모를 수 있습니다. 하지만 이것 밖에는 방법이 없다!라고 하신다면 능력껏 컴파일 방법을 알아내시기 바랍니다. 별로 안 어려워요. ^^
GCC, G++
리 눅스를 사용하시는 분이라면 당연히 이 컴파일러를 사용하셔야죠? Development tools 패키지에서 관련 파일들을 설치하셔야 사용하실 수 있습니다. Turbo C 나 Visual C++ 같은 통합환경이 아니고 명령줄에서 실행하는 것이라는 점에 유의하세요. 이를테면, Xterm을 띄워두고
$ gcc test.c
처럼 하시면 됩니다. 확장자가 .c 이면 C 언어이고 .cpp 혹은 .cc 이면 C++입니다.
리눅스를 사용하여 C를 공부하려면 에디터 사용법을 알아야 합니다. 옛날이라면 VI나 Emacs를 적극 추천했을텐데 요즘 래드헷 패키지를 보면 단순하고 윈도 기반 에디터들도 있더군요. 취향에 맞는 것을 사용하시기 바랍니다.
Borland C++ 5.5
볼랜드 사에서 다운로드 받을 수 있는 C/C++ 컴파일러입니다. 볼랜드 사의 코어 컴파일러로서 가장 최근의 ANSI C/C++(표준)을 완벽하게 지원합니다. 단, DOS용이면서도 Turbo C 같은 통합환경을 제공하지 않으며 gcc/g++과 같이 명령행에서 실행해야 합니다. 사용방법은 gcc/g++과 거의 동일합니다. 개인적인 의견입니다만 이 컴파일러가 상당히 맘에 들더군요. 실제 상용 프로그램을 작성하는 것은 불가능하지만 숙제를 한다던가 공부를 할 때에는 아주 그만입니다. 그리고 여기에 더해서 Turbo Debugger라는 놈이 따라옵니다. 이것은 Turbo C++과 같은 통합환경을 제공하는 디버거인데 Turbo C++에 익숙하신 분들은 전혀 사용에 지장이 없을 겁니다.
6. 공부방법에 대한 두 번째 조언: 전체적인 공부의 흐름

대 부분의 C 책을 펼쳐보면 "Hello, World!" 를 출력하는 셈플 코드를 가지고서 설명을 시작합니다. C를 처음 접하시는 분이라면, 그리고 아직 한번도 컴파일을 해 본 적이 없는 분이시라면 반드시 이것을 컴파일하여 화면에 출력시켜 보시기 바랍니다. 그것이 제대로 된 시작입니다. 프로그램의 작성, 컴파일러를 사용한 컴파일, 프로그램의 실행이라는 3단계를 무사히 마칠 때까지 실패의 원인을 분석하셔야 합니다. 그래야 나중에 실습을 제대로 할 수 있게 될 테니까요. 만약 지금 컴퓨터가 없다면 별 수 없지만 단지 컴파일러가 없어서 못하겠다...라고 하시는 것은 변명이 되지 않습니다. 즉시 인터넷에서 적절한 컴파일러를 구하여 설치하고 사용하십시오. 그런 후에 공부를 진행하세요. 컴파일러의 사용법을 모두 아실 필요도 아직은 전혀 없습니다. 단지 위의 것을 컴파일하고 실행하는 것만 성공시키세요.
그런 후에 주요 내용에 대한 공부와 실습을 병행하십시오. 이것은 취향에 따라서 하실 수 있을 테지만요. 공부하실 내용은 위에 언급한 주제들입니다. 그리고 실습을 하다보면 컴파일러 사용법에 점차 익숙해질 것입니다.
공 부가 한 번 끝나셨다면 마지막 점검을 하셔야겠네요. 혹시 위에 추천된 책들 중에서 1)을 가지고 계시지 않다면 그 책을 사셔야 할 때가 된 것 같습니다. 그리고 그 책의 첫 장(Introduction)을 읽어보십시오. 꼼꼼하게. 이 책의 Introduction에는 C 언어에 대한 전반적인 소개와 중요 개념들이 대부분 언급되어 있습니다. 만약 모두 이해가 가신다면 C 언어의 세계에 성공적으로 들어오신 겁니다.
그런 후에는 간단한 프로젝트를 하나 설계해 보십시오. 윈도 프로그래밍이 아니라 텍스트 모드에 기반한 아주 간단한 것으로요. 그렇지만 많은 분들이 이런 것 생각하시는 것을 귀찮아 하신다거나 혹은 전혀 그 방향을 잡지 못하는 분들도 계시기에 한 가지 예를 들어보자면 이런 것이 있을 수 있겠습니다.
문) 최대 5명의 이름과 전화번호, 메일주소를 입력받아 저장하고 선택적으로 지울 수 있으며 자료의 정렬이 가능해야 한다. 데이터의 저장 공간은 구조체의 배열을 사용하든, 저장 영역을 생성/소멸 시키든 관계없다.
간 단하죠? 텍스트 기반으로 만드는 것이므로 코드는 길지 않습니다. 300-500라인 사이면 되지 않을까 합니다. 텍스트 기반이라고 하여도 만약 사용자 인터페이스를 멋지게 만들고 싶다면 조금 더 길어질 수도 있겠죠. 위의 문제를 나름대로 발전시켜서 30명 정도의 정보를 저장할 수 있는 괜찮은 전화번호부를 만들 수도 있을 겁니다. 의욕이 닿으신다면 File I/O의 기본적인 내용을 적용하여 전화번호부를 저장하는 것도 생각할 수 있겠네요. 여기에다 적당한 인터페이스를 더하면 헨드폰의 전화번호부를 설계하신 것이 됩니다.
어쨌거나 중요한 것은 모든 것이 프로그램 작성자의 상상력과 노력에 달려있다는 겁니다. 반드시 간단한 프로젝트를 하나 해 보시기 바랍니다. ^^
7. 그 외의 것들

어 느 사이엔가 여러분은 C에 익숙해져 있을 겁니다. 이제는 좀 더 심화된 내용들을 살펴봐야 할 것 같습니다. 이와 관련된 내용들은 많은 분들의 의견이 일치하지 않을 것으로 보입니다만 당장 생각나는 것들만 몇 개 나열해 보겠습니다.
헤더파일의 고급 사용법
리눅스나 Borland C++ 5.5를 사용할 경우 makefile을 작성하는 방법
C를 사용하여 OOP적인(혹은 모듈화된) 프로그램을 작성하는 방법
C에서 사용되는 각종 표준 메크로들
Port I/O (Hardware interface)
앞 의 네가지는 아주 밀접한 관계를 가지고 있습니다. 헤더파일의 고급 사용법은 대규모 프로그래밍에서 필수적으로 사용하게 되는 모듈화된 프로그래밍에서 중요한 역할을 합니다. 그다지 많지 않은 내용이지만 잘 익혀두시면 나중에 편합니다.
그리고 헤더파일의 고급 사용법을 익히면서 꼭 만나게 되는 것들이 바로 메크로입니다. 역시 중요한 것들을 꼭 익혀두시길 바랍니다. 쓸데없는 메크로도 많고 중요하지만 초보에게는 그다지 쓸모없는 것들도 많습니다. 그런 것들을 굳이 구분하실 필요는 없으며 일단 한 번 읽어보고 '이런 것이 있구나'하는 정도로 이해하고 넘어가시면 됩니다. 나중에 필요할 때 들춰보면 되니까요.
makefile 이 뭔가 궁금하신 분들이 있을 겁니다. 이것은 프로그램 파일들이 많아질 경우 파일들 사이의 의존 관계 등을 작성해 두는 파일입니다. 그러면 make라는 유틸리티를 사용하여 자동적으로 컴파일을 할 수 있게 됩니다. 각종 의존관계를 생각하며 컴파일 할 필요가 없다는 거죠. Visual C++이나 Borland C++ Builder, Delphi 등등은 모두 기본적으로 make라는 유틸리티와 비슷한 것을 사용하고 있습니다. 단지 그것을 자동적으로 생성하여 사용자들이 생각할 필요가 없게 해 줄 뿐이죠. 리눅스나 볼랜드 코어 컴파일러를 사용할 때 makefile을 사용하는 방법을 익혀 두신다면 도움이 될 때가 있을 겁니다.
끝으로 Port I/O에 관련된 것인데 이것은 컴파일러마다 다릅니다. 필요한 자료는 하드웨어 동호회 같은 곳에서 구하실 수 있을 겁니다. 여기에 관련된 내용은 C의 하드웨어 제어와 직접적으로 연관된 부분들이기 때문에 C 문법과는 전혀 다른 새로운 부분이라고 할 수 있으며, 공부하길 원하시는 분들은 아마도 이미 어셈블리 언어에 대한 이해 혹은 컴퓨터 구조에 대한 이해를 하고 계신 분들이라 생각됩니다. 그러니 더 이상의 설명은 필요없겠죠? ^^;
그 외에도 많겠지만 필요할 때마다 알아서 적당히 공부하시기 바랍니다. ㅡ.ㅡ;
8. 마지막 첨언
여러분께서 영어로 에세이를 하나 작성한다고 생각해 보시기 바랍니다. 기본적인 영문법은 익힌 상태라고 가정하죠. 그러면 이제 단어가 문제가 될 것입니다. 표현하고 싶은 것이 있어도 영어 단어를 모른다면 아무런 소용이 없겠지요.
이 번에는 영어로 된 글을 읽는다고 생각해 보시기 바랍니다. 이제는 단어도 문제이지만 뉴앙스도 문제가 될 겁니다. 글을 쓰는 사람의 의도가 담긴 뉴앙스를 모르면 이해가 어렵게 될 겁니다. 그리고 문법도 또 다시 문제가 됩니다. 직접 글을 쓸 때에는 아는 문법을 짬뽕해서 사용해도 어떻게 적당히 표현이 가능하지만 글을 읽을 때에는 작성자가 사용한 문법 중 모르는 것이 있으면 이해가 처음부터 불가능하게 됩니다. 단어야 사전을 뒤져서 이해한다고 쳐도요...
마지막으로 글을 쓰는 방법을 살펴보죠. 워드를 열고 글을 쓰시려면 계획도 세우고 뼈대를 잡은 후에 글을 쓰고 다 쓴 후에는 퇴고의 과정을 거칩니다. 프로그램의 사용법을 잘 아셔야겠죠?
1에서 소개된 책을 공부하셨다면 여러분은 "문법"만을 공부하신 셈이 됩니다.
여 러분께서 C언어로 프로그램을 작성하다고 생각해 보시기 바랍니다. 기본적인 문법은 익힌 상태겠지요. 그러면 이제 라이브러리 함수가 문제가 될 것입니다. 구현하고 싶은 기능이 있어도 필요한 함수를 작성 못하거나 어떤 함수가 있는지 모른다면 아무런 소용이 없을 것입니다.
이번에는 C로 작성된 프로그램을 읽는다고 생각해 보시기 바랍니다. 라이브러리 함수도 문제지만 프로그램의 흐름과 스타일도 문제가 될 겁니다. 작성자의 흐름이나 스타일을 모르면 이해하기 어려울 것입니다. 그리고 문법도 또 다시 문제가 됩니다. 직접 프로그램을 작성할 때에는 아는 문법을 짬뽕해서 사용해도 어떻게 적당히 작성이 가능하지만 남의 것을 읽을 때에는 작성자가 사용한 문법 중 모르는 것이 있으면 이해가 처음부터 불가능하게 됩니다. 라이브러리 함수야 메뉴얼을 뒤져서 이해한다고 쳐도요...
역시 마지막으로 프로그램 작성 방법을 살펴보죠. 프로그램을 작성하시려면 디자인을 하여야 하고 프로그래밍을 모두 쓴 후에는 디버깅과 평가의 과정을 거칩니다. 당연히 프로그래밍 툴에 대한 이해를 잘 하셔야하겠지요.
이 렇게 보면 중요한 요소들이 나타나게 됩니다. 문법, 라이브러리 함수, 프로그램의 흐름과 스타일, 작성 툴의 사용법 익히기. 여러분은 각 요소들의 가장 기초적인 부분을 끝낸 상태입니다. 이제 실제 프로그래밍을 하면서 살을 붙이고 경험을 쌓아나가며 노하우를 축적하여야 합니다. 이것들은 영어공부를 하는 것과 마찬가지로 노력이 없으면 불가능한 것이겠죠. 여러분의 앞길이 순탄하길 바랍니다. 이 정도에서 첫 가이드를 마치도록 하겠습니다.
참고) 각각의 중요한 요소들에 대한 첨언입니다.
(1) 문법: "The C programming Language"를 구하셔서 Introduction이 잘 이해가 가는지 확인하신 후에 짬이 나실 때마다 부족하다 생각되는 부분을 찾아서 읽으십시오. 책이 어렵기는 하지만 굉장히 압축적으로 써있기 때문에 몇 줄 읽지 않고서도 생각할 것이 많습니다. 곰곰이 생각해보는 과정에서 얻는 것이 많을 것입니다. 이 책의 주옥같은 문제들도 풀어보시면 금상첨화.
(2) 프로그램의 흐름과 스타일: 스타일이란 프로그래밍 컨벤션에 대한 공부를 조금 하면 금방 이해가 가실 겁니다.(공부할 것도 별로 없지만...) 프로그램의 흐름은 프로그램의 종류나 목적마다 많이 다르므로 많이 작성해보고 많이 읽어보면서 이해하셔야만 합니다. 물론 좋은 흐름을 창조하는 방법을 많이 연구해야 함은 물론입니다. 이와 관련된 내용이 바로 "소프트웨어 공학"이라는 분야입니다. 관련 내용을 검색해 보시기 바랍니다.
(3) 라이브러리 함수: 윈도 API나 리눅스의 glibc, winsock 혹은 여러분이 직접 만든 함수들의 집합을 말합니다. 실제 상용 프로그램 수준의 프로그래밍을 하게 되면 이런 라이브러리들을 공부하고 사용할 수밖에 없으며 자신만의 라이브러리를 축적하는 것도 매우 중요합니다. 하지만 윈도 API나 glibc같은 것을 사용하는 것은 따로 시간을 내셔서 차근차근 공부하셔야 합니다. 이것은 문법과는 다른 "단어"의 문제이기 때문입니다. C 언어를 공부하였다고 해서 네트워크 프로그래밍을 할 수 있는 것은 아니지 않겠습니까? 꾸준히 필요한 부분을 공부하시는 것이 가장 좋은 방법일 것입니다.
(4) 툴: Rational Rose(설계 툴), Visual Studio, Turbo C++, Borland C++, GCC, Make utility, 등등... 필요한 것들을 선택하여 일단 하나를 어느 정도 숙지하세요. 특히 컴파일러의 경우에는 디버깅 툴 사용법을 잘 익혀 두시기 바랍니다. (개인적인 생각이지만(그리고 많은 분들이 동의하시지만) 전 디버깅의 실력이 진짜 실력이라고 봐도 무방하다고 생각하거든요.)