C++ 프라머, 제5판
C++11 표준을 완전히 재작성한 포괄적이고 권위 있는 C++ 가이드입니다. 이 과정에서는 기본 언어 요소부터 복잡한 라이브러리 기능, 고급 클래스 작성 도구까지 모든 것을 다룹니다.
강좌 개요
📚 콘텐츠 요약
C++11 표준에 맞춰 완전히 재작성된 포괄적이고 권위 있는 C++ 가이드. 이 과정은 기본 언어 요소에서 복잡한 라이브러리 기능과 고급 클래스 작성 도구까지 모든 내용을 다룹니다.
현대적인 현업 표준의 최고 수준 가이드 — 모던 C++11 프로그래밍 마스터를 위한.
저자: 스탠리 B. 리프먼, 조세 라조, 바바라 E. 무
감사의 말씀: 데이브 애브라함스, 앤디 코니그, 스테판 T. 라바베이, 제이슨 메릴, 존 스피서, 허브 서터, 브르네 스트로스트루프, 알렉스 스텐포프, 그리고 표준화 위원회 구성원들.
🎯 학습 목표
main함수를 정의하고 구현하며 운영체제와의 상호작용을 이해한다.- 명령줄 컴파일을 실행하고 기본 입출력 스트림(
cin,cout)을 관리한다. - 반복적 논리 문제(예: 발생 횟수 세기) 해결을 위해 제어 흐름 문장을 적용한다.
- 입력 데이터의 연속적인 발생 횟수를 세고 처리하기 위한 로직 구조를 구현한다.
- 제어문 내에서 할당(
=)과 동등성(==) 연산자 간의 차이를 구분한다. - 클래스 객체(
Sales_item)를 사용하고 점 연산자로 멤버 함수에 접근하며 사용자 정의 헤더 파일을 포함한다. - 다양한 원시 타입을 구분하고 타입 변환 및 부호 없는 산술 연산의 오버플로우 결과를 예측한다.
- 리스트 초기화,
nullptr,constexpr, 타입 추론 지정자 등 C++11 기능을 구현한다. - 변수 선언과 정의의 차이를 구분하고 범위 규칙을 적용하여 식별자 가시성을 관리한다.
- 참조와 포인터의 차이를 구분하고
void*를 사용해 일반적인 메모리 처리를 수행한다.
🔹 수업 1: C++ 소개 및 기본 입출력
개요: 본 수업은 C++ 프로그램의 기초 구조를 소개하며, main 함수, 기본 데이터 유형, 컴파일 과정에 중점을 둡니다. iostream 라이브러리를 사용한 필수 입력/출력(I/O) 작업, while 및 for 반복문을 통한 논리 구현을 다루며, Sales_item 클래스를 통해 객체 지향 개념의 기초를 소개합니다.
학습 성과:
main함수를 정의하고 구현하며 운영체제와의 상호작용을 이해한다.- 명령줄 컴파일을 실행하고 기본 입출력 스트림(
cin,cout)을 관리한다. - 반복적 논리 문제(예: 발생 횟수 세기) 해결을 위해 제어 흐름 문장을 적용한다.
🔹 수업 2: 제어 흐름 및 기본 클래스 개념
개요: 본 수업은 기본 제어 흐름에서 C++의 핵심 강력 기능인 '클래스'로 전환합니다. 학습자는 데이터 스트림 처리(연속적인 발생 횟수 세기)에 필요한 논리를 익히며, Sales_item 클래스를 사용해 내장 타입처럼 복잡한 데이터 구조를 쉽게 다룰 수 있는 방법을 배웁니다. 단원은 파일 리다이렉션과 오류 보고 기능을 통합한 기능적인 책방 프로그램의 구현으로 마무리됩니다.
학습 성과:
- 입력 데이터의 연속적인 발생 횟수를 세고 처리하기 위한 로직 구조를 구현한다.
- 제어문 내에서 할당(
=)과 동등성(==) 연산자 간의 차이를 구분한다. - 클래스 객체(
Sales_item)를 사용하고 점 연산자로 멤버 함수에 접근하며 사용자 정의 헤더 파일을 포함한다.
🔹 수업 3: 원시 타입 및 변수
개요: 본 수업은 산술 타입, 변수 생명주기, 메모리 모델을 탐색함으로써 C++ 프로그래밍의 기초 빌딩 블록을 확립합니다. 학생들은 타입 변환(특히 부호 없는 타입), C++11 리스트 초기화 구문, 포인터와 참조 사이의 중요한 차이점을 숙지하게 됩니다. 수업은 const 퀄리파이어, 타입 추론(auto, decltype), 그리고 전처리기 가드를 사용한 견고한 사용자 정의 데이터 구조 구현으로 마무리됩니다.
학습 성과:
- 다양한 원시 타입을 구분하고 타입 변환 및 부호 없는 산술 연산의 오버플로우 결과를 예측한다.
- 리스트 초기화,
nullptr,constexpr, 타입 추론 지정자 등을 포함한 C++11 기능을 구현한다. - 변수 선언과 정의의 차이를 구분하고 범위 규칙을 적용하여 식별자 가시성을 관리한다.
🔹 수업 4: 복합 타입 및 현대적 타입 퀄리파이어
개요: 본 수업은 C++11의 고도로 발전된 타입 시스템을 탐색하며, 포인터와 참조 같은 복합 타입이 const와 constexpr 같은 타입 퀄리파이어와 어떻게 상호작용하는지를 집중적으로 다룹니다. 학생들은 auto와 decltype를 사용한 타입 추론의 미묘한 점을 익히고, 전처리기 헤더 가드로 보호된 사용자 정의 구조에 데이터를 캡슐화하는 방법을 배웁니다.
학습 성과:
- 참조와 포인터의 차이를 구분하고
void*를 사용해 일반적인 메모리 처리를 수행한다. - 상위 수준과 하위 수준의
const퀄리파이어 및constexpr를 분류하고 컴파일 타임 상수에 적용한다. auto와decltype를 사용한 C++11 타입 추론을 구현하여 유연하고 유지보수가 쉬운 코드를 작성한다.
🔹 수업 5: 라이브러리 문자열과 벡터
개요: 본 수업은 기본적인 C++ 표준 라이브러리 타입인 string과 vector를 다룹니다. 이들은 내장 타입보다 더 유연하고 안전한 대안을 제공합니다. 학생들은 using 선언을 통해 네임스페이스 접근을 관리하고, 길이가 변하는 문자열과 컨테이너를 초기화하고 조작하며, 범위 기반 for 루프와 반복자들을 사용해 데이터 컬렉션을 효율적으로 처리하는 방법을 배웁니다.
학습 성과:
- 헤더 파일에서 흔히 발생하는 실수를 피하면서
namespace using선언을 사용해 코드를 단순화한다. string과vector의 견고한 초기화를 수행하며, C++11 리스트 초기화를 포함한다.push_back, 범위 기반for루프, 기본 반복자 연산을 사용해 문자 수준 처리 및 동적 컨테이너 성장을 구현한다.
🔹 수업 6: 반복자와 내장 배열
개요: 본 수업은 C++11에서 시퀀스를 탐색하고 관리하는 기초 메커니즘을 다룹니다. string과 vector에 대한 현대적인 고수준 도구인 반복자를 중심으로 시작하여, 저수준의 내장 배열, 포인터 산술, C스타일 문자열로 이동합니다. 학생들은 레거시 배열 기반 코드를 현대 표준 라이브러리 컨테이너와 연결하고, 복잡한 다차원 구조를 관리하는 방법을 배웁니다.
학습 성과:
- 반복자와 반복자 산술을 사용해
string과vector컨테이너를 탐색하고 조작한다. - 포인터 산술과
begin/end라이브러리 함수를 사용해 내장 배열을 정의하고 초기화하며 탐색한다. - C스타일 문자열 연산을 구현하고 내장 배열을 현대 라이브러리 타입과 안전하게 연결한다.
🔹 수업 7: 표현식, 연산자 및 변환
개요: 본 수업은 C++ 표현식의 기초 빌딩 블록을 다루며, 언어가 연산을 평가하고 데이터 타입을 관리하는 방식에 초점을 둡니다. 학생들은 lvalue와 rvalue의 차이를 이해하고, 연산자 우선순위 및 결합성 규칙, 산술, 논리, 비트 연산의 메커니즘을 숙지합니다. 또한, 암시적 산술 변환과 명시적 이름 붙은 캐스트의 안전한 적용을 포함한 깊이 있는 타입 관리 방법에 대해 탐구합니다.
학습 성과:
- 객체의 정체성(
lvalue)과 값(rvalue)을 구분하고, 그들이 표현식에서 어떤 역할을 하는지 이해한다. - 우선순위, 결합성, 단락 논리 등을 사용해 복잡한 표현식의 평가 순서를 예측한다.
- 비트 연산자를 사용해 저수준 데이터 조작을 수행하고, 암시적 변환과 명시적 이름 붙은 캐스트를 통해 타입 안전성을 관리한다.
🔹 수업 8: 고급 문장 및 예외 처리
개요: 본 수업은 기본 문장 유형과 범위 규칙부터 시작하여 고급 조건부 및 반복적 논리에 이르는 필수적인 C++ 제어 흐름 구조를 다룹니다. 또한, 표준 라이브러리 예외 계층을 포함한 강력한 오류 처리 기법을 소개합니다.
학습 성과:
- 빈 문장, 단순 문장, 복합 문장의 차이를 구분하고 이러한 구조 내에서 변수 범위를 관리한다.
if와switch문을 사용해 복잡한 의사결정을 구현하며, "висящ는 else"와 같은 논리 오류를 해결한다.- 특정 프로그래밍 작업에 적합한 반복 구조(
while,for, 범위for,do while)를 선택하고 적용한다.
🔹 수업 9: 함수 설계 및 인자 전달
개요: 본 수업은 C++ 함수의 아키텍처를 다루며, 데이터가 모듈화된 코드 블록으로 들어오고 반환되는 방식에 초점을 둡니다. 지역 객체의 생명주기, 인자 전달 방식(값 전달 vs. 참조 전달), 다양한 매개변수를 처리하는 C++11 표준을 탐구합니다. 이러한 개념을 마스터하면 프로그래머는 효율적이고 재사용 가능하며 메모리 안전한 코드를 작성할 수 있습니다.
학습 성과:
- 매개변수 초기화 방법의 차이와 성능 및 데이터 무결성에 미치는 영향을 구분한다.
const퀄리파이어,initializer_list, 배열 전달 기법을 사용해 견고한 함수 인터페이스를 구현한다.- 자동 및 정적 저장 기간을 활용해 객체 생명주기를 효과적으로 관리한다.
🔹 수업 10: 고급 기능 및 오버로딩
개요: 본 수업은 C++ 함수의 복잡한 메커니즘을 다루며, 인자 전달, 객체 생명주기, 함수 오버로딩의 복잡성을 중심으로 합니다. 학생들은 initializer_list를 이용한 다양한 매개변수 처리, constexpr 함수, 함수 포인터의 선언과 사용을 통해 유연하고 모듈화된 코드를 만들 수 있도록 배웁니다.
학습 성과:
- 값 전달과 참조 전달의 차이를 구분하고, 언제
const매개변수를 사용해야 하는지 파악한다. - 후보 함수와 유효 함수 사이에서 "최적 일치"를 결정하기 위한 오버로딩 해석 규칙을 적용한다.
- 함수 포인터를 구현하고 관리하며, 벡터와 같은 컨테이너에서 사용하거나 반환 타입으로 활용한다.
🔹 수업 11: 클래스 캡슐화 및 생성자
개요: 본 수업은 단순한 데이터 구조에서 추상 데이터 타입(ADT)으로의 전환을 다룹니다. 클래스 설계의 메커니즘에 초점을 두며, 멤버 함수, 암시적 this 포인터, 객체 초기화에서 생성자의 중요 역할을 탐구합니다. 또한, 접근 제어(public/private)를 통한 캡슐화와, 구현 세부사항을 숨기면서 깔끔한 인터페이스를 유지하기 위한 "친구"의 사용을 살펴봅니다.
학습 성과:
- 인터페이스와 구현을 분리한 C++ 클래스(예:
Sales_data)를 설계하고 구현한다. - 기본, 오버로드, 명시적 생성자를 사용해 객체 초기화 규칙을 숙지한다.
- 접근 지정자와 친구 선언을 활용해 캡슐화를 강화하고 클래스 범위를 관리한다.
🔹 수업 12: 클래스 범위 및 변환 관리
개요: 본 수업은 고급 C++ 클래스 설계 메커니즘을 다루며, 단순한 데이터 구조에서 견고한 추상 데이터 타입(ADT)으로의 전환을 중심으로 합니다. 주요 주제로는 다양한 생성자 유형을 통한 객체 초기화 관리, explicit 키워드를 사용한 암시적 타입 변환 제어, static 멤버와 리터럴 클래스 같은 클래스 수준 엔티티 이해가 포함됩니다.
학습 성과:
- 접근 지정자와 친구 선언을 사용해 캡슐화된 클래스(ADT)를 설계하고 구현한다.
- 암시적 클래스 타입 변환을 관리하고,
explicit키워드를 사용해 이를 억제한다. - 클래스 전체 데이터 관리를 위해
static클래스 멤버를 구현하고 초기화한다.
🔹 수업 13: 스트림 I/O 및 순차 컨테이너 기초
개요: 본 수업은 C++ 표준 라이브러리의 I/O 시스템과 순차 컨테이너의 기초 메커니즘을 다룹니다. 학생들은 스트림 상태 조사 및 출력 버퍼 제어, 파일 기반 및 문자열 기반 I/O, 라이브러리의 순차 컨테이너 탐색 방법을 배웁니다. 이 수업은 반복자 범위, 컨테이너 초기화, 컨테이너 메모리 관리의 성능 영향에 대한 핵심 개념을 강조합니다.
학습 성과:
- 스트림 상태를 조사하고 재설정하며, 출력 버퍼 플러싱을 제어하여 스트림 무결성을 관리한다.
- 다양한 파일 모드를 사용해
fstream과sstream을 활용하여 지속적 및 메모리 내 데이터 처리를 수행한다. - 접근 패턴과 메모리 오버헤드를 기준으로 적절한 순차 컨테이너를 선택하여 선택을 최적화한다.
🔹 수업 14: 컨테이너 운영 및 일반 알고리즘
개요: 본 수업은 C++ 순차 컨테이너의 관리와 데이터를 컨테이너 타입에 관계없이 처리할 수 있는 일반 알고리즘의 적용을 다룹니다. 컨테이너의 메모리 성장과 요소 생명주기 처리 방식, 람다식과 함수 바인더를 사용한 라이브러리 알고리즘의 사용 방식을 탐구합니다. 학생들은 반복자 범주와 특수화된 알고리즘을 포함한 라이브러리 아키텍처를 마스터합니다.
학습 성과:
forward_list전용 연산, 리사이징 기법,vector용량 관리 등을 사용해 컨테이너 생명주기를 관리한다.- 확장된
string라이브러리와 컨테이너 어댑터를 사용해 복잡한 문자열 조작 및 숫자 변환을 수행한다. - 조건자, 람다 표현식,
std::bind를 통해 사용자 정의 가능한 행동을 통해 데이터를 읽고 쓰며 재정렬하는 일반 알고리즘을 구현한다.
🔹 수업 15: 관련 컨테이너 및 스마트 포인터
개요: 본 수업은 C++11 표준의 관련 컨테이너와 동적 메모리 관리에 대해 다룹니다. 키 기반 검색에 효율적인 정렬 및 비정렬 컨테이너의 사용, 스마트 포인터를 사용한 강력하고 예외 안전한 코드 구현 방법을 설명합니다. 수업은 이러한 복잡한 데이터 구조를 통합한 실제 세계의 텍스트-쿼리 애플리케이션 설계로 마무리됩니다.
학습 성과:
- 효율적인 검색, 삽입, 인덱싱 기술을 사용해 관련 컨테이너를 구현하고 조작한다.
new/delete수동 관리에서 RAII 기반 스마트 포인터와allocator클래스로 전환하여 동적 메모리 관리를 마스터한다.- 참조 카운팅과 스마트 포인터 소유권을 사용해 클래스 간에 데이터를 안전하게 공유하는 복잡한 시스템을 설계한다.
🔹 수업 16: 자원 관리 및 이동 의미론
개요: 본 수업은 "빅 파이브"(Big Five) 특수 멤버 함수를 통해 C++ 클래스가 자원 생명주기를 제어하는 방식을 탐구합니다. 학생들은 값 기반과 포인터 기반 전략을 사용해 동적 메모리 관리를 배우며, 예외 안전한 복사-교환 패턴을 구현하고, C++11의 이동 의미론과 오른쪽 값 참조를 사용해 성능을 최적화합니다.
학습 성과:
- 자원 관리와 메모리 누수 방지를 보장하기 위해 3규칙/5규칙을 구현하고 설명한다.
- 값 기반과 포인터 기반 클래스 행동의 차이를 구분하고 참조 카운팅을 구현한다.
- 오른쪽 값 참조와
std::move를 사용해 큰 객체의 불필요한 깊은 복사를 제거한다.
🔹 수업 17: 연산자 오버로딩 및 상속 (OOP)
개요: 본 수업은 연산자 오버로딩을 통해 언어의 문법을 확장하고, 객체 지향 프로그래밍(OOP)을 통해 확장 가능한 시스템을 구축하는 방법을 탐구합니다. 학생들은 내장 연산과 통합되는 클래스를 설계하고, 상속, 동적 바인딩, 다형적 클래스 계층의 메커니즘을 마스터합니다.
학습 성과:
- C++ 표준 라이브러리 관례에 따라 작동하는 오버로드된 연산자를 설계하고 구현한다.
- 함수 객체와
function타입 래퍼를 생성하고 사용하여 호출 가능한 엔티티를 통합한다. - 가상 함수, 추상 기초 클래스, C++11 접근 지정자를 사용해 견고한 상속 계층을 구성한다.
🔹 수업 18: 템플릿 및 일반화 프로그래밍
개요: 본 수업은 C++ 템플릿의 기본 및 고급 메커니즘을 다루며, 일반화 프로그래밍의 기초를 제공합니다. 학생들은 기본 함수 및 클래스 템플릿 정의에서 시작하여, 가변 템플릿, 완벽한 포워딩, 템플릿 특수화와 같은 C++11 고급 기능을 마스터합니다.
학습 성과:
- 타입과 비타입 매개변수를 사용해 함수 및 클래스 템플릿을 정의하고 인스턴스화한다.
- 템플릿 컴파일 모델을 관리하고, 여러 파일에서의 인스턴스화를 제어하기 위해
extern template를 사용한다. - 트레일링 리턴 타입과
std::forward를 사용한 고급 추론 기법을 구현한다.
🔹 수업 19: 특화된 라이브러리 도구 및 대규모 시스템
개요: 본 수업은 복잡한 시스템 개발을 위한 고급 C++11 표준 라이브러리 구성 요소와 언어 기능을 다룹니다. 특화된 데이터 구조, regex 라이브러리를 통한 강력한 패턴 매칭, 대규모 프로그래밍을 위한 아키텍처 도구를 다룹니다. 또한, 고급 예외 처리, 네임스페이스 관리, 다중 상속의 복잡성도 탐구합니다.
학습 성과:
- 다중 반환 값을 위한
tuple과 비트 수준 플래그 관리를 위한bitset을 활용한다. regex라이브러리를 사용해 복잡한 문자열 패턴 매칭, 검증, 변환을 구현한다.- 엔진과 분포를 사용해 고품질 난수를 생성하며, 상태와 시드링을 올바르게 유지한다.