💻 프로그래밍

C++

C Plus Plus

고성능 시스템 프로그래밍 언어. 게임 엔진, OS, 브라우저에 사용. C의 확장.

📖 상세 설명

C++는 1979년 덴마크 컴퓨터 과학자 Bjarne Stroustrup이 Bell Labs에서 개발한 범용 프로그래밍 언어입니다. 원래 "C with Classes"라는 이름으로 시작했으며, C 언어의 효율성을 유지하면서 객체 지향 프로그래밍 기능을 추가한 것이 특징입니다.

C++는 저수준 메모리 조작과 고수준 추상화를 모두 지원하는 멀티 패러다임 언어입니다. 절차적, 객체 지향, 제네릭, 함수형 프로그래밍을 모두 지원하며, "당신이 사용하지 않는 것에 대해서는 비용을 지불하지 않는다(zero-overhead abstraction)"는 철학을 따릅니다.

C++의 핵심 특징으로는 클래스와 상속, 템플릿을 통한 제네릭 프로그래밍, RAII(Resource Acquisition Is Initialization) 패턴, 연산자 오버로딩, 다중 상속 등이 있습니다. C++11 이후 람다 표현식, 스마트 포인터, 이동 시맨틱스 등 현대적 기능이 대폭 추가되었습니다.

실무에서 C++는 게임 엔진(Unreal Engine, Unity 코어), 운영체제(Windows, Linux 커널 일부), 웹 브라우저(Chrome, Firefox), 데이터베이스(MySQL, MongoDB), 임베디드 시스템, 고빈도 거래 시스템 등 성능이 중요한 분야에서 널리 사용됩니다. 2025년 현재 TIOBE 지수에서 지속적으로 상위권을 유지하고 있으며, AI/ML 분야에서도 TensorFlow, PyTorch의 핵심 엔진이 C++로 작성되어 있습니다.

💻 코드 예제

// 1. 기본 클래스와 생성자/소멸자
#include <iostream>
#include <string>
#include <memory>
#include <vector>

class Animal {
protected:
    std::string name;
public:
    Animal(const std::string& n) : name(n) {}
    virtual ~Animal() = default;
    virtual void speak() const = 0;  // 순수 가상 함수
};

class Dog : public Animal {
public:
    Dog(const std::string& n) : Animal(n) {}
    void speak() const override {
        std::cout << name << "가 멍멍 짖습니다!" << std::endl;
    }
};

// 2. 템플릿과 스마트 포인터
template<typename T>
class Container {
private:
    std::vector<T> items;
public:
    void add(T item) { items.push_back(std::move(item)); }
    size_t size() const { return items.size(); }
    const T& get(size_t index) const { return items.at(index); }
};

// 3. 람다와 알고리즘 (C++11/14/17)
#include <algorithm>

int main() {
    // 스마트 포인터로 메모리 자동 관리
    auto dog = std::make_unique<Dog>("바둑이");
    dog->speak();  // 출력: 바둑이가 멍멍 짖습니다!

    // 템플릿 컨테이너 사용
    Container<int> numbers;
    numbers.add(10);
    numbers.add(20);
    std::cout << "크기: " << numbers.size() << std::endl;

    // 람다와 STL 알고리즘
    std::vector<int> vec = {5, 2, 8, 1, 9};
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        return a < b;  // 오름차순 정렬
    });

    // 범위 기반 for 루프
    for (const auto& num : vec) {
        std::cout << num << " ";  // 출력: 1 2 5 8 9
    }

    return 0;
}

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"이 모듈은 성능이 크리티컬해서 C++로 작성하는 게 좋겠습니다. Python 바인딩은 pybind11로 제공하면 기존 ML 파이프라인과도 쉽게 통합할 수 있어요."
💬 면접에서
"C++에서 스마트 포인터는 RAII 원칙을 구현합니다. unique_ptr은 단독 소유권, shared_ptr은 공유 소유권을 나타내며, 참조 카운팅으로 메모리를 자동 해제합니다. 순환 참조 문제는 weak_ptr로 해결할 수 있습니다."
💬 코드 리뷰에서
"여기 raw 포인터 대신 std::unique_ptr 쓰는 게 좋겠어요. 예외 발생 시 메모리 누수 가능성이 있고, 소유권도 명확해집니다. 그리고 const 참조로 받으면 불필요한 복사도 피할 수 있습니다."

⚠️ 흔한 실수 & 주의사항

메모리 누수와 댕글링 포인터

new로 할당한 메모리를 delete하지 않거나, 해제된 메모리에 접근하면 치명적 버그가 발생합니다. 가능하면 스마트 포인터(unique_ptr, shared_ptr)를 사용하고, 원시 포인터는 소유권이 없는 관찰용으로만 쓰세요.

정의되지 않은 동작(Undefined Behavior)

배열 범위 초과, null 역참조, 초기화되지 않은 변수 사용 등은 UB를 유발합니다. 컴파일러 경고를 활성화(-Wall -Wextra)하고, AddressSanitizer 같은 도구로 런타임 검사를 하세요.

모던 C++ 스타일 적용하기

C++11/14/17/20의 현대적 기능을 적극 활용하세요. auto 타입 추론, 범위 기반 for, 람다, 이동 시맨틱스, std::optional, std::string_view 등은 코드를 더 안전하고 효율적으로 만듭니다.

🔗 관련 용어

📚 더 배우기