C++ 공식 문서: 개념, 예제, 실습
예제 중심의 간결한 C++ 레퍼런스. 개념을 읽고 코드를 본 뒤 Coddy 여정에서 직접 연습하세요.
C++ 가이드 학습 시작하기시작하기
- C++란C++가 실제로 무엇인지, 왜 네이티브 기계어로 곧장 컴파일되는지, 그리고 어떤 종류의 고성능 소프트웨어를 만드는 데 쓰이는지.
- C++ 설치C++ 컴파일러(GCC, Clang, MSVC)를 설치하는 방법, 운영체제에 맞는 툴체인을 고르는 법, 그리고 명령줄에서 정상 동작하는지 확인하는 방법을 알아봅니다.
- C++ 컴파일C++가 .cpp 소스를 네이티브 실행 파일로 바꾸는 방법: g++(또는 clang++/MSVC)로 컴파일하고, 바이너리를 실행하고, 문제가 생겼을 때 컴파일러 오류를 읽는 법.
- C++ 문법C++ 프로그램의 핵심 문법 규칙 - 문장과 세미콜론, 중괄호 블록, main 함수, 출력이 동작하는 방식 - 을 첫 프로그램에서부터 풀어 설명합니다.
- 주석C++에서 주석을 작성하는 방법 - 한 줄 // 메모와 여러 줄 /* */ 블록 - 그리고 코드를 주석 처리하는 방법, 블록 주석이 중첩되지 않는 이유, 남겨둘 가치가 있는 주석이란 무엇인지까지.
변수와 타입
- 변수C++에서 변수가 작동하는 방식 - 타입과 함께 선언하기, 대입과 초기화의 차이, 중괄호 초기화, 이름 짓기 규칙, 그리고 변수가 어디서 살고 사라지는지를 결정하는 스코프.
- 데이터 타입C++의 기본 데이터 타입(정수, 부동소수점, char, bool)을 실용적으로 둘러봅니다. 크기, signed와 unsigned, 리터럴과 접미사, 오버플로, 그리고 올바른 타입을 고르는 방법도 함께 다룹니다.
- auto 키워드`auto` 키워드가 컴파일러로 하여금 변수의 타입을 대신 추론하게 하는 방법 - 무엇을 떼어내는지, 어디서 빛을 발하는지, 그리고 초보자를 무는 함정들.
- 상수와 constC++에서 const로 읽기 전용 값을 선언하는 방법, const와 constexpr의 차이, const 포인터와 const를 가리키는 포인터의 차이, 그리고 const 멤버 함수를 다룹니다.
- 연산자C++ 연산자(산술, 비교, 논리, 대입, 비트)를 배우고, 정수 나눗셈·우선순위·단축 평가와 관련된 함정도 함께 익혀 보세요.
- 형 변환C++에서 형 변환이 어떻게 동작하는지 — 암시적 변환, 정수 나눗셈의 함정, 그리고 네 가지 이름 있는 캐스트(static_cast, const_cast, reinterpret_cast, dynamic_cast) — 와 조용한 데이터 손실을 일으키는 함정까지 다룹니다.
제어 흐름
- if-elseC++에서 if, else if, else로 판단하는 방법 - 조건, 분기 연결, 중첩, 삼항 연산자, 초기화자가 있는 if, 그리고 사람들이 자주 빠지는 함정들.
- switchC++ switch 문 설명: case 레이블, break와 폴스루, default 분기, case 그룹화, enum에 대한 switch, 그리고 case 안에서의 선언과 관련된 함정.
- for 반복문C++ for 반복문으로 코드를 반복하는 방법 - 세 부분으로 된 헤더, 증가·감소 카운트, 배열 순회, 중첩, break와 continue, 그리고 누구나 한 번쯤 겪는 off-by-one 및 부호 없는 타입 버그.
- while 반복문C++ while 반복문 설명: 조건을 먼저 검사하는 while, 최소 한 번은 실행되는 do-while, 보초값까지 반복하기, break와 continue, 그리고 무한 루프를 피하는 방법.
- 범위 기반 forC++ 범위 기반 for 루프 설명 - 배열, vector, string, map을 깔끔하게 순회하는 방법, auto&와 const auto&를 써야 하는 이유, 그리고 피해야 할 복사와 이터레이터 무효화 함정.
함수
- 함수C++에서 함수를 작성하는 방법 — 반환 타입/이름/매개변수 구조, 선언과 정의의 차이, 값 반환, void 함수, 그리고 return 누락이나 프로토타입을 빠뜨리는 것 같은 함정들.
- 함수 매개변수인자가 C++ 함수에 어떻게 전달되는가 - 값 전달과 참조 전달, 저렴한 읽기 전용 접근을 위한 const 참조, 기본 인자, 포인터, 그리고 프로그램을 조용히 느리게 만드는 복사 비용의 함정.
- 참조C++ 참조를 설명합니다. 매개변수의 &가 어떻게 별칭을 만드는지, 참조에 의한 전달이 왜 복사를 피하고 함수가 호출자의 변수를 수정할 수 있게 하는지, 그리고 값을 반환하는 대신 const&와 참조를 사용해야 할 때를 다룹니다.
- 함수 오버로딩C++ 함수 오버로딩을 사용하면 매개변수 목록이 다른 한, 여러 함수가 하나의 이름을 공유할 수 있습니다. 오버로딩 해석이 어떻게 일치 항목을 고르는지, 왜 반환 타입만으로는 구분되지 않는지, 그리고 피해야 할 모호성과 기본 인수의 함정을 알아보세요.
- 람다C++ 람다로 그 자리에서 작은 인라인 함수를 작성하는 방법을 알아봅니다. 문법, 캡처가 작동하는 원리, 언제 `mutable`을 써야 하는지, 그리고 누구나 한 번쯤 걸리는 댕글링 캡처 함정까지.
포인터와 메모리
- 포인터C++ 포인터를 처음부터 설명합니다. 포인터 선언, & (주소 연산자)와 * (역참조 연산자), nullptr, 배열에 대한 포인터, 그리고 크래시를 일으키는 댕글링 포인터와 초기화되지 않은 포인터의 함정까지 다룹니다.
- 참조 vs 포인터C++의 참조와 포인터를 실용적으로 비교합니다. 공통점, 차이점(재바인딩, null, 산술 연산), 그리고 일상 코드에서 어느 쪽을 골라야 하는지에 대한 명확한 규칙을 제시합니다.
- 동적 메모리`new`로 런타임에 메모리를 할당하고 `delete`로 해제하는 방법, 그리고 힙을 직접 관리할 때 따라오는 누수, 댕글링 포인터, 이중 해제를 피하는 방법.
- 스마트 포인터스마트 포인터는 힙 메모리를 소유하고 자동으로 해제합니다. `unique_ptr`, `shared_ptr`, `make_unique`, `make_shared`를 배우고, 왜 이제 `new`/`delete`를 거의 쓸 필요가 없는지 알아보세요.
문자열과 입출력
- 문자열C++에서 `std::string`을 사용하는 방법 - 텍스트를 안전하게 만들고, 합치고, 검색하고, 잘라내는 법, 그리고 실제 작업에서 생 `char*`를 거의 쓰고 싶지 않은 이유.
- 입력과 출력C++에서 콘솔 I/O가 동작하는 방식: cout로 출력하기, cin으로 읽기, cin 다음의 getline에서 생기는 고전적인 개행 버그, 그리고 입력이 실패했을 때 회복하는 법.
- 문자열 스트림std::stringstream, istringstream, ostringstream을 사용해 텍스트를 파싱하고, 공백을 기준으로 문자열을 나누고, 문자열과 숫자를 서로 변환하고, 메모리에서 서식 있는 문자열을 만드는 방법.
STL 컨테이너
- 배열C++ 원시 배열 설명: 선언과 초기화 방법, 안전한 인덱싱, 크기를 사용한 반복, 배열에서 포인터로의 감쇠 함정, 그리고 std::array와 vector가 보통 더 나은 이유.
- vectorstd::vector는 C++의 크기 조정 가능한 배열로, 기본적으로 가장 먼저 손이 가야 할 컨테이너입니다. vector를 생성하고 접근하고 키우고 순회하는 방법은 물론, 반복자 무효화와 범위 밖 접근 같은 함정까지 배워 보세요.
- mapC++ std::map 설명 — 로그 시간 조회를 제공하는, 키로 정렬된 키-값 컨테이너. 삽입, 검색, 순회 방법과 키를 슬그머니 삽입해 버리는 operator[]의 고전적인 함정을 피하는 법.
- unordered_mapC++의 std::unordered_map을 배워 보세요. 평균 O(1)의 삽입과 조회를 제공하는 map의 해시 테이블 형제입니다. 기본 연산, [] 자동 삽입의 함정, count와 find의 차이, 정렬된 map 대신 언제 선택할지 다룹니다.
- setstd::set이 C++에서 고유하고 자동으로 정렬된 값을 어떻게 저장하는지: 삽입, count와 find로 멤버십 확인, 순서대로 순회, 그리고 set·multiset·unordered_set의 차이.
- pair와 tuple`std::pair`와 `std::tuple`이 두 개 이상의 값을 하나의 객체로 묶는 방법: 만드는 법, 필드 접근, 구조적 바인딩, 그리고 각각이 어디에 적합한지.
- 이터레이터C++ 이터레이터가 컨테이너를 가리키는 일반화된 포인터로 어떻게 동작하는지 알아봅니다 - begin()과 end(), 역참조, 전진, const/reverse 변형, 그리고 정의되지 않은 동작을 일으키는 무효화와 end() 역참조라는 함정을 다룹니다.
STL 알고리즘과 템플릿
- 알고리즘C++ 표준 알고리즘 - `find`, `count_if`, `transform`, `accumulate`, `remove` - 을 사용해 직접 루프를 작성하지 않고 범위에 대해 실제 작업을 처리하세요. 더불어 이터레이터 쌍과 erase-remove 관용구의 함정도 다룹니다.
- 정렬`std::sort`로 C++에서 벡터와 배열을 정렬하는 방법: 기본 순서, 사용자 정의 비교자, 구조체를 필드 기준으로 정렬하기, 그리고 크래시를 일으키는 엄격 약순서(strict weak ordering)의 함정.
- 템플릿C++ 템플릿을 사용하면 코드를 한 번만 작성해 모든 타입에서 동작시킬 수 있습니다. 함수 템플릿, 클래스 템플릿, 타입 추론, 그리고 그로 인해 발생하는 헷갈리는 컴파일러 오류를 살펴봅니다.
클래스와 객체
- 클래스C++ 클래스가 데이터와 동작을 재사용 가능한 타입으로 묶는 방법을 배웁니다. 멤버 변수와 메서드 선언, 객체 생성, public/private 구분, 그리고 초기화되지 않은 멤버나 this 포인터 같은 함정까지 다룹니다.
- 생성자생성자는 객체가 생성될 때 실행되는 특별한 멤버 함수입니다. 기본 생성자, 매개변수 생성자, 복사 생성자, 멤버 초기화 리스트, 그리고 객체를 절반만 초기화된 상태로 두지 않는 방법을 배워 보세요.
- 소멸자소멸자는 객체가 소멸될 때 자동으로 실행됩니다. `~ClassName()` 구문, 언제 호출되는지, 왜 자원을 해제하는지, 그리고 3의 법칙/5의 법칙을 알아보세요.
- 상속C++ 상속을 통해 파생 클래스가 기반 클래스를 재사용하고 확장하는 방법을 배웁니다. 문법, public 상속과 private 상속의 차이, 생성자와 소멸자 호출 순서, 그리고 객체 슬라이싱 같은 함정까지 다룹니다.
- 가상 함수가상 함수를 사용하면 기반 클래스 포인터로 런타임에 파생 클래스의 메서드 버전을 호출할 수 있습니다. `virtual`, `override`, 추상 클래스, 그리고 기반 클래스 소멸자가 반드시 가상이어야 하는 이유를 배워보세요.
- 연산자 오버로딩C++ 연산자 오버로딩을 사용하면 사용자가 만든 타입을 +, ==, << 같은 내장 연산자와 함께 동작시킬 수 있습니다. 멤버 함수와 비멤버 함수 선택 규칙, 비교 연산자와 스트림 연산자를 오버로딩하는 방법, 그리고 반환 타입과 대입 연산자를 둘러싼 함정을 익혀 보세요.
- 접근 지정자public, private, protected가 C++에서 클래스의 멤버에 누가 접근할 수 있는지를 어떻게 제어하는지 - 캡슐화의 토대를 게터, 세터, 그리고 friend라는 탈출구와 함께 알아봅니다.
- 구조체C++ 구조체 설명. 관련 변수를 하나의 타입으로 묶는 방법, 구조체 객체를 선언하고 초기화하는 방법, 구조체에 멤버 함수와 생성자를 부여하는 방법, 그리고 struct가 class와 실제로 어떻게 다른지 알아봅니다.
- 열거형C++ 열거형을 배워보세요. 선언하는 방법, 스코프가 있는 enum class가 일반 enum보다 안전한 이유, 사용자 지정 기반 값, 열거자에 대한 switch, 그리고 정수와의 상호 변환을 다룹니다.
오류와 디버깅
- 예외예외는 함수가 그 자리에서 처리할 수 없는 오류를 알립니다. `throw` 사용법, 표준 예외 타입, `what()` 메시지, 그리고 정말 중요한 실패에서 예외가 반환 코드보다 나은 이유를 알아보세요.
- try-catch위험한 코드를 `try`로 감싸고 `catch`에서 대응하세요. 예외를 const 참조로 잡는 법, 여러 핸들러의 순서, `catch (...)` 사용법, 그리고 리소스를 누수 없이 다시 던지는 법을 배웁니다.
- 미정의 동작미정의 동작(UB)은 C++ 표준이 아무런 규칙도 두지 않은 코드입니다. 충돌하거나, 데이터를 손상시키거나, 정상으로 보일 수도 있습니다. 흔한 원인, "잘 돌아갔다"가 아무것도 증명하지 못하는 이유, 그리고 UB를 잡아내는 도구를 알아보세요.