C++ 언어의 중요성이나 왜 배워야 하는가, 다른 언어와 차이점은 무엇이며 OOP를 완벽하게 구현할 수 있는가, 등등...에 대한 얘기는 하지 않겠습니다. 그런 것은 자유게시판 뿐만 아니라 잡지, 뉴스, 책 등등에서 무수히 이야기가 나누어진 주제이니까요. C가 필수라면 C++은 여러분이 선택하기 나름입니다. JAVA를 해도 되고 C#을 해도 되고, Delphi, Visual Basic 등등 아무 것이나 해도 됩니다. 저는 단지 여러분이 C++을 공부하려고 한다고 가정하고 거기에만 초점을 맞추겠습니다.
C++을 하시려면 시간이 걸리시더라도 C를 먼저 공부하라고 권해드리겠습니다. 꽤 많은 분들께서 C언어를 공부하지 않고 바로 C++을 공부해도 된다고 하시지만 기본적으로 저는 반대입장입니다. 물론 여러분의 취향 나름이겠죠. ^^ 이 글에서는 C++을 C없이 공부하시는 분들도 보실 수 있게 쓰겠습니다만 제가 앞서 작성하였던 C 언어 공부 가이드는 읽으셨다고 생각하겠습니다.
1) The C++ Programming Language, Special Edition(or 3rd Ed.)
Bjarne Stroustrup
Addison Wesley
2) On to C++
Patrick Henry Winston
Addison Wesley
3) Ruminations on C++ : A Decade of Programming Insight and Experience
Andrew Koenig, Barbara E. Moo (Editor), Barbara E. MooEditor
Addison Wesley
4) C++ 기초 플러스 알파
성안당
5) http://www-h.eng.cam.ac.uk/help/mjg17/teach/CCsummary/
케임브리지 대학
6) http://www.icce.rug.nl/docs/cplusplus/
C++ Annotations Version 4.4.2
C++를 처음 하시는 분이라면 2)를 권합니다. 학부 때 교제였는데 많은 친구들이 이 책에 감동을 받았습니다. ^^ 고급의 C++ 문법은 전혀 다루지 않고 있으나 가장 핵심적인 내용들을 모두 아우르고 있으며 이 책을 때고 나면 바로 어려운 C++ 문법 책을 보실 수 있습니다. 4)는 가장 일반적으로 보는 책인 것 같더군요. 이 책을 보지는 않았지만 많은 분들의 의견을 읽고 소개합니다. 사실 저는 Tom swan's C++ Primer라는 책으로 처음 공부했더랬습니다. 솔직히 좀 지루했죠. ㅡㅡa 참. On to Java라는 책도 있는데 이건 그렇게 크게 추천하지는 않겠습니다. 생각보다 내용이 적거든요.
C++을 한 번 공부하기는 했는데 조금 시간이 지났기에 기억을 되새기고 싶지만, 전에 공부했던 책이 별로 맘에 안 든다!!라고 생각하시는 분께는 6)을 권해드리겠습니다. HTML 문서이기 때문에 조금 불편하시겠지만 제가 아는 한 C++ 문법에 대한 설명을 가장 잘 한 책입니다. 템플릿 및 템플릿 라이브러리 관련 챕터들, 연산자 오버로딩의 고급사용에 대한 챕터들은 조금 맘에 들지 않습니다만 나머지 핵심 기초문법에 대해서는 매우 설명을 잘 하였습니다. 생각보다 양이 적습니다. 제가 대학에서 강의 교제 만들 때 참고한 교제입니다.
C++을 다시 공부하기에는 시간이 아깝다...하시는 분들에게는 5)를 권해 드리겠습니다. 이건 C++문법의 중요 부분들의 체크리스트가 담긴 링크인데 pdf파일도 있습니다. 소책자 수준의 크기에 두께도 인덱스, 차례, 제목 모두 포함해서 60여 페이지 정도. 프린트해서 보세요. 여기 있는 내용을 아무 무리 없이 읽으실 수 있다면 일단 중요 문법은 파악하고 계신 겁니다.
C++을 어느 정도 공부하시고 실전에 사용하실 때 애매한 경우를 많이 당하시는 분들께는 3)을 권해드립니다. 역사적인 배경때문인지는 몰라도 C++을 사용하다 보면 요런 경우, 저런 경우에는 어떻게 해야 하나... 하면서 고민하게 되는 때가 많습니다. 특히 C++을 사용한 지 오래되지 않았을 때 더 그렇죠. 만약 그런 상황이라면 이 책이 제격입니다. C++의 미묘한 문제점들을 명쾌하게 해설하고 있습니다. 하지만 조금 옛날 책이기 때문에 STL에 대한 설명이 없습니다. 그럼에도 불구하고 Template을 사용하여 자신만의 Template Library를 만들 때 고려해야 할 점 들을 역시 잘 설명하고 있습니다. C++의 기본 문법에 대한 설명은 없으므로 문법책을 한 번 이상 본 사람들만 보실 수 있습니다.
마지막으로 1)번에 대한 설명을 드리겠습니다. The C Programming Language와 마찬가지로 책꽂이 꽂아 두면 든든한 책이죠. ^^ 리치와 커니건의 C책과 비슷한 점이 아주 많습니다. 일단 C++의 초보자를 대상으로 하지 않고 있으며 Introduction이 아주 잘 되어 있다는 점이 가장 큰 공통점입니다. 기본적인 문법을 한 번 보셨다면, 그리고 namespace, template, STL 등의 고급 주제를 공부해 보고 싶다 생각하시는 분이라면 이 책의 Introductory Material(1-3장)을 꼼꼼하게 읽으시기를 권해드립니다. 이것을 다 읽고 나시면 자신에게 필요하거나 부족한 부분이 무엇이며 그 내용은 이 책의 어디에 있으며 어느 정도의 응용이 가능한가에 대한 감을 잡으실 수 있습니다. 이 책은 결코 통독을 위해서 만들어진 것은 아니라고 생각합니다만 그래도 뛰어난 프로그래머들은 모든 챕터를 한 번 이상 읽으셨을 거라 생각됩니다.(전 필요한 부분만 읽었는데 모두 합치니 1/4 정도더군요.) 아참. 이 책의 가장 큰 장점 중 하나는 Index입니다. 굉장히 잘 되어 있습니다.
그 외에도 C++과 관련해서는 수없이 많은 양서들이 있으니 주위에서 좋은 책을 추천받으시길 바랍니다.
C언어에 대한 가이드를 소개하면서 말씀드린 실습은 C++도 당연히 마찬가지입니다. 하지만 C++은 C와는 달리 하나 더 생각해야 합니다. 무엇보다도 OOP 개념을 항상 염두에 두셔야 한다는 거죠. 실습은 기본이고 거기에 더해 종이에 끄적거리며 설계 연습을 반드시 하셔야 합니다. C 가이드에서도 고급 주제로 모듈화 프로그래밍을 공부할 필요가 있다고 말쓰드렸습니다. C에서 모듈화가 옵션이라면 C++에서는 모듈화를 하지 않는 것이 옵션입니다. 이 차이를 늘 기억하면서 공부하십시오.
첨부하자면 C++은 금방 쉽게 익힐 수 있는 산뜻한 언어는 아니라는 겁니다.(물론 산뜻하게 사용할 수는 있습니다.) 일단 공부할 양이 많고 익숙해지는 데에는 더 많은 시간이 소요되기 때문입니다. 짧은 기간 동안 집중적으로 투자한다고 해도 그 뒤를 이은 되새김질과 연습이 없이는 자신의 것으로 만들기 어렵습니다. 그러니 공부하고 나서 금방 까먹는다고 걱정하지 마세요. 다시 공부하면 됩니다. 필요한 것은 끈기입니다.(저처럼 끈기 없는 사람은 몇 년이 지나서야 조금 눈이 뜨이죠. ^^;)
(1)
Data Types, Declarations and Dealing with Data
Arrays and Pointers
Operators, Expressions, and Statements
Control Flow : Looping, Branching and Jumps
Fuctions
(2)
Structures and Classes
Operator overloading
Inheritance
Polymorphism
C++의 기초 문법은 두 가지가 있습니다. 하나는 흐름제어나 문장, 함수 호출 등등과 관련된 문법이고 다른 하나는 프로그램의 구조를 구성하는 것과 관련된 문법입니다. 앞의 것은 C언어의 그것과 거의 동일하며 뒤의 것은 OOP를 적용하는 부분으로서 모두 클래스와 관련된 것입니다. 공부하시면서 자신의 공부가 둘 중에 어디에 속하는 것인지를 마음에 담아 두십시오.
(1)의 경우에는 C언어 가이드에 있는 설명을 참조하시기 바랍니다. 여기서는 그것에 약간의 보충만 하겠습니다.
Data types
데이터와 관련하여 C++이 C와 달라진 점은 데어터 타입간의 혼용이 불가능해졌다는 겁니다. 즉, C에서는 int형 값을 char에 집어 넣어도 아무 문제 없었지만 C++에서는 그렇게 하기가 힘듭니다. 명시적으로 말을 해 주어야 하죠.
Arrays and Pointers
C와 별다를 바 없습니다. 헷갈리지 않게 확실히 공부해 두십시오.
Operators, Expressions and Statements
Control Flow
Functions
C와 거의 비슷합니다. 단, 함수의 경우 Function overloading이 가능해졌습니다. 즉, 이름이 같은 함수라도 인자를 다르게 정의했으면 다른 함수가 되는 거죠. 아주 유용하며 C++에서는 매우 일반적으로 사용되는 기능입니다.
이 부분들을 공부하시면서 반드시 헷갈리지 않고 기억하셔야 하는 것을 몇 개 뽑아보면 아래와 같습니다.
1. 함수호출 시 call by value(C의 형태)와 call by referece의 차이점 숙지.
여기서 연산자 '&','*'의 사용법이 매우 헷갈리기 쉽습니다.
공부하기 전에 C 언어의 배열과 포인터 부분을 확실하게 이해해 두는 것이 도움이 됩니다.
2. '&'을 사용한 reference 변수(혹은 alias변수, 혹은 nickname 변수)의 사용법.
3. 예약어 const의 굉장히 다양한 사용법 숙지.(C언어와는 사뭇 다름)
(2)의 경우에는 모두 공부한 후에 아래의 것들을 자신이 직접 설명할 수 있는지를 체크해 보시기를 권합니다.
- 상속(Inheritance)
- 다형성(Polymorphism)
- 클래스가 포인터형 멤버 변수를 가질 때의 메모리 관리
(생성자, 소멸자, operator overloading,
copy constructor, virtual destructor 등등 관련)
- 다중 상속시 발생하는 조상 클래스 문제 다루는 법
(실전에서 별로 마추치지 않는 문제지만 일단 알아두셔야 합니다.)
- 추상클래스 만들기와 사용법
- dynamic casting이 필요한 상황과 사용법
- cross reference를 하는 클래스들이 있을 경우 해결하는 원리와 헤더파일 작성법
(cross reference란 서로 다른 클래스가 서로의 포인터를 멤버로 갖는 경우입니다.)
- 등등...
처음 C++을 공부하시는 분들은 위의 내용이 무엇을 말하는 것인 지 모르실 겁니다. 그냥 넘어가십시오. 일단 아무 책이나 한 권 붙잡고 공부하신 후에 다시 이 절을 읽어보십시오. 어쨌든 위의 것들을 별 무리없이, 그리고 개념의 혼동없이 직접 설명하실 수 있다면 기초 문법을 이해하셨다고 보셔도 되겠습니다. 그 외에도 몇 가지 자잘한 것들은 위에서 말씀드렸던 책 중 5)번 케임브리지 대학의 요점 노트를 읽으시면서 체크하시기 바랍니다.
일단 아주 초보분들에게 공부하실 책의 순서를 제 나름대로 권한다면, 2) -> 4)혹은6) -> 1) 의 순서로 공부하시길 권합니다. 한 권의 책으로 C++을 끝내고 싶으시다면 4) 혹은 6)을 보십시오. 하지만 개인적인 생각으로는 한 권만으로 C++을 마스터하기는 쉽지 않다고 봅니다. 취향에 따라 선택하시기 바랍니다. 그리고 공부가 한 번 끝나면 5)번 책으로 꼭 점검을 하시기 바랍니다.
C++ 역시 대부분의 책을 펼쳐보면 "Hello, World!" 를 출력하는 셈플 코드로 설명을 시작합니다. C 가이드에서 말씀드렸던 것처럼 먼저 이것을 성공적으로 컴파일하고 화면에 출력시키십시오. 그런 후에 주요 내용에 대한 공부와 실습을 병행하십시오. 그리고 C++에서는 프로그래밍의 규모가 커지는 만큼 나중의 편의를 위해 조금 더 신경써서 컴파일러나 디버거 사용법을 익히시기 바랍니다.
역시 이번에도 마지막에는 간단한 프로젝트를 설계해 보십시오. 예제는 C 가이드에서 보였던 것과 같습니다. 단, 이번에는 OOP지향적으로 해야겠지요? 데이터들을 클래스로 설계하십시오. 그리고 몇 가지 관련있는 함수들을 모아 또 클래스를 만듭니다. 이런 클래스들이 서너 개 정도 만들어질 겁니다.(설계하기에 따라 다르겠지만)
유의하실 점은 main함수의 사용입니다. main 함수는 C++에서 큰 역할을 하지 않는 것이 좋습니다. main이 중요했던 시기는 C로 족하다고 봅니다. OOP로 바꿔 생각할 때에는 모든 함수나 데이터들이 캡슐화되는 것이 바람직하며 main 함수의 역할은 그런 캡슐들의 동작을 시작시키고 끝내는 것으로 족합니다. 마치 자동차의 시동을 걸고 끌 때 열쇠를 살짝 돌리는 것으로 족하듯이 말이죠. 모든 동작은 객체들이 맡아서 하게 해야합니다. 역시 자동차의 엔진이나 바퀴, 브레이크 드럼 등등이 시동을 거는 열쇠와는 관계없이 알아서 잘 돌아가는 것처럼요.
이러한 설계 기법은 이렇게 말로 한다고 해서 쉽게 이해되는 것은 아니므로 많은 강좌와 예제를 보면서 꾸준히 익히는 수밖에 없습니다. 가장 좋은 방법은 윈도 API (혹은 SDK) 프로그래밍을 배우는 것인데(모든 것을 다 공부할 필요는 없습니다. 나중에 필요한 것만 찾아서 사용하면 되니까요.) 이 시점에서 윈도 API를 사용하여 윈도우 창을 띄우는 표준적인 방법을 공부하시면, 가장 좋은 점은 프로그램에 시동을 걸고 끄는 방법(기본적으로 메세지 무한루프)을 이해하실 수 있다는 겁니다.(더 중요한 것은 win32 아키텍쳐를 이해하는 거라고 합니다.) 그리고 윈도 API가 비록 C언어로 작성되어 있는 것이지만 여러분께 필요한 형태의 클래스로 캡슐화하는 것을 연습하는 것은 정말 큰 도움이 될 겁니다. 이 연습을 몇 번 하신 후에 MFC를 공부하시면 머리에 쏙쏙 들어오겠죠. ^^
기초문법은 잠시 접어두고 이제는 좀 더 심화된 내용들을 살펴 보겠습니다. 이 주제들은 처음 C++을 시작할 때부터 공부할 필요가 없습니다. 처음부터 공부하면 오히려 크게 혼동될 가능성이 있으니 앞에서 언급된 기초문법들을 충분히 숙지한 후에 공부하세요. 그리고 한꺼번에 다 할 필요도 없고 필요한 것들을 골라서 공부하시면 됩니다.
- namespace
C를 모듈화하는 것을 연습하라고 했던 것을 기억하시는지요.
namespace는 프로그램 코드들을 그룹화시키는 데에 사용하는 겁니다.
C에서는 파일 별로 나누어야 하지만 이것을 사용하면 나누어도 되고 안 나누어도 됩니다.
심지어 파일을 건너뛰어 하나의 namespace안에 속하게 할 수 있습니다.
이것의 개념이 C#에 기본적으로 사용되었습니다.
- Templates
뼈대만 있는 클래스를 만들어 두고 나중에 재활용할 수 있게 해주는 기능입니다.
데이터 형을 미리 정의하지 않고 만들기 때문에 하나의 뼈대로 각종 데이터 형에서 사용합니다.
하지만 문법이 상당히 까다롭습니다. 저도 아직 잘 모릅니다.
사람들이 별로 사용하지 않았죠. 그래서 나온 것이 바로 아래의 STL입니다.
- STL(표준 템플릿 라이브러리)
C++에만 있는 엄청난 기능입니다.
각종 알고리즘과 자류구조가 최적화된 상태의 template으로 제공됩니다.
기실 STL만 잘 사용할 수 있다면 스스로 알고리즘을 짜게되는 경우는 별로 없습니다.
그 때문에 고급 프로그래밍에서는 STL의 사용이 거의 필수적이죠. 효율적이니까...
이에 대한 공부의 시작은 1)번 책의 Introductory Material의 2,3장으로 하시길 추천합니다.
잘만 이해하면 template을 몰라도 사용가능합니다.(저처럼... ^^;)
- Exception Handling
C++의 표준 방식이 있고 Visual C++에는 추가적인 방법이 또 있습니다.
하지만 어느 고수님 말씀으로는 C++ 표준 방식을 권하시더군요.
- pointer to members
자신이 속한 클래스 맴버 번수에 대한 포인터의 사용법입니다.
별로 쓰이지 않지만 다른 사람의 코드를 읽을 때 필요할 지도...
- runtime type identification
실행시간에 데이터 타입을 확인할 수 있게 해 주는 것인데 별로 쓰이지 않습니다.
하지만 역시 다른 사람의 코드를 이해하기 위해서 필요할 지도...
- 등등...
다음은 C++에서 그다지 필요없다고 생각되는 문법입니다.(개인적인 생각입니다.) Stroustrup도 말했듯이 C++은 OOP의 역사가 고스란히 담겨있는 언어니 만큼 쓸데없는 기능들도 상당수 포함되어 있습니다. 물론 예약어들 하나 하나가 각각 만들어진 배경과 철학을 담고는 있지만 그런 것들까지 사용할 만큼 복잡한 프로그래밍을 하는 경우는 극히 드뭅니다. 게다가 보통의 프로그래머는 아예 그런 것이 있다는 것도 모른 상태에서 C++ 프로그래밍을 해도 아무 문제가 없습니다. 제 생각에는 4장에서 언급한 것과 이번 장(7장)에서 언급한 정도를 익힌 후에는 필요할 때 찾아보면서 사용하는 것이 더 나을 거라 봅니다.(저도 잘 모르기 때문에 예를 들 수가 없네요. ㅡㅡ;) 물론 기초 문법 중에도 아래와 같이 OOP에 별로 도움되지 않는 것들도 있습니다.(물론 쓰이는 곳도 있지만...) ^^
- 예약어 friend
- nested classes(이건 사람들 마다 의견이 다를 것 같군요.)
- 등등...
C 가이드에서 영어로 글을 쓰는 것과 프로그래밍 하는 것에 대해 비교한 것을 기억하시는지요. 그 얘기는 여기서는 생략하기로 하고 각각의 중요한 요소에 대한 설명을 조금만 보충하겠습니다.
(1) 문법: 앞서도 말씀드렸지만 C++의 문법은 방대합니다. 그리고 모든 문법이 똑같은 중요도를 가지는 것도 아닙니다. 또한 개념상 순차적으로 배워야 하는 것들도 있습니다. 따라서 중요한 것부터 익히고 차례차례 나머지 것들을 익히는 방법을 사용하셔야 합니다. 1)번 책을 짬날 때 관심있는 분야부터 조금씩 읽으시면 도움이 되실 겁니다. 모든 문법을 싸그리 알고 싶으시다면 1)을 첨부터 끝까지 정독하시길...
(2) 프로그램의 흐름과 스타일: 역시 앞에서 말씀드렸지만 C++을 사용할 때에는 OOP 개념을 염두에 두셔야 합니다. 참고로 UML이라는 언어가 있습니다. 언어 자체가 그림으로 이루어져(?) 있는 것인데 OOP 프로그램 설계에 매우 적합합니다. 기본적인 C++ 문법을 끝낸 후에는 UML을 한 번 공부해보시고 실전에 사용해 보는 것도 좋을 거라 생각됩니다.
(3) 라이브러리 함수: C++의 대표적인 라이브러리는 당연히 STL를 들 수 있습니다. 윈도 프로그래밍에서는 MFC(Microsoft Foundation Classes)죠. 설명은 생략하겠습니다. STL은 C++에서도 조금은 고급 응용에 속하고 MFC는 윈도 프로그래밍에 국한된 것이니까요. 그리고 STL은 앞에서 설명한 것으로 충분하다고 봅니다.
(4) 툴: 이미 C 가이드에서 언급했다시피 Rational Rose(설계 툴), Visual Studio, Borland C++ Builder, GCC, Make utility, 등등...이 있습니다. 이중 OOP 설계에는 Rational Rose 혹은 그와 비슷한 UML 툴들이 큰 도움이 됩니다. 하지만 이것은 일단 기본적으로 컴파일러를 사용할 수 있는 후에 공부해도 되는 것이죠. 윈도우즈에서는 Visual Studio나 Borland C++ Builder를, 리눅스에서는 당연히 g++을 익숙하게 익히시기 바랍니다.
ps. C++ 기초 문법에 눈을 뜨셨다면 자유게시판에 위즈(ares666)님이 올리신 17942번 글이 앞으로의 행보에 큰 도움이 될 것 같습니다.
ps2. C++ 기초 문버을 눈을 뜨셨는데 C#에 관심이 생기셨다면 C# 란에 가서 강좌란의 왕성현 님의 글인 "C# 겉핥기" 모음집(help file)을 다운 받아서 읽어 보세요. C++에 익숙하신 분들을 위한 강좌인데 아주 잘 쓰여진 글입니다.
ps3. UML의 경우에는 아래의 책을 초보자용으로 추천합니다. 저는 이 한 권만 봤기 때문에 다른 책은 어떤지 잘 모르겠네요...
- (초보자를 위한) UML 객체 지향 설계
Schmuller저/곽용재 역
인포북
참고로 Visual Studio의 Visual Modeller라는 툴이 있는데 Rational Rose의 일부기능을 라이센스 한 것입니다. 하지만 없는 기능이 너무 많기 때문에 이것으로 디자인 하는 것은 효용가치가 없습니다. Rational 홈페이지에서 Rose 98 평가판을 다운받아서 사용해 보십시오.(위 책의 부록 씨디에도 있습니다.) 들리는 말에 의하면 크랙도 돌아다닌다고 하던데 그 말이 사실이라면 개인적인 공부용으로는 꽤 오래 사용해 보실 수 있을 겁니다. 상용으로 국산 제품인 Plastic같은 것이 있구요, Rose는 넘 비싸고... ㅡㅡa
첫댓글 운영자님아 2번책 영어라 읽기가 힘들던데....
원래 프로그래밍 언어는 원서가 젤 좋다고 하죠...하지만 저도 영어는 시러해요 ㅜ_ㅜ;;;
좋은 게시물이네요. 스크랩 해갈게요~^^
좋은 글 감사합니다 첨하는 초보한테 넘 많은 도움이 되네요/이건 안 없애죠?? 두고두고 참고하려구요