스트로우 스트롭 할배의 천재성의 산물이 C++이다.

근데 현대 프로그래밍 언어의 많은 핵심 개념들 알고 보면 이 할배가 정립시키거나 만들었다.
현대의 oop는 거의 C++의 형태를 답습하고 있고 try-catch 형식의 exception handling도 거의 c++의 것에서 가져온 것이다.

그러다보니 현대 프로그래밍 언어의 새로운 파라다임 상당수가 C++에서 먼저 나왔던 것이다.


그 C++에서 파생된 대표적인 언어가 JAVA, C#, ...

JAVA는 원래 간단한 기기의 인베디드 시스템에서도 OOP를 해보자는 개념 하에 만들어진 언어다. 만들 당시에는 인터넷에서 이렇게 까지 사용될지는 모르고 개발되었다.

인베디드 시스템에 맞춰 C++에 비해 더 작고 빠른 코드를 만들어내는 것이 목표였고 그러다 보니 C++에서 크고 느린 실행 파일을 만들어내는 복잡한 문법들(대표적으로 다중 상속) 같은 건 빼고 메모리 관련 처리도 힙 메모리와 로컬 메모리 구분이 별로 없었던 인베디드에 적합하게 new하나로 최소화한 채로 그냥 개발되었다.
근데 정작 인베디드에서는 여전히 C가 쓰이고 JAVA는 주로 웹개발 언어 그것도 virtual machine 위에서 동작하는 언어로 널리 사용되고 있다.

근데 초기 인터넷 환경에서는 복잡한 프로그래밍이 불필요했기 때문에 JAVA가 딱이었고...
여기에 프로그래밍 언어가 미래라고 생각했던 동적 할당이 필요 없는 언어를 구현했다.
동적 할당은 C와 C++ 같은 기존의 언어에서 가장 악명 높은 골치거리였기 때문에 일명 가비지 콜렉션을 통해서 더이상 메모리에 신경 쓸 필요 없이 프로그래밍 할 수 있을 것이란 꿈을 담아서 말이다.

근데 여기에는 전제 조건이 있었다. 하드웨어가 어마어마하게 발전 중이므로 곧 가비지 콜렉션 따위의 부하는 큰 문제가 되지 않을 만큼 하드웨어 성능이 엄청나 질 것이라는 가정이었다.
실제로 하드웨어 성능은 놀랍게 성장하긴 했지만 가지비 콜렉션이 꿈꾸던 성능이 문제되지 않는 상황은 점점 멀어져만 갔다.
하드웨어 성능의 발전은 10년전 쯤부터 사실상 급제동이 걸렸고 CPU 클럭은 거의 늘어나지 않고 코어 수만 늘리기 시작했던 거다.
이건 JAVA의 가정을 빗나가는 상황이었다.
하지만 그에 반해 메모리 사용량은 지속적으로 기하급수적 증가를 했다.
메모리 사용량이 CPU 클럭 속도를 뛰어 넘은 지는 옛날이 됐고 이 의미는 동일한 CPU로 더 많은 메모리를 처리해야 한다는 것이었고 이는 더 많은 가비지를 만들어내고 관리해야 한다는 것을 의미했다. 한마디로 JAVA는 ㅈ된거다.
완전 ㅈ된 JAVA는 새로운 GC 알고리즘을 ㅈ나게 개선해서 stop the world라도 어떻게 좀 피해보자고 다양한 연구가 되었고
최근에 멀티 코어에 적응해보자고 g1gc가 등장했지만 GC는 여전히 골치거리가 되고 있다.
JAVA로 대규모 서버를 돌리는데는 엄청난 비효율이 따른다. 커지면 커질수록 그만큼 더 많은 메모리를 써야 하고 그럼 더 많은 GC부담이 늘어나 비효율이 증대되기 때문에 고부하 시스템이나 대용량 처리 시스템 용으로는 적합하지 않다. 애초에 그러라고 만든 물건이 아니란 의미다.
그니까 애초에 맞지도 않는 곳에 써 놓고 왜 GC가 이렇게 많이 늘어나나요 GC에 뭔가 버그가 있는 것 같아요 분석해 봅시다 이ㅈㄹ 하면서 찾는 게 멍청한 거다.
성능은 큰 문제가 아니라고 생각했기에 C++재끼고  JAVA로 만든 거 아니었나??

그래서 세계 유수의 대규모 인터넷 서비스 회사... 구글, 페이스북, MS 등등... 대규모 서비스가 필요한 시스템의 코어는 거의 대부분 C++로 작성이 되고 그 위에 빠른 비지니스적 대응이 필요한 로직을 JAVA나 스크립팅 성격의 언어로 개발한다. 또 필요에 딸 다양한 언어들도 만들어내고 공개도 한다.
하지만 대한민국은? 모조리 자바다. 대형이고 나발이고 다 필요 없고 닥치고 자바다.
네이버 카카오 묻지도 따지지 않고 코어 시스템도 모조리 JAVA로 만들어지고 있다.
그니까 JAVA가 대한민국 인터넷 서비스를 망치고 있다는 말까지 나오는 상황이다.
그럼 이런 대형 회사가 지금이라도 C++로 코어를 개발할 능력이 있냐?
단언컨데 없다. 현실이 그렇다. 알아도 이젠 바꾸기가 힘들다. 워낙에 개발 조직이 JAVA로 공고하게 굳어 있기 때문에 바꾸기는 늦었다는 것이다.
인프라의 코어를 JAVA로 할 때보다 C++로 하면 10배에서 100배 이상 효율이 차이가 나기도 한다. 근데도 이지롤을 하고 있는 거다.

