안녕하세요! 기형쌤입니다.
날이 많이 흐려졌네요. 이제 눈이 오고 본격적으로 겨울이 시작되려나봅니다.
다들 감기 걸리지 않게 조심하셔요!
오늘 들고 온 이야기는 C++에 대한 이야기입니다.
C? C++? 둘이 뭐가 다른거지?
C랑 비슷한거 아닌가? C의 심화과정?
프로그래밍에 이제 막 입문하시려는 분들이라면 이런 생각들을 하실 수 있을 것 같습니다.
C++은 확실히 C를 부분집합으로서 가지고 있습니다.
다만 프로그래밍의 방향이 C와는 다릅니다.
C++은 객체 지향 및 일반화 프로그래밍과 같은
멀티 패러다임을 지원하는 프로그래밍 언어입니다.
C를 부분집합으로 가지고 있다는 말은
C언어의 문법과 기능을 모두 사용할 수 있기 때문이죠.
1979년에 C언어에서 직접적으로 파생된
C with Classes라는 이름의 언어로 시작되었다가, 1983년에 지금의 이름을 갖게 되었습니다.
C++의 특징
비아르네 스트로우스트루프 라는 사람이 C언어를 바탕으로 만든 언어입니다.
C 계열 언어에서 "++"라는 것은 1을 더해서 원래 변수에 대입하라는 뜻입니다.
C는 B 언어를 계승한다는 의미에서 C가 되었는데 왜 C++이 D가 아니라 C++이 된 이유는
C 언어를 거의 그대로 두고 필요한 만큼만 향상시켰기 때문입니다.
그렇기 때문에 C에서 가능한 것들이 C++에서도 가능한 것이지요.
C++는 프로그래머의 자유도가 높은 언어로써, 객체 지향이나 절차 지향 등의 설계에 제한을 두지 않습니다.
다만, 객체지향과 일반화 프로그래밍을 사실상 거의 주된 패턴으로 사용하기 때문에
객체지향 언어에 가깝게 여겨집니다.
한국에서 컴퓨터공학과를 다닐 경우 배울 수 있는 프로그래밍 언어 3개 중에 속합니다.
그러나 실상 C++11 이후의 모던 C++ 기능을 가르쳐주는 곳이 매우 드물어서
C++의 객체 지향만 조금 배울 수 있게 됩니다.
C++의 객체 지향은 다른 언어에 비해서 좀 더 복잡합니다.
제대로 다루기 위해서는 별도의 서적을 참고하는 것이 권장되며,
실제 프로젝트의 코드에 대해 탐구하고 경험해보는 것 또한 권장됩니다.
C와의 차이점?
그렇다면 C와는 어떤 차이가 있는걸까요?
C++의 개발이 C언어를 기반으로 이루어졌기 때문에
대부분의 C 프로그램은 C++ 컴파일러에서도 문제없이 컴파일됩니다.
초기의 C++은 C++의 언어로 프로그래밍을 한 코드를 C로 변환하고
그것을 C로 컴파일 하는 방식을 채택하여 사용했을 정도입니다.
물론 C를 기반으로 만들어졌기 때문에 그랬던거지만 말입니다.
다만, C가 항상 C++의 부분집합이었던 것은 아니라서 공통적인 부분에서 몇몇 차이점이 있으며,
순수 C 소스 코드를 C++로 컴파일 할 때 문제의 여지가 생길 가능성이 있습니다.
C++은 C와 프로그래밍 패러다임이 크게 다릅니다.
그래서 C로 작성된 프로그램에서 C++ 방식으로 코딩하려면
해당 코드에서 C++에 새로 도입된 것을 추가하는 게 아니라,
설계부터 시작해서 완전히 새로 해야 하는 경우가 많습니다.
이유는 C++의 객체지향이 다른 객체지향 언어들에 비해
이해하기가 조금 난해한 개념이기도 하고
C++의 객체지향은 C언어를 하위 요소로서 유지하면서
여러가지 문법적인 요소를 추가해야하기 때문에
신경쓸 부분이 많아집니다.
그래서 초심자분들의 경우 C와 C++은 다른 언어라고 생각하고 접근하셔서 공부하는게 좋습니다.
C++은 C에대한 이해와 객체지향 프로그래밍의 이해가 모두 필요하므로
C를 배우고, Java를 배우신 후 C++에 입문하시게 된다면
공부가 편하실거라 생각됩니다.
다만 C를 알고 있다고 C++를 쉽게 할 수 있는 것은 아닙니다.
두 언어는 추구하는 설계 구조가 상당히 다르기 때문이인데요,
C언어는 절차 지향이지만
C++는 절차 지향, 객체 지향, 일반화 프로그래밍, 함수형 프로그래밍을 모두 지원하는 언어입니다.
그래서 C언어를 알고 있는 사람이 C++ 초보자용 교재를 1권 끝내고 프로그램을 만들어 보라고 하면
대부분 C 방식에서 벗어나지 못하게 됩니다.
C++ 방식을 잘 활용하려면 STL까지 배운 다음
자료구조와 스트림, 템플릿 정도는 쓸 수 있어야 합니다.
C++이 C언어의 변형버전이라는 얘기는 어느정도는 맞는 이야기긴 합니다.
C++의 특징
C++는 객체 지향 프로그래밍을 지원하지만,
C++의 객체지향은 다른 객체지향 언어에서와는 성격이 조금 다릅니다.
대부분의 객체지향 언어에서는 많은 부분을 런타임에 처리하며 메모리를 자동으로 관리하는 반면,
C++에서는 최대한 많은 것을 컴파일 타임에 처리하는 것을 지향하며
메모리 등을 프로그래머가 직접 관리하게 하기 때문에 전반적인 클래스 디자인 자체가 상당한 차이를 보이게 됩니다.
Java 등의 다른 객체지향 언어에서와 같은 방식으로 C++ 클래스를 디자인하면
거의 틀림없이 컴파일이 제대로 안 되거나 메모리 문제가 발생하게 됩니다.
그래서 Java에서 막 C++로 입문한 학생이 프로그램을 만든다면 초반에는
메모리가 새는 프로그램을 만들게될 확률이 상당히 높습니다.
반면 C++ 스타일로 다른 객체지향 언어에서 프로그래밍을 하는 경우는
특별히 안 될 것은 없지만, 해당 언어의 스타일로 작성한 코드에 비해
시간이 많이 걸리고 너저분해 보이며 클래스 구조가 경직되어 수정하기 어려워집니다.
C++에서는 템플릿을 이용한 일반화 프로그래밍(Generic Programming)이 매우 폭넓게 사용됩니다.
특히 C++11을 시작으로 하는 모던 C++는 일반화 프로그래밍을 빼고 이야기하는 것이 불가능할 정도입니다.
일반화 프로그래밍의 결과물으로는 C++ 표준 라이브러리의 일부분으로 포함된 컨테이너, STL 같은 것들이 있으므로,
C++ 표준 라이브러리를 사용하는 순간 일반화 프로그래밍의 도움을 받는 것입니다.
따라서 '나는 C++을 사용하지만 템플릿을 이용한 일반화 프로그래밍은 어려우니까 패스하겠다'는 말은
애초에 성립하지 않는 말이지요.
중급 이하 개발자는 이런 결과물을 일상적으로 쉽게 가져다 쓰면 되고, 직접 만들어 쓸 필요는 없습니다.
이는 중급 개발자 정도로는 템플릿을 사용한 일반화 프로그래밍 기법을 정확하게 적용하는 것이 무척 까다롭고,
디버깅할 때 이해 불가능한 컴파일러 메세지를 받게 되는 경우가 많아서 발견된 오류를 수정하기도 어렵기 때문입니다.
이런 이유로 C++ 학습 초반에 템플릿 프로그래밍을 직접 하는 것을 피하고
기껏해야 컨테이너 클래스만 사용하는 습관이 들다 보니,
C++은 객체지향 언어이고 STL이라는 템플릿 라이브러리를 덤으로 쓸 수 있는 정도라는
오해가 널리 퍼진 것이라 생각이 됩니다.
하지만, 특수 목적의 컨테이너를 설계하거나 범용 라이브러리를 설계하는 수준의
고급 개발자가 되려면 템플릿을 사용한 일반화 프로그래밍을 능숙히 할 줄 알아야합니다.
C++을 배워보자
그렇다면 C++을 배우려면 어떻게 해야할까요?
사실 C++은 프로그래밍 언어들 중에서도 상당한 난이도를 자랑하는 언어입니다.
일단 기본적으로 배워야할 양이 많다는 점과 활용할 수 있는 기능들이나 특성들이 많은만큼
잘 활용하는 법 또한 어렵습니다.
사실 이전에 설명드렸던 C나 Java, Python같은 경우 입문을 하시는 경우라면
혼자 시작을 하셨다가 난이도가 올라가고, 배워야할 영역이 늘어나면서
학원을 찾는 경우가 많지만 C++같은 경우는
애초에 잘 배우시는게 중요하다고 생각합니다.
기초가 되어야하는 언어들을 배워야 하는 것도 있으니
하나를 알더라도 제대로 아는것이 중요합니다.
프로그래밍을 배우고싶고 전문가가 되어보고싶다면
하단의 이미지를 클릭해주세요. 상담은 무료이니
부담없이 말 걸어주시면 친절하게 원하시는 방향으로 이끌어드리겠습니다.
'IT 정보나눔!' 카테고리의 다른 글
R은 어떠한 언어일까? (0) | 2020.12.14 |
---|---|
빅 데이터 프로세싱(Big data processing)이란 무엇인가? (0) | 2020.12.12 |
C 언어는 무엇일까? (0) | 2020.12.10 |
Python(파이썬)은 무엇이고 어디서 배울 수 있나요? (0) | 2020.12.09 |
JAVA로 취업하는 사람이 많은 이유는 무엇일까? (1) | 2020.12.08 |