본문 바로가기
books

전문가를 위한 C++

by kanlee2010 2022. 4. 16.

C++17, 제네릭 람다, STL, 템플릿, 디자인 패턴, 객체지향의 원리를 익히는 확실한 방법

Modern C++ 관련 서적을 찾아 보니 막상 많이 없었는데 이 책이 좋은 것 같았습니다. 6장까지 클린 코드, 설계 관련 내용들이 좀 길게 이어지는데 실제 상세 내용을 바로 보고 싶으신 분은 Part 3에서 부터 시작하셔도 될 것 같습니다...🐱‍🏍

 

 

 

 

 

 

 

[Part 1 전문가를 향한 C++의 첫걸음]

CHAPTER 1 C++와 표준 라이브러리 초단기 속성 코스
_1.1 C++의 기초
_1.2 C++의 고급 기능
_1.3 C++의 객체지향 언어 특성
_1.4 유니폼 초기화
_1.5 표준 라이브러리
_1.6 첫 C++ 프로그램
_1.7 정리

CHAPTER 2 스트링과 스트링 뷰 다루기
_2.1 동적 스트링
_2.2 정리

CHAPTER 3 코딩 스타일
_3.1 코딩 스타일의 중요성
_3.2 코드 문서화
_3.3 코드 분할
_3.4 명명 규칙
_3.5 언어의 기능에 스타일 적용하기
_3.6 포매팅
_3.7 스타일과 관련하여 해결할 문제
_3.8 정리

[Part 2 전문가답게 C++ 소프트웨어 디자인하기]

CHAPTER 4 전문가다운 C++ 프로그램 디자인
_4.1 프로그램 디자인의 정의
_4.2 프로그램 디자인의 중요성
_4.3 C++에 적합한 디자인 방법
_4.4 C++ 디자인에 관련된 두 가지 원칙
_4.5 코드 재사용
_4.6 체스 프로그램 디자인
_4.7 요약

CHAPTER 5 객체지향 디자인
_5.1 절차형 사고방식
_5.2 객체지향 철학
_5.3 객체의 관점에서 바라보기
_5.4 객체 관계
_5.5 추상화
_5.6 요약

CHAPTER 6 재사용을 고려한 디자인
_6.1 재사용 철학
_6.2 코드를 재사용할 수 있도록 디자인하는 방법
_6.3 요약

[Part 3 전문가답게 C++ 코딩하기]

CHAPTER 7 메모리 관리
_7.1 동적 메모리 다루기
_7.2 배열과 포인터의 두 얼굴
_7.3 로우레벨 메모리 연산
_7.4 스마트 포인터 :
    std::unique_ptr - 고유 소유권, 스코프를 벗어나면 자원 해제
    auto unique = make_unique<Class>();
    std::shared_ptr - 공유 소유권, 스코프를 벗어나면 레퍼런스가 감소되고 레퍼런스 카운트가 0이 되면 자원 해제
    auto shared = make_shared<Class>();
_7.5 흔히 발생하는 메모리 문제
_7.6 요약

CHAPTER 8 클래스와 객체 숙달하기
_8.1 스프레드시트 예제
_8.2 클래스 작성 방법
_8.3 객체의 라이프 사이클
    생성자를 하나라도 선언하면 디폴트 생성자가 자동으로 생성되지 않는다. 이를 추가하려면
    ClassConstructor() = default; 를 추가한다.
    위임 생성자는 생성자 이니셜라이저에서만 호출 해야 한다.

_8.4 요약

CHAPTER 9 클래스와 객체 마스터하기
_9.1 friend
_9.2 객체에 동적 메모리 할당하기
    메모리를 동적으로 할당한 객체를 default 복제 생성자나 default 대입 연산자를 사용하면 얕은 복제만 수행한다.
    깊은 복제를 하기 위해서는 직접 복제 생성자나 대입 연산자를 구현해야 한다.
    5의 규칙 (소멸자, 복제 생성자, 이동 생성자, 복제 대입 연산자, 이동 대입 연산자)
    깊은 복제가 필요할 때 이동 생성자가 정의되면 컴파일러는 해당 객체를 복제하지 않고 이동시킨다.
    handleMessage(std::string& message) - 좌측값 인자
