모던 C++ 챌린지 [100가지 문제로 익히는 모던 C++의 다양한 기능]
- 원서명Modern C++ Challenge: Become an expert programmer by solving real-world problems (ISBN 9781788993869)
- 지은이마리우스 반실라(Marius Bancila)
- 옮긴이전지민
- ISBN : 9791161754147
- 30,000원
- 2020년 05월 28일 펴냄
- 페이퍼백 | 380쪽 | 188*235mm
- 시리즈 : 프로그래밍 언어
책 소개
소스 파일은 아래 깃허브 페이지에서 내려 받으실 수 있습니다.
(https://github.com/AcornPublishing/modern-cplus-challenge)
요약
C++는 업계와 학계를 비롯한 다양한 분야에서 지난 수십 년 동안 널리 사용되며 자리를 공고히 해왔다. 하지만 C++는 결코 배우기 쉬운 언어가 아니다. 한 가지 언어를 통달하는 데 가장 좋은 방법은 실무에서 다양한 프로그램을 작성하며 직접 그 언어의 특징을 활용해 보는 것이지만, 그런 기회를 찾기는 쉽지 않다. 이 책은 모던 C++에서 제공하는 다양한 기능과 표준 라이브러리, 더 나아가 서드 파티 크로스 플랫폼 라이브러리를 활용할 수 있도록 구성된 실전에서 볼 수 있을 법한 100가지 연습 문제를 담고 있다. 이 책이 모던 C++ 학습에 좋은 동반자가 될 것이다.
이 책에서 다루는 내용
■ JSON과 XML 데이터 직렬화 및 역직렬화
■ 사용자 간의 안전한 통신을 위해 메시지 암호화하고 서명
■ SQLite 데이터베이스를 애플리케이션에 내장하고 사용
■ 스레드와 비동기 함수를 이용해 범용 병렬 알고리즘 구현
■ 파일을 ZIP 파일로 압축하고 복원
■ 원형 버퍼나 우선순위 큐 같은 데이터 구조 구현
■ 특정한 문제를 풀기 위한 알고리즘과 함께 범용 알고리즘 구현
■ TCP/IP로 통신하는 클라이언트-서버 애플리케이션 개발
■ HTTP REST 서비스 사용
■ 디자인 패턴을 이용해 실전 문제 해결
이 책의 대상 독자
C++를 배우는 중이거나 연습을 위한 도전 과제를 찾고 있다면 이 책은 당신을 위한 것이다. 다른 언어에 대한 경험이 있는지와 관계없이, C++를 배우는 모두에게 도움이 될 수 있는 실용적인 연습 문제와 실전 문제로 구성됐다. 언어나 표준 라이브러리의 기능을 설명하기보다(그런 것들은 책이나 문서, 튜토리얼 비디오를 통해 배울 수 있다) 다양한 난이도의 과제를 수행하며 다른 자료에서 배운 기술들을 활용할 수 있도록 한다. 사실 이 책의 문제들은 언어에 구애 받지 않기 때문에 C++로 된 풀이에서 직접적인 도움을 받기는 어렵겠지만 다른 프로그래밍 언어를 배울 때도 사용할 수 있을 것이다.
이 책의 구성
1장, ‘수학 문제’에서는 다음 장들에서 다룰 더 어려운 문제들에 앞서 몸을 푸는 과정으로, 수학 연습 문제로 구성돼 있다.
2장, ‘언어 기능’에서는 연산자 오버로딩, 이동 의미론, 사용자 정의 리터럴부터 가변인자 함수, 폴드 표현식, 타입 추론과 같은 템플릿 메타프로그래밍 측면까지 언어가 제공하는 기능들을 연습할 수 있는 문제들을 실었다.
3장, ‘문자열과 정규 표현식’에서는 문자열과 다른 데이터 타입 간의 변환, 문자열의 분할과 결합, 정규 표현식을 이용한 작업에 이르기까지 문자열을 조작하는 방법과 관련된 문제를 풀어본다.
4장, ‘스트림과 파일 시스템’에서는 출력 스트림 조작을 비롯해 C++ 17의 filesystem 라이브러리로 파일과 디렉토리를 다뤄본다.
5장, ‘날짜와 시간’에서는 곧 출시될 C++ 20 확장에 포함된 chrono 라이브러리를 미리 체험해본다. 또한 새로 추가된 표준을 바탕으로 만들어진 date 라이브러리로 풀이할 수 있는 달력과 타임존에 관련된 다양한 문제를 살펴본다.
6장, ‘알고리즘과 데이터 구조’에서는 기존에 알려진 표준 알고리즘을 활용해 풀 수 있는 다양한 문제를 포함해, 원형 버퍼나 우선순위 큐를 이용해 자신만의 범용 알고리즘을 구현해야 하는 문제도 알아본다. 이 장은 진화 알고리즘과 셀룰러 오토마타를 배울 수 있는 두 가지 흥미로운 문제인 도킨스의 족제비 프로그램과 콘웨이의 라이프 게임 프로그램을 구현해보는 것으로 마무리한다.
7장, ‘동시성’에서는 스레드와 비동기 함수를 사용해 범용적인 병렬 알고리즘을 구현하는 문제와 함께 동시성과 관련된 몇 가지 실전 문제를 풀어본다.
8장, ‘디자인 패턴’에서는 데코레이터, 컴포지트, 책임 연쇄, 템플릿 메소드 등 디자인 패턴으로 해결할 수 있는 일련의 문제를 알아본다.
9장, ‘데이터 직렬화’에서는 몇 가지 문제를 통해 일반적으로 가장 많이 사용되는 직렬화 포맷인 JSON과 XML을 다룬다. 또한 서드 파티 오픈소스 크로스 플랫폼 라이브러리를 사용해 PDF 파일 만들기에 도전해본다.
10장, ‘압축, 이미지, 데이터베이스’에서는 zip 압축 파일과 관련된 문제를 해결하고, 캡차(Captcha) 방식의 시스템이나 바코드 생성기와 같은 실전 문제를 위해 PNG 파일을 만들어본다. 또한 애플리케이션에 SQLite 데이터베이스를 내장하고 활용해본다.
11장, ‘암호화’에서는 주로 데이터 암호화와 사이닝을 위해 Crypto++ 라이브러리를 사용하는 방법을 배운다. 또한 자신만의 Base64 인코딩 및 디코딩 유틸리티를 구현해본다.
12장, ‘네트워킹과 서비스’에서는 TCP/IP를 통해 통신하는 자신만의 클라이언트-서버(Client-server) 애플리케이션을 구현해본다. 또한 비트코인 환율 조회나 문자 번역 API와 같은 다양한 REST 서비스를 사용해 볼 것이다.
목차
목차
- 1장. 수학 문제
- 1. 3이나 5로 나누어 떨어지는 자연수의 합을 계산하는 프로그램 구현하기
- 2. 최대공약수 프로그램 구현하기
- 3. 최소공배수 프로그램 구현하기
- 4. 주어진 수보다 작은 가장 큰 소수를 계산하는 프로그램 구현하기
- 5. 섹시 소수 짝을 출력하는 프로그램 구현하기
- 6. 과잉수 출력 프로그램 구현하기
- 7. 친화수 짝을 출력하는 프로그램 구현하기
- 8. 암스트롱 수를 출력하는 프로그램 구현하기
- 9. 소인수 분해 프로그램 구현하기
- 10. 그레이 코드 출력 프로그램 구현하기
- 11. 로마 표기법 변환 프로그램 구현하기
- 12. 가장 긴 콜라츠 수열 출력 프로그램 구현하기
- 13. 파이 값 계산 프로그램 구현하기
- 14. ISBN 검증 프로그램 구현하기
- 2장. 언어 기능
- 15. IPv4 데이터 형식 표현하는 함수 작성하기
- 16. 범위 안에 있는 IPv4 주소 열거하기
- 17. 기본적인 연산을 지원하는 2차원 배열 만들기
- 18. 여러 수를 인자로 받는 최소 함수 작성하기
- 19. 컨테이너에 여러 값 삽입하기
- 20. 조건별 컨테이너 안의 원소 확인하는 함수 작성하기
- 21. 시스템 핸들 래퍼 작성하기
- 22. 온도 단위 리터럴을 제공하는 라이브러리 작성하기
- 3장. 문자열과 정규 표현식
- 23. 바이너리 데이터를 문자열로 변환하기
- 24. 문자열을 바이너리 데이터로 변환하기
- 25. 문자열을 제목 형식으로 바꾸기
- 26. 구획 문자로 나누어진 문자열 합치기
- 27. 구획 문자 리스트를 바탕으로 문자열을 토큰으로 분리하기
- 28. 가장 긴 회문 부분 문자열 출력하기
- 29. 차량 번호판 검증하기
- 30. URL 추출하기
- 31. 날짜를 문자열로 변환하기
- 4장. 스트림과 파일 시스템
- 32. 파스칼의 삼각형
- 33. 프로세스를 표로 출력하기
- 34. 텍스트 파일에서 빈 줄 제거하기
- 35. 디렉토리 크기 계산하기
- 36. 주어진 날짜보다 오래된 파일 삭제하기
- 37. 디렉토리에서 정규 표현식과 일치하는 파일 찾기
- 38. 임시 로그 파일
- 5장. 날짜와 시간
- 39. 함수 실행 시간 측정하기
- 40. 두 날짜 사이의 날 수를 반환하기
- 41. 주어진 날짜의 요일 찾기
- 42. 한 해의 몇 번째 날인지 찾기
- 43. 여러 시간대에 걸친 회의 시각 출력하기
- 44. 달력 출력하기
- 6장. 알고리즘과 데이터 구조
- 45. 우선순위 큐 데이터 구조 구현하기
- 46. 원형 버퍼 데이터 구조 구현하기
- 47. 이중 버퍼 구현하기
- 48. 범위 안에서 가장 빈번하게 등장하는 원소와 등장 횟수를 반환하기
- 49. 텍스트 히스토그램 구하기
- 50. 전화번호 목록 필터링하기
- 51. 전화번호 목록 변형하기
- 52. 문자열로 만들 수 있는 모든 순열 생성하기
- 53. 영화 평균 평점 계산하여 출력하기
- 54. 쌍 알고리즘 함수 작성하기
- 55. 결합 알고리즘 함수 작성하기
- 56. 선택 알고리즘 함수 작성하기
- 57. 정렬 알고리즘 함수 작성하기
- 58. 노드 사이의 최단 경로 계산하여 출력하기
- 59. 족제비 프로그램 구현하기
- 60. 생명 게임 구현하기
- 7장. 동시성
- 61. 병렬 변환 알고리즘 작성하기
- 62. 스레드 기반 병렬 최솟값, 최댓값 탐색 알고리즘 작성하기
- 63. 비동기 함수 기반 병렬 최솟값, 최댓값 탐색 알고리즘 작성하기
- 64. 병렬 정렬 알고리즘 작성하기
- 65. 스레드 컴포넌트가 안전하게 콘솔에 로그 메시지를 출력하는 함수 작성하기
- 66. 고객 서비스 시스템 구현하기
- 8장. 디자인 패턴
- 67. 패스워드 검증 프로그램 구현하기
- 68. 임의의 패스워드를 생성하는 프로그램 구현하기
- 69. 사회보장번호 생성 프로그램 구현하기
- 70. 승인 시스템 구현하기
- 71. 관측 가능한 벡터 컨테이너 작성하기
- 72. 할인가 적용해 최종 가격 계산하는 프로그램 구현하기
- 9장. 데이터 직렬화
- 73. XML 직렬화 및 역직렬화하기
- 74. XPath를 이용해 XML 데이터 선택하기
- 75. 데이터를 JSON으로 직렬화하기
- 76. JSON으로부터 데이터 역직렬화하기
- 77. 영화 목록을 PDF로 출력하기
- 78. 이미지 집합에서 PDF 생성하기
- 10장. 압축, 이미지, 데이터베이스
- 79. ZIP 아카이브 파일 안의 파일 찾기
- 80. ZIP 아카이브 압축하고 해제하기
- 81. 패스워드가 있는 ZIP 아카이브 압축하고 해제하기
- 82. 국기 PNG 파일 만들기
- 83. 텍스트 검증 PNG 생성하기
- 84. EAN-13 바코드 생성기 구현하기
- 85. SQLite 데이터베이스에서 영화 정보 읽어들이기
- 86. SQLite 데이터베이스에 영화 정보 삽입하기
- 87. SQLite 데이터베이스에서 영화 이미지 다루기
- 11장. 암호화
- 88. 카이사르 암호법을 적용한 프로그램 구현하기
- 89. 비즈네르 암호법을 적용한 프로그램 구현하기
- 90. 베이스64 인코딩을 적용한 프로그램 구현하기
- 91. 사용자 자격을 증명하는 인증 프로그램 구현하기
- 92. 파일 해시를 계산하는 프로그램 구현하기
- 93. 파일 암호화 및 복호화 프로그램 구현하기
- 94. RSA 암호화로 파일 서명 및 변조 여부 확인 프로그램 구현하기
- 12장. 네트워킹과 서비스
- 95. 호스트의 IP 주소 찾기
- 96. 피즈-버즈 게임을 위한 클라이언트-서버 프로그램 구현하기
- 97. 비트코인 환율 표시 프로그램 구현하기
- 98. IMAP을 이용해 이메일 가져오기
- 99. 텍스트를 임의의 언어로 번역하기