안녕하세요 피터입니다.
많은 분들이 C 언어를 배우고 나서 C++ 를 배우기 시작 할 때 어려움을 겪곤 합니다.
제 주변에도 그런 분들이 있어서 어떤 점 때문에 어려운지 물어봤더니 어디서부터 어떻게 시작해야 될 지 모르겠다는 답변이 가장 많았습니다.
어쩌면 당연한 일인지도 모르겠습니다.
비교적 간단한 문법 체계를 갖고 있는 C 언어와 달리 C++ 은 굉장히 다양한 패러다임이 녹아있으며 방대한 스케일을 자랑하는 언어이기 때문입니다.
(물론 그렇다고 해서 C 언어가 가볍고 만만한 프로그래밍 언어라는 말은 아닙니다. 오히려 그 반대로 처음엔 쉬워보이지만 알면 알수록 어려워지는 언어입니다. C 언어는 역사가 긴 만큼 괴수 분들이 많이 서식하고 계십니다 :D)
그래서 우선은 C 언어와 C++ 두 언어가 어떤 부분이 다른지 간단하게 살펴보고 넘어가겠습니다.
Feature | C | C++ |
Paradigm | Procedural Language | Multi-Paradigm Language |
Approach | Top down | Bottom up |
Namespace | X | O |
Inheritance | X | O |
Overloading | X | O |
Polymorphism | X | O |
Template | X | O |
& reference | X | O |
struct constructor | X | O |
Memory allocation | malloc(), calloc(), realloc() | new |
Memory deallocation | free() | delete |
여러 차이점들이 있지만 눈여겨 볼 만한 부분은 C++ 의 Multi-paradigm 이라는 부분입니다.
절차지향 프로그래밍(Procedure-Oriented Programming)을 지원하는 C 언어와 달리 C++ 은 C 언어의 절차지향 프로그래밍을 그대로 승계한 동시에 객체지향 프로그래밍(Object-Oriented Programming)과 일반화 프로그래밍(Generic Programming)을 모두 지원하는 언어입니다.
C 언어의 문법을 그대로 계승했기 때문에 얼핏 보면 큰 차이가 없어 보여 쉽게 접근했는데,
코딩을 하면 할 수록 내가 알던 그 언어와 비슷하면서도 뭔가 잘못되고 있다는 느낌을 받게 되죠.
(내거인듯 내거아닌 내거같은 너...)
그렇게 느낄 수 밖에 없는 것이 객체지향 프로그래밍에 대한 개념을 모르는 상태에서는 C++에서 새롭게 등장하는 객체지향 문법들을 온전히 이해 할 수 없기 때문입니다.
게다가 처음보는 템플릿(template) 문법은 외계어에 가깝게 느껴집니다.
C++은 이처럼 여러 가지 패러다임을 지원하는 언어이니 만큼 제대로 사용하기 위해서 배워야 할 개념들이 많습니다.
그래서 배우면 배울 수록 겸손해지는 언어이기도 하죠.
(괜히 개발자들 사이에서 본인이 C++ 고수라고 하는 사람은 상종도 하지 말라는 말이 있는 게 아닙니다...)
그렇다면 C++을 어떻게 배우는 것이 좋을까요?
우선은 기존의 Top-down 방식으로 사고를 했던 것에서 벗어나 Bottom-up 방식의 객체지향 개념을 먼저 익히는 것이 좋습니다.
객체지향 개념을 이해하고 나서 문법적인 면에서는 클래스(class)와 접근 제한자(access modifier), new, delete 등의 문법을 숙지하셔야 합니다.
기존 C언어에서 malloc(), free() 대신 new, delete 를 사용하면 생성자(constructor)/소멸자(destructor)가 호출되는데 이러한 개념도 익혀두셔야 합니다.
간단한 프로그램을 객체지향적으로 설계하고 구현하는 것을 반복적으로 하다 보면 이제 Bottom-up 방식으로 사고 하는 것이 어느정도 익숙해지게 됩니다.
이제 슬슬 템플릿(template)을 배워보도록 합니다.
템플릿은 일반화 프로그래밍(generic programming) 패러다임으로 데이터 처리하는 로직을 데이터 타입에 비종속적으로 구현할 수 있게 해줍니다.
(컴파일 타임에 주어진 타입 별로 클래스들이 분화됩니다)
템플릿 문법을 직접 사용해보는 것도 좋지만 STL(Strandard Template Library)을 잘 다루는 것이 매우 중요하기 때문에 STL의 컨테이너(container)들을 활용하는 연습을 많이 하는 것이 좋습니다.
vector, list, map 등의 주요 컨테이너들을 능숙하게 다룰 수 있게 되면 특별한 경우를 제외하면 대부분의 로직을 구현할 수 있습니다.
여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.
-Peter의 우아한 프로그래밍
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 포인터(Pointer)와 레퍼런스(Reference : 참조자)의 차이 (16) | 2016.11.20 |
---|---|
[C++] map vs hash_map(unordered_map) (5) | 2015.08.20 |