Tan Kim

C++

C에 객체지향을 더한 시스템 프로그래밍 언어. 고성능이 필요한 게임, 임베디드, 운영체제 등에 사용.

기본 구조

#include <iostream>
#include <string>
using namespace std;
 
int main() {
    cout << "Hello, World!" << endl;
    return 0;
}

변수 & 타입

int    a = 10;
double b = 3.14;
bool   c = true;
char   d = 'A';
string s = "안녕";
 
// 상수
const int MAX = 100;
constexpr int SIZE = 256;  // 컴파일 타임 상수
 
// 자동 타입 추론 (C++11)
auto x = 42;
auto y = 3.14;

포인터 & 참조

int val = 10;
 
// 포인터
int* ptr = &val;   // 주소 저장
*ptr = 20;         // 역참조 (값 변경)
 
// 참조 (별칭, null 불가)
int& ref = val;
ref = 30;          // val도 30이 됨
 
// nullptr (C++11)
int* p = nullptr;

함수

// 기본값 매개변수
int add(int a, int b = 0) {
    return a + b;
}
 
// 참조로 전달 (복사 없음)
void increment(int& n) { n++; }
 
// const 참조 (읽기 전용)
void print(const string& s) { cout << s; }
 
// 오버로딩
double add(double a, double b) { return a + b; }
 
// 람다 (C++11)
auto mul = [](int a, int b) { return a * b; };
auto capture = [&val](int x) { return val + x; };  // 외부 변수 캡처

클래스

class Animal {
private:
    string name;
 
public:
    Animal(const string& name) : name(name) {}  // 초기화 리스트
 
    virtual string speak() const { return ""; }  // 가상 함수
 
    string getName() const { return name; }      // const 멤버 함수
 
    ~Animal() {}  // 소멸자
};
 
class Dog : public Animal {
public:
    Dog(const string& name) : Animal(name) {}
 
    string speak() const override {  // override 명시
        return getName() + ": 왈왈";
    }
};
 
// 사용
Dog dog("멍멍이");
Animal* a = &dog;
cout << a->speak();  // 다형성 → "멍멍이: 왈왈"

메모리 관리

// 동적 할당 (직접 관리 — 일반적으로 스마트 포인터 권장)
int* arr = new int[10];
delete[] arr;
 
// 스마트 포인터 (C++11, 자동 해제)
#include <memory>
 
auto up = make_unique<Dog>("멍멍이");  // unique_ptr (단독 소유)
auto sp = make_shared<Dog>("냥이");   // shared_ptr (공유 소유)
 
up->speak();  // 포인터처럼 사용
// delete 불필요 — 스코프 벗어나면 자동 해제

STL 컨테이너

#include <vector>
#include <map>
#include <set>
#include <unordered_map>
 
// vector (동적 배열)
vector<int> v = {1, 2, 3};
v.push_back(4);
v.size();
v[0];
 
// map (정렬된 키-값)
map<string, int> m;
m["apple"] = 1;
m.find("apple") != m.end();  // 존재 확인
 
// unordered_map (해시맵, 더 빠름)
unordered_map<string, int> um;
 
// 범위 기반 for (C++11)
for (const auto& elem : v) {
    cout << elem;
}

STL 알고리즘

#include <algorithm>
 
sort(v.begin(), v.end());
sort(v.begin(), v.end(), greater<int>());  // 내림차순
 
auto it = find(v.begin(), v.end(), 3);
bool found = (it != v.end());
 
int cnt = count(v.begin(), v.end(), 3);
 
transform(v.begin(), v.end(), v.begin(),
          [](int x) { return x * 2; });

예외 처리

#include <stdexcept>
 
try {
    throw runtime_error("오류 발생");
} catch (const runtime_error& e) {
    cerr << e.what();
} catch (...) {
    cerr << "알 수 없는 오류";
}

빌드

# 컴파일
g++ -std=c++17 -O2 -o output main.cpp
 
# CMake
cmake -B build
cmake --build build

메모