handleMessage(std::string&& message) - 우측값 인자
    std::string a = "Hello", b = "World";
    handleMessage(a); // 좌측값    ↔    handleMessage(a+b); // 우측값
    handleMessage(std::move(a)); // 우측값 (좌측값 인자 함수가 없을 때)
    Constructor(ClassName&& src) noexcept; // 이동 생성자, std::move()와 std::swap()으로 구현
    ClassName& operator=(ClassName&& rhs) noexcept; // 이동 대입 연산자, std::move()와 std::swap()으로 구현
_9.3 메서드의 종류
_9.4 데이터 멤버의 종류
_9.5 중첩 클래스
_9.6 클래스에 열거 타입 정의하기
_9.7 연산자 오버로딩
_9.8 안정된 인터페이스 만들기
_9.9 요약

CHAPTER 10 상속 활용하기
_10.1 상속을 이용한 클래스 구현
_10.2 코드 재사용을 위한 상속
_10.3 부모를 존중하라
_10.4 다형성을 위한 상속
_10.5 다중 상속
_10.6 상속에 관련된 미묘하면서 흥미로운 문제들
_10.7 요약

CHAPTER 11 C++의 까다롭고 유별난 부분
_11.1 레퍼런스
    임시 객체는 const reference만 가능
    std::string getString() { return "Hello World"; } // 임시 객체 반환
    const std::string& str = getString(); // std::string str = getString(); ← Compile error
_11.2 키워드 혼동
    constexpr int get_size() { return 32; }
    int array[get_size()]; // const int get_size() 이면 Compile error
    constexpr는 컴파일 시간에 계산 완료 되어야 한다.
_11.3 타입과 캐스팅
    static_cast : 우리가 흔히 생각하는, 언어적 차원에서 지원하는 일반적인 타입 변환
    const_cast : 객체의 상수성(const) 를 없애는 타입 변환. 쉽게 말해 const int 가 int 로 바뀐다.
    dynamic_cast : 파생 클래스 사이에서의 다운 캐스팅
    reinterpret_cast : 위험을 감수하고 하는 캐스팅으로 서로 관련이 없는 포인터들 사이의 캐스팅 등
_11.4 스코프

_11.5 어트리뷰트
_11.6 사용자 정의 리터럴
_11.7 헤더 파일
_11.8 C 유틸리티
_11.9 요약

CHAPTER 12 템플릿으로 제네릭 코드 만들기
_12.1 템플릿 소개
_12.2 클래스 템플릿
_12.3 함수 템플릿
_12.4 변수 템플릿
_12.5 요약

