C++ 치트시트
마지막 업데이트
Hello World 및 프로그램 구조
실행은 int를 반환하는 main에서 시작합니다.
| 요소 | 코드 |
|---|---|
| 헤더 포함 | #include <iostream> |
| 진입점 | int main() { ... } |
| 한 줄 출력 | std::cout << "Hello, World!" << std::endl; |
| 입력 읽기 | std::cin >> x; |
| std 네임스페이스 사용 | using namespace std; |
| 성공 반환 | return 0; |
| 주석 | // line 그리고 /* block */ |
자료형
| 타입 | 설명 |
|---|---|
int | 정수 (보통 32비트) |
long / long long | 더 넓은 정수 |
float / double | 부동소수점 숫자 |
char | 단일 바이트 / 문자 |
bool | true 또는 false |
std::string | <string>의 동적 텍스트 |
auto | 컴파일러가 타입을 추론 |
std::size_t | 크기와 인덱스용 부호 없는 타입 |
변수 및 참조
참조는 별칭이고, 포인터는 주소를 담습니다.
| 작업 | 문법 |
|---|---|
| 선언 및 초기화 | int x = 5; |
| 중괄호 초기화 | int x{5}; |
| 상수 | const double PI = 3.14159; |
| 컴파일 타임 상수 | constexpr int N = 10; |
| 참조 (별칭) | int &r = x; |
| 포인터 | int *p = &x; |
| 포인터 역참조 | *p = 10; |
| 타입 추론 | auto y = 3.14; |
제어 흐름
| 문(statement) | 문법 |
|---|---|
| if / else | if (x > 0) { ... } else { ... } |
| switch | switch (n) { case 1: ...; break; default: ...; } |
| while 반복문 | while (i < n) { ... } |
| do-while 반복문 | do { ... } while (i < n); |
| for 반복문 | for (int i = 0; i < n; i++) { ... } |
| 범위 기반 for | for (auto x : vec) { ... } |
| 참조로 받는 범위 기반 for | for (auto &x : vec) { ... } |
| break / continue | break;는 반복문을 빠져나가고, continue;는 다음 반복으로 건너뜀 |
함수
| 작업 | 문법 |
|---|---|
| 함수 정의 | int add(int a, int b) { return a + b; } |
| 반환값 없음 | void greet() { ... } |
| 기본 인자 | int pow(int b, int e = 2) { ... } |
| 참조로 전달 | void inc(int &x) { x++; } |
| const 참조 (복사 없음) | void print(const std::string &s) { ... } |
| 오버로딩 | int max(int a, int b);와 double max(double a, double b); |
| 람다 | auto f = [](int x) { return x * 2; }; |
| 캡처가 있는 람다 | auto g = [n](int x) { return x + n; }; |
클래스 및 객체 지향(OOP)
| 작업 | 문법 |
|---|---|
| 클래스 정의 | class Dog { ... }; |
| 접근 지정자 | public:, private:, protected: |
| 멤버 변수 | std::string name; |
| 생성자 | Dog(std::string n) : name(n) {} |
| 소멸자 | ~Dog() { ... } |
| 멤버 함수 | void bark() { ... } |
| 객체 생성 | Dog d("Rex"); |
| 상속 | class Puppy : public Dog { ... }; |
| 가상 함수 | virtual void speak(); |
STL 컨테이너
표준 라이브러리의 자주 쓰는 컨테이너.
| 컨테이너 | 사용법 및 예시 |
|---|---|
std::vector<int> | 동적 배열: v.push_back(1); v.size(); |
std::string | 텍스트: s += "!"; s.length(); |
std::array<int, 3> | 크기 정보가 있는 고정 크기 배열 |
std::map<K, V> | 정렬된 키-값: m["a"] = 1; |
std::unordered_map<K, V> | 해시 맵 (조회가 빠르고 순서 없음) |
std::set<T> | 정렬된 고유 값: s.insert(5); |
std::pair<A, B> | 두 값: make_pair(1, "x") |
std::queue / std::stack | FIFO 큐 / LIFO 스택 어댑터 |
STL 알고리즘 및 반복자
<algorithm>에서 가져오며, 대부분 begin/end 반복자 범위를 받습니다.
| 작업 | 문법 |
|---|---|
| begin / end 반복자 | v.begin(), v.end() |
| 정렬 | std::sort(v.begin(), v.end()); |
| 내림차순 정렬 | std::sort(v.begin(), v.end(), std::greater<int>()); |
| 값 찾기 | auto it = std::find(v.begin(), v.end(), 5); |
| 일치 개수 세기 | std::count(v.begin(), v.end(), 5); |
| 최소 / 최대 원소 | std::max_element(v.begin(), v.end()); |
| 범위 합산 | std::accumulate(v.begin(), v.end(), 0); |
| 각 원소 변환 | std::transform(v.begin(), v.end(), v.begin(), fn); |
스마트 포인터 및 모던 C++
자동 정리를 위해 원시 new/delete보다 스마트 포인터를 선호하세요.
| 기능 | 문법 |
|---|---|
| 단독 소유권 | auto p = std::make_unique<Dog>("Rex"); |
| 공유 소유권 | auto p = std::make_shared<Dog>("Rex"); |
| 소유하지 않는 참조 | std::weak_ptr<Dog> w = p; |
| 이동 시맨틱 | auto v2 = std::move(v1); |
| nullptr | int *p = nullptr; |
| 구조적 바인딩 | auto [key, val] = *it; |
| 선택적 값 | std::optional<int> maybe; |
| 템플릿 | template <typename T> T add(T a, T b) { return a + b; } |
가장 자주 쓰는 C++ 문법, STL 컨테이너, 최신 기능을 한 페이지에 담았습니다. 이 C++ 치트시트는 C++를 작성하기 위한 빠른 참조 자료입니다 - 자료형, 참조, 클래스, 표준 라이브러리 컨테이너와 알고리즘, 그리고 원시 new/delete를 대체하는 스마트 포인터를 다룹니다.
여기 나오는 모든 내용은 표준 C++(C++11 이상)이며 g++나 clang++로 컴파일됩니다. 필요한 것을 복사하거나, C++ 플레이그라운드에서 어떤 코드든 바로 실행해 보세요 - 컴파일러를 설치할 필요가 없습니다.
C++ 치트시트 자주 묻는 질문
이 C++ 치트시트는 무료인가요?
네. 이 C++ 치트시트는 완전히 무료이며 회원 가입이 필요 없습니다. 즐겨찾기에 추가해 두고 문법, STL 컨테이너, 스마트 포인터를 찾아봐야 할 때마다 다시 방문하세요.
C++에서 포인터와 참조의 차이는 무엇인가요?
포인터는 주소를 담는 변수입니다. null일 수 있고, 다른 곳을 가리키도록 재할당할 수 있으며,
*p로 역참조합니다. 참조(int &r = x)는 기존 변수의 별칭입니다 - 선언할 때 반드시 바인딩해야 하고, null이 되거나 다시 바인딩될 수 없으며, 변수 자체처럼 사용됩니다. 더 깔끔한 참조 전달 매개변수에는 참조를, 선택적이거나 재할당 가능한 간접 참조가 필요할 때는 포인터를 사용하세요.new/delete를 써야 하나요, 스마트 포인터를 써야 하나요?
스마트 포인터를 선호하세요.
std::unique_ptr와 std::shared_ptr(make_unique/make_shared를 통해)는 스코프를 벗어날 때 메모리를 자동으로 해제하므로, 수동 new/delete에서 발생하는 누수와 이중 해제를 방지합니다. 원시 new/delete는 특정한 이유가 있는 저수준 코드에서만 사용하세요.C++를 온라인에서 연습할 수 있나요?
네. C++ 플레이그라운드를 열어 이 치트시트의 어떤 코드든 브라우저에서 컴파일하고 실행해 보세요 - 컴파일러를 설치할 필요가 없습니다. 체계적으로 배우고 싶다면, Coddy의 무료 인터랙티브 C++ 강좌가 변수와 반복문부터 클래스와 STL까지 단계별로 안내합니다.
이 치트시트는 초보자에게 적합한가요?
네. 가장 흔한 구성 요소(타입, 제어 흐름, 함수)부터 고급 요소(STL과 스마트 포인터)까지 순서대로 정리되어 있어, 첫날부터 상단 섹션을 사용하고 점차 나머지로 넓혀갈 수 있습니다.