하여튼 GC로 ㅈ된 JAVA와 반대로.... C++은 스트로우 스트럽 할배의 큰 그림에 따랐고...
소멸자의 역할을 끝까지 포기하지 않았고 그 결과... modern c++에서는 일명 RAII라는 기법이 표준화되며 C++도 더 이상 동적 메모리 해체를 고민하는 시대는 지나간 것이다.
즉 C++은 메모리 동적 할당의 고민은 사라지면서 태생적으로 ㅈㄴ 빠르고 게다가 필요하면 포인터의 이점까지 누릴 수 있는 언어가 되어 가고 있다는 것이다.

C++은 10여년간 시대에 뒤쳐진 죽어가는 언어였다.

99년에 마지막 표준 안의 개정 이후에 무려 10년이 넘는 동안 표준 안을 개정하지 못하는 공백기가 있었다.
엿 같은 C++위원들이 표준 안 합의를 못하고 계속 표준 안 제정을 연기하고 연기 하다 보니 무려 10년이 넘는 공백기 동안 아무런 업데이트를 하지 못했던 거다.
그러니 최신 프로그래밍 언어의 트렌드는 따라가지 못했고 죽어갔다.

그러다가 각성한 C++표준 위원회에서 모든 안이 다 합의 될 때까지 계속 연기할 것이 아니라 그냥 때가 되면 그때까지 합의한 안 만으로 발표를 하자고 방침을 바꾸게 되면서 드디어 2011년에 C++11의 개정이 발표가 되었다.
일명 C++11 이후 모던 C++로 최신 언어의 모든 트렌드들이 반영되기 시작했다.
앞에서 말한 RAII는 기본이고 하드웨어와 oS 변화에 따라 추가된 thread 관련 기능이나 비동기 처리 관련 기능들, 시간 관련 기능, 파일 i/o 등등이 모두 최신 언어 스타일로 개정안들이 나오면서 갑자기 어마 무시하게 발전해 나가고 있는 상황인 거다.

C++ SFINAE 개념을 사용해서 template meta programming이란 개념을 대폭 발전시키고
함수형 프로그래밍 개념도 받아 들이고...
기타 온갖 개념들의 짬뽕에 나서기 시작했다.
온갖 다양한 프로그래밍 언어적 실험들이 활발히 논의되며 엄청난 점프를 했다는 것이다.

덕분에 문법은 괴랄하게 복잡해지긴 했지만 그만큼 할 수 있는 것도 엄청나게 늘어났다.
기존에 실행 시간에 했어야 했던 일을 C++은 컴파일 시간에 할 수 있도록 하는 많은 문법들이 추가되었다.
C++11이후에도 C++14, C++17, C++20이 계속적으로 나오면서 큰 발전을 이뤘지만 지금은 발전이 다시 더뎌지고 있는 상황이다.

C++은 세계 거의 모든 유수 it회사의 개발자가 개정에 관여하고 있을 만큼 중요하고 관심이 많은 언어다.
C++11이 발표되며 다시 사용률이 늘고 나고 있는 추세기도 하다.
그에 반해 JAVA는 세계적으로는 사용률이 지속적으로 하락 하고 있는 상황이다.
JAVA는 대체 언어들도 많이 나온 상황인데다 어느 정도 언어적 한계에 다다랐으니까...

C는 대한민국에서도 인베디드 뿐만 아니라 많은 영역에서 사용하고 있지만
C++은 사실 게임 업계 외에는 잘 쓰고 있지 않아서 많이 사용되고 있지 않은 상황이다.

왜 이럴까? 이유는 간단하다.
C++은 주로 세계적으로 최상급 소프트웨어 회사들이 가장 많이 쓰는 언어다.
Microsoft windows, linux, oracle, sql sever, mysql, adobe photoshop 등등 우리가 쓰는 소프트웨어 대다수는 C++로 만들어지고 있다.
하지만 이런 걸 만드는 회사는 대한민국에 사실 단 하나도 없는 거나 마찬가지다.
있어도 아주 영세한 업체들 뿐이다.

대한민국에서 흥 하는 프로그래밍 회사는 순수 프로그래밍 회사가 아니라 '네카라쿠배'로 상징 되는 인터넷 서비스 회사들과 개발 하청 업체인 SI업체들 뿐이다.
이런 업체들이 대한민국 소프트웨어 산업의 대부분을 차지하고 있으니 당연히 JAVA 개발자들만이 판치는 세상이 된 거고 C++따위는 왜 쓰나요? 이런 말이 나오는 거다.
게임업계에서나 좀 있을까 일반 소프트웨어 업체에서는 제대로 된 C++ 개발자를 구하기도 쉽지 않다.