오늘날 기술 환경에서 C++가 여전히 강력하고 관련성 높은 프로그래밍 언어인 이유.
읽는 데 12분
2025년 9월 9일 화요일
오늘날 기술 환경에서 C++가 여전히 강력하고 관련성 높은 프로그래밍 언어인 이유.
C++ 코딩 부트캠프
컴퓨터 프로그래밍 도구
C++는 종종 복잡하고, 학습 곡선이 가파르며, 무엇보다도 개발자가 발을 쏘는 정도가 아니라 다리를 날려버릴 수도 있게 만든다는 이유로 비판받아 왔습니다. 하지만 이런 비판이 꼼꼼한 검증 앞에서도 유효할까요?
C++ 코딩 부트캠프
자, 이 글에서는 C++에 대한 흔한 비판들을 다뤄 보고, 그 강점과 약점에 대한 균형 잡힌 관점을 제시해 보려 합니다.
C++가 복잡한 언어라는 건 사실입니다. 기능과 능력이 매우 방대하죠. C++에서 뭔가를 하려면 보통 한 가지를 달성하는 데도 수많은 방법이 있고, 각각의 방법에 고유한 트레이드오프와 함의가 있습니다. 그렇다면 개발자인 여러분은 자신에게 가장 적합한 접근법이 무엇인지 어떻게 알 수 있을까요? 이런 결정을 내리려면 언어에 대해 깊이 이해해야만 한다고요?
C++ 코딩 부트캠프
꼭 그렇진 않습니다… 물론, 잘 알수록 도움이 되긴 하지만 필수 요건은 아닙니다. 성급한 최적화는 모든 악의 근원입니다. C++에서도 언어의 복잡한 기능들을 전혀 신경 쓰지 않고도 충분히 좋은 코드를 작성할 수 있습니다. 템플릿이나 연산자 오버로딩 같은 고급 기능을 쓰지 않고도 C++로 단순하고 읽기 쉽고 유지보수 가능한 코드를 얼마든지 쓸 수 있습니다.
어떤 언어로 무엇을 하든 가장 효율적이고 정석적인 접근법을 써야 한다는 생각이 있죠. 파이썬에는 파이썬다운 방식이 있고, 자바에도, C#에도, 고에도 있습니다. 심지어 브라우저에 HTML을 칠하는 것 같은 일조차 매 몇 년마다 다시 발명되고, 끝없이 논쟁됩니다. 하지만 대부분의 경우 무조건적으로 “정답”인 방법은 없습니다. 신성시되는 “최선의 방식”은 대개 개인 혹은 팀의 선호 문제일 뿐입니다. 코드를 “최선”이고 “정확한” 방식으로만 쓰면 유지보수 걱정이 사라진다는 생각은 틀렸습니다.
C++ 코딩 부트캠프
컴퓨터 프로그래밍 도구
“최선”의 접근법을 쓰겠다고 너무 걱정하지 마세요. 대신 읽고 이해하기 쉬운 코드를 쓰는 데 집중하세요. 그러면 됩니다.
C++는 정말 오래되었습니다. 1985년에 나왔죠. 감을 잡기 위해 비교하자면, 그건 윈도우 1.0이 나오기 4년 전이고, 리눅스 첫 버전이 나오기 6년 전입니다. 심지어 마지막 8비트 컴퓨터가 출시되던 시절이기도 합니다. 그러니 어떤 기준으로 봐도 C++는 꽤 오래된 언어입니다. 그렇다고 구식일까요?
C++ 코딩 부트캠프
천만에요. 1985년 이후로 C++가 손도 안 대고 방치되어 있었던 게 아닙니다. C++는 40년 넘게 활발히 발전해 왔고, 새로운 기능과 능력이 꾸준히 추가되었습니다. 가장 최근의 C++ 표준인 C++20은 2020년에 발표되어 다양한 기능과 개선을 도입했습니다. C++23 또한 특히 표준 라이브러리와 constexpr 기능 면에서 큰 향상을 이뤘습니다. 특히 concepts, ranges, coroutines가 확장되면서 현대적 프로그래밍 패러다임이 C++에 더 넓게 도입되어, 지금까지 그 어느 때보다 강력하고 표현력 있는 언어가 되었습니다.
“하지만 데이브, 우리가 구식이라고 하는 건 다른 언어들이 C++를 앞지르면서 더 좋은 개발자 경험을 제공한다는 뜻이에요.”
C++ 코딩 부트캠프
컴퓨터 프로그래밍 도구
개인 취향의 문제겠죠. C++는 여전히 가장 널리 사용되는 언어 중 하나이며, 방대한 라이브러리와 도구 생태계를 갖고 있습니다. 게임 개발, 고성능 컴퓨팅, 임베디드 시스템 등 정말 폭넓은 분야에서 쓰입니다. 전 세계에서 가장 인기 있고 널리 사용되는 소프트웨어들 중 상당수가 C++로 작성되어 있습니다.
제 생각에 C++를 구식이라고 하기는 어렵습니다. 그런 주장을 하려면 “구식”의 정의를 꽤 무리하게 비틀어야 할 겁니다.
드디어 큰 주제에 왔네요. 많은 사람들이 C++을 대체하거나 대체해야 한다고 주장하는 “메모리 안전” 언어인 Rust와의 비교도 하겠습니다.
C++ 코딩 부트캠프
컴퓨터 프로그래밍 도구
사실, 핵심부터 짚고 가죠.
수많은 회사가 C++ 코드베이스를 Rust로 갈아타면서 보안이 향상되었거나, 보고되는 버그나 메모리 누수가 줄었다고 밝힌 바 있습니다.
그게 Rust 덕분일까요? 어느 정도는 맞다고 봅니다. 하지만 가장 큰 요인은, 기존 코드베이스를 갈아엎고 재작성하면 원래 코드베이스보다 결과가 좋아지기 마련이라는 점이라고 생각합니다.
소프트웨어 개발 키트
C++ 코딩 부트캠프
코드베이스를 다시 쓰면 아키텍처를 재고하고 재설계할 기회를 얻게 되고, 버그를 고치며 전반적 코드 품질을 끌어올릴 수 있습니다. 이전 구현에서 배운 교훈, 발견되어 수정된 문제들, 이미 알고 있는 이슈들을 모두 활용할 수 있죠. 기존 코드베이스에서 고치기엔 너무 고통스러웠던 골칫거리들도 새 코드에선 그냥 고쳐버릴 수 있습니다.
상상해 보세요. 작은 창고를 처음 지었을 땐 조금 흔들렸고, 제대로 된 목재 이음법도 몰라 구조적 강성이나 누수 같은 문제가 있었습니다. 몇 년 뒤 새로 지을 땐, 처음에 했던 실수를 다 알고 있으니 더 단단하고 방수도 잘 되게 만듭니다. 이 과정에서 재료도 바꾸죠. 예컨대 예전엔 단풍나무를 썼다면 이번엔 참나무로 바꿉니다. 그렇다면 새 창고가 더 좋아진 이유가 오직 단풍나무 대신 참나무를 썼기 때문이라고 말하는 게 맞을까요? 아니면 그건 전체 개선의 아주 작은 부분일까요?
기업들이 “C++를 Rust로 갈아탔더니 더 메모리 안전해졌다”고 말할 때, 제 느낌이 딱 그렇습니다. Rust라서 그런 게 아니라, 코드베이스를 다시 생각하고 다시 설계하며 이전 구현에서 배운 교훈들을 적용했기 때문입니다.
C++ 코딩 부트캠프
맞습니다. 자신이 무엇을 하는지 모르면 C++는 위험할 수 있습니다. 하지만 한 가지 기억하세요. 무엇을 하는지 모르면 모든 언어가 위험합니다. Rust에서도 안전하지 않은 코드를 쓸 수 있고, 파이썬에서도, 자바스크립트에서도 마찬가지입니다.
메모리 안전은 안전의 한 측면일 뿐입니다. 메모리 안전한 언어에서도 여전히 안전하지 않은 코드를 작성할 수 있습니다. Rust를 쓴다고 해서 애플리케이션이 자동으로 안전해지는 건 아닙니다. 다만 메모리 누수나 메모리 안전 이슈를 만들기가 훨씬 어려워질 뿐이죠.
이 맥락에서 “unsafe”라는 용어는 너무 포괄적이고 모호합니다. 마치 모든 걸 싸잡아 부르는 마케팅 스피크처럼 들립니다.
C++ 코딩 부트캠프
컴퓨터 프로그래밍 도구
있습니다. 심지어 메모리 안전하게 만들 수도 있어요. 스마트 포인터, 정적 분석 도구, Sanitizer(메모리/주소 검사기) 같은 다양한 라이브러리와 도구가 C++ 코드를 더 안전하게 만드는 데 도움을 줍니다. 심지어 정말 원한다면 C++에 가비지 컬렉터를 붙일 수도 있습니다(제발 그러진 마세요).
하지만 가장 쉽고 직관적인 방법은 스마트 포인터를 배우고 필요한 곳에 사용하는 것입니다. 스마트 포인터는 개발자가 직접 new/delete로 메모리를 할당/해제하지 않고도 메모리를 관리하는 방법입니다. 메모리 관리를 자동으로 처리해 주기 때문에 메모리 누수나 댕글링 포인터가 훨씬 생기기 어려워집니다. 이것이 애초에 C++에 대한 가장 큰 비판 지점이기도 합니다.
그렇게 쓰지 않으면 됩니다. C++는 다중 패러다임 언어입니다. 절차적, 객체지향, 함수형, 혹은 이들을 섞어서도 코드를 작성할 수 있습니다. 원한다면 C++로도 단순하고 읽기 쉬운 코드를 충분히 쓸 수 있습니다. 물론 마음만 먹으면 복잡하고 읽기 어려운 코드도 쓸 수 있죠. 결국 개인 혹은 팀의 선호 문제입니다.
제가 C++에서 따르는 경험칙은 이것입니다. 가능하면 최대한 C처럼 보이게 쓰세요. 정말 필요하지 않다면 언어의 고급 기능을 남용하지 마세요. 스마트 포인터를 쓰고, 생 포인터(raw pointer)는 피하고, 가능하면 표준 라이브러리를 사용하세요.
C처럼 C++를 사용하면서, 정말 필요할 때에만 복잡성을 도입해도 할 수 있는 일은 정말 많습니다.
C++는 C의 상위 집합입니다. C 코드를 C++에서 그대로 써도 잘 동작합니다. C++는 C에 많은 기능과 능력을 보태줍니다. C로 시작하면 C에 묶입니다. 그게 많은 경우엔 괜찮지만, C++는 필요할 때 언어의 더 발전된 기능들을 선택적으로 쓸 수 있는 옵션을 제공합니다. C로 시작한 뒤 필요에 따라 C++ 기능을 점진적으로 도입할 수 있죠. 원하지 않는다면 C++의 모든 기능을 다 쓸 필요는 없습니다.
창고 비유로 다시 돌아가면, 목재로 창고를 지었다고 해서 나중에 필요할 때 금속 지붕을 얹지 못하는 건 아닙니다. 처음부터 전부 금속으로 지을 필요는 없잖아요.
C++는 40여 년에 걸쳐 쌓인 방대한 생태계를 가지고 있어, 사용할 수 있는 라이브러리와 도구가 매우 많습니다. 그래서 특정 작업에 어떤 것을 써야 할지 헷갈릴 수 있습니다. 하지만 이건 C++만의 문제가 아니라 모든 언어가 겪는 문제입니다.
간단한 경험칙은, 가능한 한 표준 라이브러리를 쓰라는 것입니다. 잘 관리되고, 유용한 기능이 많습니다. 네트워킹이나 GUI 같은 영역은 널리 쓰이고 잘 관리되는 유명 라이브러리들이 여럿 있습니다. 약간의 조사를 통해 여러분의 사용 사례에 가장 잘 맞는 라이브러리를 고르세요.
전염병 피하듯 Boost를 피하세요. Boost는 C++ 커뮤니티에서 널리 쓰이는 대규모 라이브러리 모음입니다. 하지만 Boost에 포함된 많은 라이브러리는 구식이거나 더 이상 유지보수되지 않습니다. 또한 대체로 복잡하고 사용하기 어렵습니다. 가능하다면 Boost 사용은 피하세요.
Boost가 제공하는 특정 기능이 꼭 필요한 거대한 복잡한 애플리케이션이 아니라면, 더 현대적이고 사용하기 쉬운 다른 라이브러리를 쓰는 편이 낫습니다. 진짜 필요하지 않다면 Boost가 가져오는 성능 오버헤드와 바이너리 크기 비대화를 애플리케이션에 더하지 마세요.
프로그래밍은 초보자에게 좋은 선택이 아닙니다. 목공도, 자동차 정비도 초보자에게 좋은 선택이 아닙니다. 프로그래밍은 어렵고, 시간과 노력이 듭니다. 모든 것이 그렇듯이요. 초보자에게 정말로 좋은 “범용” 언어란 없습니다. 모든 것에는 트레이드오프가 있습니다.
사실, 시스템 프로그래밍이나 게임 개발 같은 분야로 들어가고 싶다면 파이썬이나 자바스크립트로 시작해도 큰 도움이 되지 않습니다. 결국 C나 C++를 배우게 될 겁니다.
웹 개발자나 데이터 사이언티스트가 되고 싶다면 파이썬이나 자바스크립트로 시작하세요.
그냥 소프트웨어 업계에서 일자리를 얻고 싶다면… 글쎄요, 자바나 C#을 배우세요. 종종 부당하게 욕을 먹지만 훌륭한 언어들이고, 일자리도 많습니다.
중요한 건 이겁니다. 프로그래밍을 막 시작한다면, 어떤 언어를 고르든 힘들 겁니다. 저는 오히려 C나 C++로 시작하는 게, 프로그래밍의 기저 개념을 많이 가리는 언어로 시작하는 것보다 낫다고 봅니다. 더 나아가, 파이썬이나 자바스크립트로 시작하면 장기적으로 손해를 볼 수도 있다고 생각합니다. 아직 개념 이해가 유연하고 말랑할 때 겪어야 할 학습의 고통을, 이미 현재의 이해에 많은 투자를 하고 난 뒤로 미루게 되기 때문입니다.
물론, 어디까지나 제 의견입니다.
Rust는 최근 몇 년간 많은 사랑을 받았습니다. 그럴 만한 이유가 있죠. 메모리 안전을 진지하게 다루고, 빌림 검사기(borrow checker)가 C++에선 개발자에게 맡겨졌던 규율을 강제합니다. 그렇다고 해도 Rust의 생태계는 아직 성장 중이고, 학습 곡선 역시—단지 다른 방식으로—가파르게 느껴질 수 있습니다. C++는 여러분이 스스로 발등을 쏘는 걸 막아주진 않지만, 크롬부터 언리얼 엔진에 이르기까지 수십 년간 전장 속에서 검증된 도구 체인, 컴파일러, 라이브러리를 제공합니다. 실제로는 두 언어를 적으로 돌리기보다는 함께 쓰는 팀이 많습니다. 안전이 최우선인 새로운 프로젝트에서는 Rust가 빛나고, 레거시 시스템과 성능이 최우선인 영역에서는 C++가 여전히 주도합니다.
짧은 답: 물론입니다. 끊임없이 구식이라는 말이 나오지만, C++는 여전히 세계에서 가장 널리 쓰이는 언어 중 하나입니다. 크롬과 파이어폭스 같은 주요 브라우저가 여전히 C++로 작성되어 있습니다. 언리얼 같은 게임 엔진도 C++ 위에서 돌아갑니다. 자동차 시스템, 금융 트레이딩 플랫폼, 심지어 AI 프레임워크까지 성능과 제어를 위해 C++에 크게 의존합니다. 최신 표준(C++20, C++23)은 언어를 계속 현대화하여, 더 어린 대안들과 경쟁력을 유지하게 합니다. 우리가 매일 의존하는 대규모 시스템의 층을 한 겹 벗겨 보면, 보닛 아래에서 조용히 돌아가고 있는 C++을 거의 언제나 발견하게 될 겁니다.
C++는 시간의 시험을 견뎌 온 강력하고 다재다능한 프로그래밍 언어입니다. 복잡성과 도전 과제가 있는 건 사실이지만, 오늘날의 기술 환경에서도 여전히 관련성 있고 널리 사용됩니다. 올바른 접근과 마음가짐을 갖추면 C++는 다루는 즐거움이 있는 언어가 될 수 있으며, 고성능이고 효율적인 애플리케이션을 만들 수 있습니다. 다음에 누군가 C++를 깎아내리는 얘기를 들으면, 섣불리 치워버리기 전에 이 노장 언어의 강점과 역량을 한 번만 더 생각해 보세요.
이 글이 마음에 드셨길 바랍니다. 유익했다면 주변 동료나 친구들과 공유해 주세요. 질문이나 의견이 있다면 언제든 Twitter로 연락 주세요.