재미난 글을 봤습니다.
어디선가 요즘은 c/c++보다 자바가 빠르다는 말도 안되는 소리도 하던데....
결론은 용도가 모두 다르다! 라는것
아이폰이 나오면서 Object-c가 급상승하지만 요즘 하락세군요...... Object-c실컷 배웠는데...
암튼 저는 아직도 자바를 싫어하는 1人...
메모리는 내가 관리해야지.. 다른누군가가 관리해주는건 싫어 ㅠㅠ
잡설은 여기까지 하고 재밋게 읽어주세여
퍼온거니까 저한텐 머라하지 마세여 ㅋ
배경
Quora에서 흥미로운 질문을 보았다. C++를 배우는게 아직 가치가 있는지에 대한 질문이었다. 이러한 질문을 이제 시작하는 분들에게 가끔 받기도 한다. 횟수로 벌써 14년 넘게 C/C++ 개발 경력을 가지고 있는 나에겐 참으로 의미있는 질문이었다.
Quora에 가보면 알겠지만 대부분 C++를 공부하는 것에 대해 긍정적인 것을 알 수 있다. 나도 C/C++의 골수팬이지만 지금은 C#, Javascript, Java에 빠져있다. 이밖에 다른 언어를 사용하는 것이 재밌고 흥미롭다. 예전에 나는 자바 개발자를 우습게 봤고 심지어는 자바라는 개발언어 자체가 경멸의 대상이었다.
이제는 그러한 생각들이 어리석었다는 것을 안다. 이와 비슷한 주제로 "어떤 개발언어를 공부할까?"라는 글을 남기기도 했다. 이번에는 C/C++이라는 언어 자체에 대해 여러가지 생각을 정리해 보고자 한다.
C/C++의 위기론
C/C++은 1990년 중순 자바가 등장하고 선풍적인 인기를 끌면서 모두들 망할 것이라 생각했다. MS 또한 자바를 베껴서 C#를 만든 사실만 보더라도 그 매력이 얼마나 대단했는지 알 수 있다. 일단 자바라는 개발언어 자체가 C++에 반감을 가지고 태어난 언어였다. 그때 당시 자바 개발자들은 C++은 진정한 OO가 아니라고 주장하기도 했다.
그 이유 중 하나는 클래스 관리가 너무 복잡했기 때문이었다. 자바는 단순히 폴더로 정리하고 import만 시켜주면 클래스에 바로 접근 할 수 있었다. 패키징도 간단했다.
반면 C++은 그렇게 단순하지 않았다. 빠르지만 멍청한 컴파일러 덕분에 include는 세심하게 순서를 맞춰줘야만 했다. 폴더의 위치가 같을 수도 있고 다를 수도 있었기 때문에 파일 관리를 따로 잘 해줘야 했다. 다른 라이브러리와의 충돌도 빈번했기 때문에 전체 라이브러리에 대한 관리도 필수적이었다. C의 기능을 그대로 가져왔기 때문에 네이밍 폴루션에 대한 주의도 요했다. 결국 설계 시에 개발자 역량이 너무도 중요했다.
또 자바 개발자들이 C/C++에 대해 가장 불만스러워 했던 것 중 하나는 메모리 관리 문제였다. 메모리의 생성이 스택과 힙에 따라 다르다는 사실부터 골치아팠다. "."과 "->"로 구분해서 접근하는 것도 짜증났다. (대부분의 개발언어는 "."만 사용한다.) 툭하면 잘못된 메모리 접근이라며 프로그램이 죽어버린다. 여차하면 메모리 릭이 발생하여 전체 시스템을 먹통으로 만들고 대충 개발하다간 취약점도 넘쳐나서 보안 문제도 많이 발생시킨다.
"실수하는게 인간인데 이렇게 골치아파서야 제대로 된 비지니스 로직을 세울수나 있겠는가?"라는 것이 C/C++를 싫어하는 분들의 생각이었다. 자바는 이런 문제에 대해선 확실히 강점을 가지고 있었다. 메모리 하나만 보더라도 개발자가 관리를 하지 않는다는 사실이 너무나도 매력적이었다. 거기다 플랫폼 독립적이라는 덤까지 주니 많은 C/C++ 개발자들이 자바로 넘어가기 시작했다.
OS 점유율 90% 이상을 잡고 있던 MS의 태도는 어떠했을까? Visual Studio.NET이 나오면서 C++ 개발자들에게 비주얼 베이직과 같은 방식으로 개발하라고 강요했다. Visual Studio 2008까지 C++ 개발자의 반 이상이, 아니 대부분이 Visual C++ 6.0를 사용하고 있었으니 MS가 C++ 개발자들을 얼마나 홀대 하고 있었는지 알만하다. 대표적인 기능이 클래스 위저드 인데 이 기능이 Visual Studio.NET 부터 사라진 것이다.
그때 당시 2000년도쯤 MSDN 세미나도 갔었는데, C#이나 자바가 개발언어를 주도 할 것이고 C/C++은 이제 사라질 것이라 전망 했었다.
현재의 C/C++의 위치
지금의 C/C++은 어떤 위치에 있을까? 그 전문가들의 말처럼 C/C++은 망하고 있을까? TIOBE(2015년 2월)에서 발표한 내용을 살펴보자.
오히려 자바(15.345%)가 뚜렷한 하향세를 보이고 있는 것을 알 수 있다. C(16.488%)는 꾸준히 지속되고 있고 C++(6.612%)도 한풀 꺽였지만 Objective-C(6.024%)를 꺽고 3위로 도약한 모습이다. 참고로 C#(5.738%)은 5위고 자바스크립트(3.514%)는 6위다. C/C++를 하나로 묶으면 25%에 육박하는 압도적인 점유율을 보인다.
거기다 "The Programming Languages Beacon"의에 따르면 2013년도 소프트웨어 제품 기준으로 MS Windows, Linux, Apple MAXOS, Google Chrome OS, Apple iPhone OS, Google Android, RIM BlackBerry OS 4.x, Amazon Kindle OS, Gnome, Google Desktop Search, Microsoft Office, Adobe Systems Acrobat Reader, Evernote, Oracle Database, MySQL, IBM DB2, Microsoft SQL Server, MS Internet Explorer, Safari, Google Chrome, Java Virtual Machine 등등등이 모두 C 이나 C++로 개발되었다. 아마 현재 시점에는 조금 달라진 소프트웨어도 있겠지만 대부분은 그대로 가고 있는 것으로 안다.
C++를 내놓은 자식처럼했던 MS도 Visual Studio 2010부터 C++ 개발자를 끌어모으기 위해 클래스 위저드 기능을 넣었다. 거기다 구글도 핵심 소프트웨어들은 모두 C/C++를 사용하고 있다. 국내의 온라인 게임서버도 대부분은 C/C++인 것으로 안다.
C++의 강점
지금 수백개의 개발언어가 나와있다. 현재 응용 소프트웨어를 C++로 개발하는 경우는 이제 몇 남지 않았다. 윈도우 응용은 MFC에서 C#으로 많이 개발하고 있으며, iOS는 Objective-C나 Swift로 대부분 개발할 것으로 보인다. (Objective-C++를 사용하면 C++로 많은 부분을 개발할 수 있긴 하다.) 웹앱 같은 경우에는 프론트엔드든 백엔드든 간에 C/C++로 개발하는 경우는 정말 찾기 힘들다. 주요 모듈 단위로 C/C++을 사용하기도 한다.
불편하고 어렵고 리스크가 큰 C/C++은 도대체 왜 주요 소프트웨어의 개발언어로 채용될까. C/C++의 강점을 정리하면 다음과 같다.
-
높은 성능 속도: 모두가 첫번째로 꼽는 이유다. 컴파일 시에 CPU에 해당하는 최적의 바이너리를 생산해낸다. 자바나 C#의 성능 속도가 C/C++를 거의 근접했다는 말은 사실이기도 하지만 뛰어 넘을 수는 없다. 물론, 개발자의 역량에 따라 자바나 C# 보다도 구린 결과를 내놓기도 한다.
-
컴퓨터 구조와의 밀접한 관계: C/C++은 컴퓨터 구조와 밀접한 관계를 가졌으며 이러한 자원을 활용한 개발이 가능하다. 즉, 하드웨어의 성능을 끌어올릴 수 있는 개발이 가능하다. 메모리를 직접 관리한다는 것이 단점일 수도 있지만 오히려 장점이 될 수도 있다는 의미다. 또한 멀티코어에 맞춰 다양한 병렬처리 기법을 직접 제어하기도 수월하다.
-
OS 개발언어: 결국 소프트웨어는 운영체제 위에서 동작한다. 그렇다면 운영체제가 개발된 언어가 가장 궁합이 잘 맞는다는 의미이기도 하다. 대부분의 운영체제는 모두 C/C++로 개발되었다.
정리를 해놓고 보니까 모두 같은 말처럼 느껴진다. 결국 성능 속도다. 이젠 안전성 좋고 성능 좋은 boost와 같은 C/C++ 오픈소스가 지천에 널렸다. QT와 같은 UI 프레임워크를 사용하면 플랫폼 독립적인 개발도 가능하다. 이제 위험한 코드를 양산할 확률이 예전만큼 크지 않다. 그리고 어떤 코드가 위험한지는 CWE(Common Weakness Enumeration) 같은 곳을 잘 참조하면 많이 피해갈 수 있다. 이에 따라 정적/동적 분석툴들도 다양하게 배포되고 있다.
거기다 C/C++은 아직도 진화하고 있다. 불편했던 메모리 관리 문제나 다른 언어들의 좋은 장점들을 흡수하여 발표하고 있다. 현재 C는 C11, C++은 C++ 11까지 발표된 것으로 안다. (참고로 C와 C++은 같은 워킹 그룹이 아니다. 따로 발표하고 있으며 다른 언어로 인지하는 것이 옳다.)
C/C++ 를 통해 얻을 수 있는 능력
C/C++은 혼자 공부하기에는 분명 어려운 개발언어다. 대부분 "포인터"에서 많이 좌절하곤 한다. 결국 메모리에 대한 개념이 너무 어렵다. 그 이유는 운영체제에 대한 기반 지식 없이 무턱대고 C/C++를 공부하려하기 때문이다. C 언어는 유닉스라는 운영체제를 최초로 탄생시킨 개발언어다. (MAC OS X와 iOS 기반이 유닉스다.) 그만큼 운영체제와 매우 밀접한 관련이 있다.
그래서 C/C++ 입문자를 위해 다음과 같은 글도 남겼다.
결국 C/C++를 제대로 공부하면 메모리 관리, 파일시스템, 네트워킹과 같은 컴퓨터 구조에 대한 깊은 이해가 가능하다. 물론 이러한 지식을 얻기까지 꾸준한 정진이 필요한 건 사실이다. 경력이 10년이 넘어도 제대로 된 지식을 쌓지 못한 개발자들도 많이 봐왔기 때문이다. 이렇게 말하는 나도 부족함을 느낀다.
개발자가 되려면 무조건 C/C++를 공부해야 할까?
배경에서 언급했던 이 질문을 대답해 보라면 나는 "아니오"다. 모든 개발자가 C/C++를 할 필요는 없다고 생각한다. 불과 몇년전만 하더라도 개발자가 되려면 반드시 C/C++를 공부해야 한다고 생각했다. 나 자신이 이를 통해 얻은 것이 너무도 많았기 때문이다. 그리고 C/C++를 모르면 프로그래밍에 대한 깊은 이해가 불가능하다고 생각했다.
하지만 이제는 너무도 다양한 개발 분야가 존재한다는 사실을 깨달았다. 예를들어 오로지 프론트 앤드 개발자로 남고 싶다면 C/C++를 학습하는 것이 얼마나 도움이 될지 잘 모르겠다. 이 경우는 비지니스 로직에 세우는 능력이 더 중요하지 않을까 싶다.
굳이 비교하자면 C/C++를 학습한다는 의미는 운전면허 1종을 따는 것과 비슷하다. 1종 면허가 있으면 2종 차량을 운전할 자격이 있다. 바로 할 수는 없겠지만 1종이 있다면 사고나지 않을 정도로 그 만큼 쉽게 배울 수 있다는 의미다.
반면 2종 보통인 경우 7년 무사고면 1종 면허로 갱신이 가능하다. 즉, 7년동안 2종에 충실하면 그제서야 1종을 몰더라도 쉽게 운전할 수 있다는 의미다. (하지만 2종 오토라면 1종 시험을 다시 봐야 한다.)
C/C++를 제대로 사용하고 있는 개발자라면 자바라는 개발언어를 배우는 것이 그렇게 어렵지 않다. 다른 언어도 마찬가지다. Objective-C나 자바스크립트같이 패러다임이 달라진 것은 조금 공부를 해야겠지만 문법이나 흐름자체에서 헤매는 경우는 거의 없다. 내 경험상 C/C++ 경력은 다른 개발언어를 이해할 때 정말 큰 도움이 된다.
반면 자바 개발자라면 C/C++를 학습한다는 것이 만만한 일이 아닐 것이다. 2종 보통 면허를 7년 무사고로 1종으로 가는 것처럼 자바에 능통하면 C/C++를 학습하는것이 조금은 쉬워질지도 모르겠다. 하지만 아마도 모든 것이 부조리해 보이지 않을까 싶다.
C/C++은 다른 개발언어에 비해 확실히 진입장벽이 높다. 하지만 이는 경쟁력이 있다는 의미이기도 하다. 나에게 쉬운 것은 남에게도 쉽다는 사실을 잊지 말아야 한다. 영어를 잘하는 사람을 대우해주는 이유는 모두들 수많은 시간을 투자했지만 능통하기가 어렵다는 사실을 우리는 알고 있다.
C/C++을 모든 개발자가 학습할 필요는 없다. 자신이 가야하는 길에 프론트 앤드 개발자처럼 지금 상황에서도 전혀 사용할 일이 없다면 정말로 필요없다고 생각한다. 다만 코어 개발자를 노리거나 경쟁력을 원한다면 C/C++도 자신의 학습 로드맵에 넣어야 하지 않을까 생각해본다.