Top

모던 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 서비스를 사용해 볼 것이다.

저자/역자 소개

지은이의 말

C++는 가장 널리 쓰이는 프로그래밍 언어 중 하나로, 게이밍, GUI 프로그래밍, 운영체제 등 수 많은 분야에서 사용되고 있다. 지난 수 년 동안, C++는 전 세계 소프트웨어 개발자들에게 최선의 선택지가 되는 언어로 발전해 왔고 여전히 그 자리를 지키고 있다. 이 책은 주목할 만한 C++의 기능과 함께 애플리케이션의 요구사항을 어떻게 구현해 충족시킬 수 있는지를 보여준다. 이 책에서 다루는 고유한 문제들은 언어에 대한 독자의 지식을 시험하려는 것이 아니라, 좀더 다른 관점에서 생각하고 최선의 해결 방법을 찾아 나가도록 스스로 시험해볼 기회를 제공한다. 1장부터 다양한 범위의 도전적인 문제들을 만나게 될 것이다. 해결 과정에서 벽에 부딪히더라도 책에서 안내하는 방법으로 차근차근 진행한다면 낙담할 필요가 없다.

지은이 소개

마리우스 반실라(Marius Bancila)

15년 동안 산업과 금융 솔루션을 개발해 온 소프트웨어 엔지니어다. 『모던 C++ 프로그래밍 쿡북』(에이콘, 2019)을 썼으며, 주로 마이크로소프트(Microsoft)의 기술을 바탕으로 C++와 C#을 이용한 데스크톱 애플리케이션을 개발하고 있다.
자신의 전문 기술 지식을 다른 사람들과 공유해 온 열정을 인정받아 10년이 넘는 기간 동안 마이크로소프트 MVP로 활동하고 있다. 트위터 계정 @mariusbancila를 통해 그에게 연락할 수 있다.

옮긴이의 말

C++의 최초 구현체가 등장한 지 35년이라는 시간이 지났고, 한때 이 언어에 대한 부정적인 전망이 가득하던 시절도 있었다. 그러나 C++는 오늘날까지 여전히 세계에서 가장 널리 사용되는 프로그래밍 언어 순위표의 윗자리를 공고히 지키고 있다. C++에는 다른 언어들에 없는 강점이 있기 때문이다.
C++의 강점은 분명하다. 무엇보다도 성능이다. 개발자는 고수준의 추상화를 유지하면서도 타깃 하드웨어에 최적화된 저수준의 코드를 이용해 고성능 프로그램을 제작할 수 있다. 오늘날 대부분의 플랫폼에서 네이티브 컴파일러를 지원하므로 이러한 강점이 극대화된다. 이 장점은 인공지능과 머신러닝에 대해 관심이 높아진 오늘날에 들어 더욱 빛을 발한다. 머신러닝 프레임워크들 대부분 내부적으로 C++를 기반으로 작성돼 있으며, 특히 연구 영역을 벗어나 실제 상용화되는 제품을 제작하는 과정에서는 직접 C++를 사용하는 것 이외의 선택지를 생각할 수 없을 때가 많다.
또한 C++는 진보적이다. 멀티 패러다임을 표방하는 언어답게 다른 어떤 언어보다도 빠르게 새로운 개념과 문법들을 표준으로 받아들이고 있다. 이를 통해 높은 런타임 성능을 유지하면서도 훨씬 짧고 간결하며 직관적인 코드를 작성할 수 있게 됐다.
하지만 C++는 결코 배우기 쉬운 언어가 아니다. 때로는 위에서 언급한 장점들이 오히려 진입 장벽으로 작용하기도 한다. 메모리 관리와 같은 기능들을 직접 다뤄야 하기 때문에 프로그램을 안전하게 동작하도록 만들려면 주의해야 할 점이 많다. 언어의 고유한 특징으로 인해 프로그램을 설계할 때 다른 언어를 이용할 때와는 다른 접근법이 필요할 때도 있다. 이러한 상황에 대한 해법들이 실제로는 어느 정도 패턴으로 정형화돼 있기는 하지만 초보자나 중급자 입장에서 이를 잘 이해하고 직접 활용하기는 어려운 일이다. 표준에 새롭게 추가된 기능들을 완전히 활용하기 위해서 때로는 코드를 이전과는 완전히 다른 개념을 바탕으로 작성해야 할 필요도 있는데, 이는 사실 C++에 익숙한 사용자라도 결코 쉬운 일이 아니다.
지은이의 말에서도 언급했듯이, 프로그래밍 언어를 익히는 가장 좋은 방법은 실전에서 직접 언어의 기능을 활용해 프로그램을 작성해보며, 좋은 코드를 많이 읽는 것이다. 하지만 이를 혼자 연습하는 일은 생각보다 쉽지 않다. 적당한 주제를 고르기도 어려울 뿐더러, 주제를 고르더라도 주제에 맞춰 가이드가 될 만한 좋은 코드를 찾는 것이 어렵기 때문이다. 이 책은 이러한 상황에 처한 이들에게 좋은 참고서다. 실무에서 겪을 법한 다양한 주제의 연습 문제와 함께 모던 C++의 새로운 기능들을 활용한 풀이를 담고 있다.
이 책은 언어 기능 자체를 학습하기 위한 튜토리얼을 제공하지는 않는다. 아마 이 책만으로 모던 C++를 익히기에는 충분하지 않을 텐데, 문제에서 주어지는 내용들이 구체적이지 않아 때로는 불친절하게 느껴질 수도 있다. 하지만 이 책의 목적은 분명하다. 바로 실무에 가까운 경험을 통해 스스로 문제를 정의하고, 사고의 틀을 넓혀 문제를 능숙하게 해결할 수 있는 능력을 기를 수 있도록 돕는 것이다. 이 책은 그런 면에서 정말 좋은 책이라 할 수 있다.
풀이를 참조하기 전에 꼭 문제에 대해 고민할 시간을 가질 수 있기를 바란다. 혼자서 생각하는 것도 좋고, 인터넷 검색이나 다른 책을 참조하는 것도 좋다. 나름대로 풀이를 작성하고, 책에서 제시하는 풀이를 참고해 자신의 코드를 더욱 개선할 수 있다. 조금 더 고민한다면 책에서 제시하는 것보다 더 나은 방법을 찾아볼 여지도 얼마든지 있다. 이 책을 읽으며 고민할 만한 거리를 많이 얻을 수 있기를 바란다. 결국 여러분을 전문가로 만드는 것은 이러한 고민들의 시간이기 때문이다.

옮긴이 소개

전지민

글로벌 반도체 기업의 연구소에서 음성 인터페이스와 자율 주행 자동차 등의 인공지능 개발 프로젝트에 참여해 왔다. 현재는 캐나다 밴쿠버에 거주하며 대규모 웹 서비스 개발과 운영에 참여하고 있다.

목차

목차
  • 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. 텍스트를 임의의 언어로 번역하기

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안