
얼마 전 작은 계산 프로그램을 만들 일이 있었는데, 처음엔 익숙한 스크립트 언어로 대충 짜면 되겠지 싶었다. 그런데 데이터가 100만 줄을 넘어가니 실행 시간이 슬슬 신경 쓰였다. 그때 문득 예전에 배웠던 C++이 떠올랐다. 빠르다는 말은 많이 들었지만, 막상 다시 열어보니 속도만 보고 덤빌 도구는 아니었다.
생활 속 작은 문제를 풀 때도 비슷하다. 칼이 잘 든다고 모든 재료를 칼로만 손질하지는 않는다. C++도 딱 그런 느낌이었다. 잘 쓰면 무척 든든한데, 아무 생각 없이 잡으면 손이 꽤 바빠진다.
C++은 왜 아직도 쓰일까
솔직히 요즘은 Python, JavaScript, Go, Rust 같은 언어 이야기가 더 자주 들린다. 그래서 C++은 낡은 언어처럼 느껴질 때가 있다. 그런데 게임 엔진, 그래픽 프로그램, 금융 거래 시스템, 임베디드 장비, 고성능 서버 쪽을 보면 여전히 C++이 깊숙이 들어가 있다.
이유는 단순하다. 빠르고, 세밀하게 조절할 수 있고, 오래된 코드 자산이 많다. 예를 들어 게임에서 캐릭터 수십 명이 동시에 움직이고, 물리 효과와 사운드와 네트워크 처리가 한꺼번에 돌아간다고 생각해보면 0.1초 차이도 체감된다. C++은 이런 상황에서 메모리와 성능을 직접 챙길 수 있는 언어다.
근데 이 장점은 동시에 부담이기도 하다. 자동으로 다 챙겨주는 언어에 익숙하면 포인터, 참조, 메모리 해제 같은 개념이 처음엔 꽤 거칠게 다가온다. 나도 간단한 배열 하나 다루다가 인덱스를 잘못 건드려 프로그램이 조용히 이상해지는 걸 보고, 아 이 언어는 실수를 크게 봐주지 않는구나 싶었다.
직접 만져보니 제일 헷갈렸던 부분
처음 다시 잡았을 때 가장 헷갈린 건 문법 자체보다 사고방식이었다. Python에서는 리스트에 값을 넣고 빼는 일이 비교적 편하다. C++에서도 vector를 쓰면 비슷하게 할 수 있지만, 타입을 먼저 생각해야 하고 값이 복사되는지 참조되는지도 신경 써야 한다.
예를 들어 숫자 10개를 더하는 코드는 금방 만든다. 하지만 데이터가 커지고 함수가 여러 개로 나뉘면 이야기가 달라진다. 값을 매번 복사하면 느려질 수 있고, 참조로 넘기면 원본이 바뀔 수 있다. 이 차이를 모르면 코드가 돌아가긴 하는데 뭔가 찜찜한 상태가 된다.
- 값 복사: 안전하지만 큰 데이터에서는 비용이 커질 수 있음
- 참조 전달: 빠르지만 원본 변경 가능성을 의식해야 함
- const 참조: 읽기만 할 때 자주 쓰는 현실적인 선택
이 세 가지를 구분하고 나니 C++ 코드가 조금 덜 무서워졌다. 사실 처음부터 모든 문법을 외우려 하면 지친다. 작은 프로그램을 만들면서 왜 이 방식이 필요한지 몸으로 익히는 쪽이 훨씬 낫다.
요즘 C++은 예전 느낌과 꽤 다르다
내가 예전에 기억하던 C++은 포인터와 new, delete가 자주 보이는 언어였다. 그런데 요즘 스타일의 C++은 조금 다르다. vector, string, unique_ptr, shared_ptr 같은 도구를 잘 쓰면 직접 메모리를 해제하는 일을 많이 줄일 수 있다.
특히 C++11 이후로 언어가 꽤 현대적으로 바뀌었다. auto를 쓰면 타입을 어느 정도 추론해주고, range 기반 for문을 쓰면 반복문도 훨씬 읽기 좋아진다. 예전 코드만 보고 C++을 판단하면 조금 억울할 수도 있겠다는 생각이 들었다.
다만 문법이 많다는 사실은 그대로다. 입문자가 처음부터 템플릿, 이동 의미론, 람다, 스마트 포인터를 한꺼번에 잡으려 하면 머리가 복잡해진다. 실제로 써보니 순서는 단순한 게 좋았다. 변수와 함수, 조건문과 반복문, vector와 string, 클래스, 그다음 참조와 포인터 정도로 가면 숨이 덜 찬다.
처음 배우는 사람에게 현실적인 순서
C++을 처음 배운다면 거창한 프로젝트보다 작은 문제를 여러 개 풀어보는 게 좋았다. 예를 들면 가계부 합계 계산, 영화 평점 평균 내기, 텍스트 파일에서 특정 단어 세기 같은 것들이다. 이런 문제는 일상적이라 결과가 눈에 바로 들어온다.
내가 해보니 하루에 30분씩 2주만 해도 문법의 낯섦은 꽤 줄었다. 첫 3일은 입출력과 변수만 익혀도 충분하다. 그다음 4일 정도는 조건문과 반복문으로 간단한 계산기를 만들고, 그 뒤에는 vector와 함수를 붙여보면 된다. 클래스는 조금 늦게 만나도 괜찮았다.
- 1단계: cout, cin, 변수, 자료형
- 2단계: if, for, while로 흐름 만들기
- 3단계: vector와 string으로 실제 데이터 다루기
- 4단계: 함수로 코드를 나누기
- 5단계: class로 관련 데이터를 묶기
중요한 건 컴파일 에러를 너무 두려워하지 않는 것이다. C++은 에러 메시지가 길고 딱딱할 때가 많다. 하지만 대부분은 세미콜론 누락, 타입 불일치, 괄호 위치 같은 사소한 문제에서 시작된다. 처음엔 에러 전체를 다 읽기보다 가장 위에 나온 줄부터 보는 습관이 더 실용적이었다.
C++이 잘 맞는 사람과 아닌 사람
C++은 빠른 결과물을 바로 화면에 띄우고 싶은 사람에게는 조금 답답할 수 있다. 웹 페이지를 만들거나 간단한 자동화 스크립트를 짜는 목적이라면 다른 언어가 더 편할 때가 많다. 반대로 프로그램이 어떻게 메모리를 쓰고, 왜 어떤 코드가 느린지 궁금한 사람에게는 꽤 재미있는 언어다.
나는 C++을 다시 만지면서 컴퓨터가 일을 처리하는 방식에 더 가까이 다가간 느낌을 받았다. 변수 하나를 넘기는 방식, 배열을 도는 순서, 객체가 생성되고 사라지는 타이밍까지 의식하게 된다. 귀찮을 때도 있지만, 이 과정을 지나면 다른 언어를 볼 때도 눈이 조금 달라진다.
그래서 C++은 처음 배우는 언어로도 가능하지만, 마음의 여유가 조금 필요하다. 빠른 성취감보다는 기초 체력을 쌓는 쪽에 가깝다. 헬스장으로 치면 화려한 운동복보다 자세 교정부터 하는 날들이다. 재미가 늦게 오지만, 한번 감이 오면 코드가 왜 그렇게 움직이는지 꽤 선명하게 보인다.
내 기준에서 C++은 모두에게 매일 필요한 생활 도구는 아니었다. 하지만 성능이 중요한 작업을 하거나, 프로그래밍의 바닥을 조금 더 알고 싶다면 한 번쯤 제대로 부딪혀볼 만한 언어였다. 까칠하지만 배울수록 이유가 있는 도구, 딱 그 정도의 인상이 남았다.