CHAPTER 13 C++ I/O 완전 분석
_13.1 스트림 사용법 (cout : character out)
cout, cin, cerr, clog, wcout, wcin, wcerr, wclog)
cout.write(), cout.put(), cout.flush(), cout.good(), cout.bad(), cout.fail(), cout.eof(), cout.clear()
cout.flush();
if (cout.fail()) { //<-- if (!cout) {
_13.2 스트링 스트림
_13.3 파일 스트림
_13.4 양방향 I/O
_13.5 요약

CHAPTER 14 에러 처리하기
_14.1 에러와 예외
_14.2 익셉션 처리 과정
_14.3 익셉션과 다형성
_14.4 익셉션 다시 던지기
_14.5 스택 풀기와 청소
_14.6 익셉션 처리 과정에서 흔히 발생하는 문제
_14.7 모두 합치기
_14.8 요약

CHAPTER 15 C++ 연산자 오버로딩하기
_15.1 연산자 오버로딩 개요
_15.2 산술 연산자 오버로딩하기
_15.3 비트 연산자와 논리 연산자 오버로딩하기
_15.4 스트림 입출력 연산자 오버로딩하기
_15.5 인덱스 연산자 오버로딩하기
_15.6 함수 호출 연산자 오버로딩하기
_15.7 역참조 연산자 오버로딩하기
_15.8 변환 연산자 구현하기
_15.9 메모리 할당과 해제 연산자 오버로딩하기
_15.10 요약

CHAPTER 16 C++ 표준 라이브러리 둘러보기
_16.1 코드 작성법
_16.2 C++ 표준 라이브러리 둘러보기
_16.3 요약

CHAPTER 17 컨테이너와 반복자 살펴보기
_17.1 컨테이너 개요
_17.2 순차 컨테이너
_17.3 컨테이너 어댑터
_17.4 정렬 연관 컨테이너
_17.5 비정렬 연관 컨테이너(해시 테이블)
_17.6 기타 컨테이너
_17.7 요약

CHAPTER 18 표준 라이브러리 알고리즘 마스터하기
_18.1 알고리즘 개요
_18.2 std::function
_18.3 람다 표현식
_18.4 함수 객체
_18.5 표준 라이브러리 알고리즘 심층 분석
_18.6 알고리즘 예제: 선거인 명부 검사
_18.7 요약

CHAPTER 19 스트링 현지화와 정규 표현식
_19.1 현지화
_19.2 정규 표현식
_19.3 요약

CHAPTER 20 여러 가지 유틸리티 라이브러리
_20.1 ratio 라이브러리
_20.2 chrono 라이브러리
_20.3 무작위수 생성
_20.4 optional
_20.5 variant
_20.6 any
_20.7 tuple
_20.8 파일시스템 지원 라이브러리
_20.9 요약

[Part 4 C++ 고급 기능 마스터하기]

CHAPTER 21 표준 라이브러리 커스터마이즈 및 확장
_21.1 할당자
_21.2 스트림 반복자
_21.3 반복자 어댑터
_21.4 표준 라이브러리 확장하기
_21.5 요약

CHAPTER 22 고급 템플릿
_22.1 템플릿 매개변수에 대한 심화 학습
_22.2 클래스 템플릿 부분 특수화
_22.3 오버로딩으로 함수 템플릿 부분 특수화 흉내내기
_22.4 템플릿 재귀
_22.5 가변 인수 템플릿
_22.6 메타프로그래밍
_22.7 요약

CHAPTER 23 C++ 멀티스레드 프로그래밍
_23.1 들어가며
_23.2 스레드
_23.3 아토믹 연산 라이브러리
_23.4 상호 배제
_23.5 조건 변수
_23.6 promise와 future
_23.7 멀티스레드 Logger 클래스 예제
_23.8 스레드 풀
_23.9 바람직한 스레드 디자인과 구현을 위한 가이드라인
_23.10 요약

[Part 5 C++ 소프트웨어 공학]

CHAPTER 24 소프트웨어 공학 기법
_24.1 프로세스의 필요성
_24.2 소프트웨어 라이프 사이클 모델
_24.3 소프트웨어 공학 방법론
_24.4 나만의 프로세스와 방법론 만들기
_24.5 소스 코드 관리
_24.6 요약

CHAPTER 25 효율적인 C++ 코드 작성법
_25.1 성능과 효율성에 대하여
_25.2 언어 차원의 효율성
_25.3 디자인 차원의 효율성
_25.4 프로파일링
_25.5 요약

CHAPTER 26 테스트 숙달하기
_26.1 품질 관리
_26.2 단위 테스트
_26.3 하이레벨 테스트
_26.4 성공적인 테스트를 위한 팁
_26.5 요약

CHAPTER 27 디버깅 완전 정복
_27.1 디버깅 기본 원칙
_27.2 버그 분류
_27.3 버그 방지
_27.4 버그 대비
_27.5 정적 어서션
_27.6 디버깅 테크닉
_27.7 요약

CHAPTER 28 디자인 기법과 프레임워크
_28.1 흔히 사용하지만 까먹기 쉬운 문법
_28.2 고급 기법
_28.3 객체지향 프레임워크
_28.4 요약

CHAPTER 29 디자인 패턴
_29.1 반복자 패턴
_29.2 싱글턴 패턴
_29.3 추상 팩토리 패턴
_29.4 프록시 패턴
_29.5 어댑터 패턴
_29.6 데코레이터 패턴
_29.7 책임 사슬 패턴
_29.8 옵저버 패턴
_29.9 요약

CHAPTER 30 크로스 플랫폼과 크로스 언어 애플리케이션 개발 방법
_30.1 크로스 플랫폼 개발
_30.2 크로스 언어 개발
_30.3 요약

[부록 A] C++ 면접 예상 질문
[부록 B] 참고 문헌
[부록 C] 표준 라이브러리 헤더 파일
[부록 D] UML 기초

'books' 카테고리의 다른 글

컴퓨터과학이 여는 세계  (0) 2022.04.16
Effective Modern 이펙티브 모던 C++  (0) 2022.04.16
클린 아키텍쳐  (0) 2022.04.16
클린 코드  (0) 2022.04.16
코딩의 기술  (0) 2021.10.04

댓글