본문 바로가기
학교/책

전문가를 위한 C++

by ehei 2024. 4. 23.

 

 

1600쪽에 달하는 상당히 두꺼운 책이었다. 읽는데 1년 넘게 걸린 것 같다. 읽다가 지쳐서 쉬고 또 쉬고... 최근에 꾸준히 읽겠다는 마음을 먹고 아침, 저녁으로 통근 길에 쭈욱 읽었더니 생각보다 진도가 빨랐다. 비야네가 쓴 C++ 책을 읽고 정말 오랜만에 읽었다. 상당히 많은 내용이 바뀐 걸 느꼈다. 무엇보다 C++ 20 대상이기 때문에 더욱 그럴 것이다. C++의 문법 뿐아니라 알아야 할 모든 것을 제시하고 연습 문제까지 포함되어 있는 점이 매우 훌륭하다. 초반에는 좀 풀다가 나중에는 게으름으로 넘어갔다. 템플릿 프로그래밍을 익히면서 느꼈지만 직접 해보지 않고는 머슬 메모리에 기록되지 않는다...

 

내 경험으로 C++이야말로 페어 프로그래밍/리뷰가 필수적인 언어인 것 같다. 모르고 쓰면 실수하기 너무나 쉽고 그것이 성능 하락으로 이어진다. 그렇게 되면 힘들여 C++을 쓸 필요가 없다는 결론까지 치닫게 된다. 현재 C++은 만능 언어처럼 되어버려 끝없는 배움을 강요하는 것처럼 보인다. 하지만 나한테는 여전히 매력적인 프로그래밍 언어이다. 나의 지적 허영을 채우고 학습 의욕을 북돋기 때문일 것이다.

 

나는 나중에 필요한 기능을 찾아 써보고자 훝어보는데 중점을 두었다. 전반부의 많은 부분은 이전 교과서에도 능히 봤음직한 클래스, 상속, 다형성 등에 대한 이야기로 시작한다. 중반부부터는 난이도가 상승하는데, C20에서 추가된 점이 합쳐서 읽는 속도가 느려진다. 후반으로 가면 구현 측면에 집중하여, 설계/프레임워크/패턴 등이 나오고 쉬엄쉬엄 읽을 만하다. 가장 인상적인 부분은 최후반에 읽어서 그런지 C++ 면접 예상 질문이었다. 오랜 기간동안 C++을 해온 나도 쉽사리 대답하기 어려운 것들이 꽤 있었다. 아무래도 언어의 특징에 파고들기보다 구현 측면에 집중한 탓이겠지만... 그래서 일부 질문은 옮겨 쓰고 나 만의 답도 써보고자 한다.


 

1장 C++와 표준 라이브러리 초단기 속성 코드

  • 3방향 비교 연산자(C20)
    • 이건 몇번을 봤는데도 쓰질 않으니 금방 까먹는다... 어쨌거나 이전의 비교 연산은 연산자를 통해 결과를 bool로 알려줬다. 하지만 이제는 상태로 알려준다. 특이한 모양으로 우주선 연산자란 이름은 유명하다. 크게 strong/partial/weak ordering으로 분류된다. 정수 연산은 분명하게(strong) 처리할 수 있다. 실수는 NaN, inf의 존재로 인해 부분적으로(partial) 비교된다. 반면 문자열 "HELLO"와 "hello"의 경우 <=, >= 등의 연산은 의미가 없다. 이 경우 약하게(weak) 비교할 수 있다. 이들 연산은 서로 변환이 가능하여 필요한만큼 사용하면 된다. 물론 weak -> partial -> strong으로는 변환할 수 없다.
    • 예) auto result = std::string{"A"} <=> std::string{"B"};
  • 타입 앨리어스와 typedef 작동 원리
  • 어트리뷰트에 대한 기본 개념

2장, 21장: 스트링과 스트링 뷰 다루기

  • 로케일과 패싯의 개념

7장 메모리 관리

  • 스택과 프리스토어를 그림으로 표현할 줄 알아야 한다. 내부 메커니즘을 이해하는 데 도움이 되기 때문이다.

12장, 26장: 템플릿으로 제네릭 코드 만들기, 고급 템플릿

  • 엘리어스 템플릿의 개념과 typedef 보다 나은 이유

14장: 에러 처리

  • const 레퍼런스로 익셉션 잡기
  • 기본 익셉션 타입보다 익셉션 계층을 구성하는 것이 좋은 이유
  • 익셉션이 발생했을 때 스택 풀기가 일어나는 과정
  • 생성자와 소멸자에서 에러를 처리하는 방법

15장: C++ 연산자 오버로딩

  • 사용자 정의 리터럴을 정의할 수 있다는 사실을 설명한다

16-20장, 25장: 표준 라이브러리

  • <bit>에서 제공하는 비트 연산(C20)
  • 제거 후 삭제(remove-erase) 패턴
  • 표준 라이브러리 확장 방법
  • 표준 라이브러리에 대한 의견

22장: 날짜와 시간 유틸리티

  • 컴파일 시간 유리수

23장: 무작위수 기능

  • 무작위수 엔진, 어댑터, 분포(distribution) 등을 이용하여 무작위수를 생성하는 방법

27장: C++ 멀티스레드 프로그래밍

  • std::jthread에서 제공하는 부가 기능(C20)
  • 세마포어, 래치, 배리어의 개념
  • 여러 스레드에 걸쳐 익셉션을 복제하고 다시 던지는 방법

28장: 소프트웨어 공학 기법

  • 예전에 경험한 프로세스

30장: 테스트 숙달하기

  • 블랙박스 테스트와 화이트박스 테스트의 차이
    • 블랙박스 이름 그대로 박스 안이 새까맣서 내용을 모른채 검사하는 것이다. 반대로 화이트박스는 내부 구조를 잘 알고 테스트를 하는 것이다. 주로 유닛 테스트 등을 작성할 때는 후자일 것이다.
  • 하이레벨 테스트 기법
  • 이전 회사에서 경험한 테스트와 QA 환경, 그리고 그들의 장단점

지금은 졸려서 나중에...