Top

Boost C++ 애플리케이션 개발 [부스트 라이브러리 예제로 배우는]

  • 원서명Boost C++ application development cookbook (ISBN 9781849514880)
  • 지은이안토니 폴루킨(Antony Polukhin)
  • 옮긴이한정애
  • ISBN : 9788960776678
  • 35,000원
  • 2015년 01월 22일 펴냄 (절판)
  • 페이퍼백 | 440쪽 | 188*235mm
  • 시리즈 : acorn+PACKT

판매처

  • 현재 이 도서는 구매할 수 없습니다.

책 소개

요약

이 책은 우리나라에 부스트(Boost)를 처음으로 정식 소개하는 책이다. 부스트 라이브러리는 C++ STL로 포함되기 전 실험적인 라이브러리들이 철저한 리뷰를 거쳐 정식으로 선보이는 곳이다. 다시 말해 미래의 STL을 미리 접하고 써볼 수 있다는 것이다. 이 책에서는 부스트의 광대한 영역 중 가장 실제 구현에서 자주 쓰일 법한 메모리를 비롯한 자원 관리, 문자열 처리, 다중 스레드 등에 대한 현실적인 레시피를 제시한다. 자신의 프로그래밍 실력을 한층 더 끌어올리고 싶은, 혹은 실질적으로 업무에 도움이 되는 예제를 찾는 중급 이상의 프로그래머에게 적합한 책이다.

이 책에서 다루는 내용

■ 일상적인 용도의 새로운 데이터형 익히기

■ 자원을 잘 관리하기 위한 스마트 포인터 활용

■ 부스트 라이브러리로 다중 스레드 쓰기

■ 여러 가지 작업을 동시에 실행하는 방법

■ 부스트 라이브러리를 사용한 일반적인 문자열 작업 처리

■ 그래프를 다루는 기본적인 방법

■ 컴파일러, 플랫폼, 부스트 버전을 알아내는 다양한 도우미 매크로

■ 선택된 C++ 11 기능을 C++03에서 써보기

이 책의 대상 독자

이 책은 부스트를 처음 접하는 개발자나 부스트를 좀 더 잘 알고 싶고 문서에는 없는 세부 사항과 기법들을 알고 싶은 개발자에게 매우 적합하다. 이미 어느 정도는 C++와 STL의 기본 정도는 알고 있다고 가정하고 이 책을 썼다. 몇몇 장에서는 다중 스레드나 네트워크에 대해 어느 정도의 지식을 갖췄을 거라고 가정했다. 이 책에 나오는 예제들에서 사용될 쓸만한 C++ 컴파일러와 컴파일된 부스트(1.53.0이나 그 이후 버전을 추천)는 갖춰야 한다.

이 책의 구성

1장, ‘첫 애플리케이션 제작’에서는 일상적으로 쓰이는 예제들을 알아본다. 다양한 곳에서 선택사항 구성을 알아내고 부스트 라이브러리를 만든 사람들이 도입한 데이터형을 가지고 어떤 것을 만들어낼 수 있는지 살펴본다.

2장, ‘데이터 변환’에서는 문자열, 숫자와 사용자 정의 데이터형들을 서로 간에 어떻게 변환할 수 있는지, 어떻게 하면 다형적 데이터형을 안전하게 형변환할 수 있는지, 어떻게 C++ 소스 파일 안에 작고 큰 파서를 만들어 넣을 수 있는지 등을 알아본다.

3장, ‘자원 관리’에서는 자원을 쉽게 관리하는 방법과 어떠한 함수 객체라도 저장할 수 있는 데이터형을 사용하는 방법을 알아본다. 이 장을 읽고 나면 좀 더 믿음직한 코드를 작성할 수 있으며 메모리 누수 따위는 지난 과거의 일로 흘려 보낼 수 있다.

4장, ‘컴파일 시간 묘기’에서는 컴파일 시간 검사와 알고리즘 성능 개선뿐 아니라 다른 메타 프로그래밍 작업에 부스트 라이브러리를 사용하는 방법 등을 간단한 예제를 통해 알아본다.

5장, ‘다중 스레드’에서는 스레드 자체와 스레드에 관한 모든 것을 알아본다.

6장, ‘작업 다루기’에서는 작업 처리, 계산과 함수 객체(작업) 사이의 상호 작용 모두를 쪼개어 각각을 독립적으로 처리하게 만들어본다. 더불어 소켓에서 데이터를 받는다든지 특정 시간까지 기다리는 등의 느린 연산들 때문에 막히지 않도록 콜백 작업을 제공한 후 다른 작업을 계속해 처리하는 방법을 알아본다.

7장, ‘문자열 다루기’에서는 문자열을 바꾸고, 검색하고 표현하는 다양한 방법들을 알아본다. 부스트를 사용하면 일반적인 문자열 작업들을 얼마나 쉽게 처리할 수 있는지도 살펴본다.

8장, ‘메타 프로그래밍’에서는 멋지지만 이해하기는 까다로운 메타 프로그래밍 기법에 대해 알아본다. 메타 프로그래밍은 일상적으로 쓰는 기법은 아니지만 일반 라이브러리를 개발할 때는 정말 큰 도움이 된다.

9장, ‘컨테이너’에서는 부스트의 컨테이너들과 그에 관련 모든 것을 알아본다. 이번 장에서는 일상적인 프로그래밍 작업에서 쓰일 수 있고, 성능이 더 좋으며 새로운 애플리케이션을 더 쉽게 만들 수 있게 해주는 부스트 클래스들을 살펴본다.

10장, ‘플랫폼과 컴파일러 정보 모으기’에서는 컴파일러, 플랫폼과 부스트 특성을 알아내는 다양한 도우미 매크로들을 알아본다. 이런 매크로들은 부스트 라이브러리 자체에서도 널리 사용될 뿐 아니라, 어떠한 컴파일러 플래그에서도 동작할 수 있는 이동성 높은 코드를 만들려면 필수로 알아둬야 한다.

11장, ‘시스템 사용’에서는 파일 시스템에 대해 자세히 살펴보고 파일을 생성하고 지우는 방법도 함께 알아본다. 서로 다른 시스템 프로세스끼리 데이터를 주고 받는 방법과 가장 빠른 방식으로 파일을 읽는 방법을 비롯한 여러 기법들도 살펴본다.

12장, ‘빙산의 일각 긁어대기’에서는 크기가 큰 라이브러리들의 일부, 특히 라이브러리를 알아보기 위한 시작 지점이 될만한 부분을 살펴본다. 부스트 라이브러리 중에는 크기가 작고 일상적으로 쓸만한 것도 있지만, 일부 라이브러리는 모든 기능을 설명하려면 책 한 권이 따로 필요한 경우도 있다.

저자/역자 소개

저자 서문

몇 년 전 친구 한 명이 부스트Boost 라이브러리에 대한 책을 찾고 있었다. 그래서 그에게 “문서를 읽지 그래?”라고 했더니 “난 많이 알지도 않고 어디서부터 시작해야 할지도 모르겠어. 부스트는 너무 커. 그걸 다 읽을 시간이 없어.”라고 이야기했다.

이 말이 시사하는 바는 컸다. 하지만, 내 생각에 이 내용만 책에 담는다면 초급자들만 관심을 가질 것 같았다. 전문가들은 C++11의 기능과 관련한 내용과, 새 표준과 이미 있던 부스트 라이브러리를 비교하지 않는 한 흥미를 느끼지 못할 것 같아 이 내용도 책에 담고자 했다.

이외에도 부스트 메일 목록에서 자주 나오곤 하지만, 문서로 다뤄지지 않거나 찾기 힘든 질문들에 대한 답도 추가했다. 또한, 성능에 대한 설명도 좀 더 추가하고나니 대부분의 사람들이 재미있어할 만한 책이 되었다.

이 책은 손쉽게 사용할 수 있는 해결책들을 활용할 수 있도록 해주는 명쾌하고 실용적인 예제들로 구성되어 있다.

이 책은 대부분 C++11에 포함된 부스트 라이브러리의 기본 지식과 메모리 누수가 일어날 수 없게 하는 방법에서부터 시작한다. 자원 관리라는 게 이제는 누워서 떡먹기일 정도로 쉬워질 것이다. 또한, 컴파일 시간에 어떤 일을 할 수 있는지 부스트 컨테이너는 어떤 일을 할 수 있는지도 알아본다. 다중 스레드는 힘들다고 생각하는가? 부스트를 쓰면 전혀 그렇지 않다. 이동성이 높은데 성능도 좋은 서버란건 말도 안 된다고 생각하는가? 이 책을 읽고 나면 정말 놀라게 될 것이다! 컴파일러와 운영체제들이 너무 다르다고? 부스트에선 그렇지 않다. 이미지, 그래프, 디렉토리, 타이머, 파일과 문자열 조작에 이르기까지 모든 사람들이 재미있는 부분들을 찾아낼 수 있을 것이다.

빠르고 이동성이 높은 고품질의 애플리케이션을 만들기 위해 필요한 모든 것을 알아보자. 프로그램을 딱 한 번만 만들면 리눅스, 윈도우, 맥 OS, 안드로이드 운영체제에 이르기까지 원하는 플랫폼에서 사용할 수 있다.

저자 소개

안토니 폴루킨(Antony Polukhin)

러시아에서 태어났으며, 어렸을 때부터 러시아어와 헝가리어를 했고 학교에서는 영어를 배웠다. 또한 재학시절부터 다양한 수학, 물리, 화학 경진 대회에 참가해 수상했다. 대학에 두 번이나 합격했는데 한 번은 도시 수학 경진대회에 참가하기 위해서였고, 내부 대학 수학과 물리 대회에서 높은 점수를 얻기 위해 한 번 더 들어갔다. 대학을 다니는 동안 시험에 참가하지 않은 한 해를 제외하고는 매번 각 교수를 위한 매우 어려운 프로그램을 만들어 항상 ‘A’를 받았다. 대학 시절 지금의 아내를 만났고 최고의 성적으로 대학을 졸업했다. 3년이 넘는 기간 동안 asterisc을 대체하기 위한 프로그램을 개발하는 VoIP 회사에 다녔다. 이 기간 동안 부스트에 공헌하기 시작했으며 부스트의 Boost.LexicalCast 라이브러리의 유지 보수를 맡았다. 이때 우분투 리눅스를 러시아어로 번역하는 일도 함께 시작했다. 현재 그래프 기반 데이터베이스를 위한 쿼리 엔진을 개발하고 있으며 오픈 소스에 대한 공헌도 멈추지 않고 있다. Any, LexicalCast, TypeTraits, Variant 등의 부스트 라이브러리에서 그가 만든 코드를 찾아볼 수 있다.

옮긴이의 말

얼마 전까지 앉던 회사의 내 자리는 정말 구석이어서 혼자서 신나게 코딩할 수 있는 곳이었습니다. 그런데도 가끔 그런 구석까지 누군가가 찾아올 때가 있습니다.

지금까지 여러 가지 프로그래밍 책을 번역했으니, 지금 자신이 처한 상황을 어떻게 하면 깔끔하게 해결하는 방법을 아는지 물어보려는 거지요. 안타깝게도 완벽한 해결책을 제시할 수 없을 때가 많습니다. 기억력에 한계가 있기도 하고, 수많은 라이브러리 기능들을 실제 상황에 모두 적용해본 건 아니다 보니 적합한 기능이 뭔지 확신이 들지 않기도 하기 때문입니다.

이런 상황도 있죠. 버그를 고치다 보니 예전에는 생각하지 못한 무언가가 나타난 겁니다. 이럴 때 정말 고민이 되죠. 그냥 누덕누덕 코드를 기워 넣을까 아니면 전체 구조를 싹 갈아 엎을까. 누덕누덕 기워 넣으면 문제는 확실하게 해결될 거고, 다른 부분은 크게 고치지 않았으니 큰 문제는 생기지 않을 것 같습니다. 하지만, 보기에 아름답지 않잖아요. 그리고 그렇게 몇 번 기워 넣다 보면 더 이상 쳐다보기도 싫게 됩니다. 그렇다면 섣불리 구조를 뜯어 고치면 아무도 검토해본 적 없는 코드가 과연 무탈할까요? 오히려 잠재적으로 더 큰 문제를 안겨주는 건 아닐까요?

이럴 때 이 책에 나온 것처럼 다양한 상황에 대한 검증된 예제를 곁에 두고 있으면 마음이 든든할 것 같습니다. 나와 비슷한 문제를 만났던 사람들이 이미 있었고, 그 사람들이 써보고 검증해본 부스트의 여러 가지 라이브러리를 이용해서 내 문제를 해결할 수 있다면 얼마나 마음 놓이는 일입니까.

그런데 왜 부스트 라이브러리일까요? STL을 쓰면 되는 거 아닐까요? STL만으로도 방대하고 풍부한데 말이에요.”라고 생각하실 수 있습니다. 물론 STL은 표준이고 모든 컴파일러에서 쓸 수 있으며 그것만으로도 거대합니다. 하지만, STL은 표준이기 때문에 엄선된 기능만을 제공합니다. 그에 반해 부스트는 실험적이고 역동적이며 세세합니다. 모두에게 필요한 기능이 아니라 몇몇에게만 필요할지 몰라도 누군가에게는 꼭 필요한 기능을 제공합니다(이를테면 다중 인덱스 컨테이너 같은 거 말이죠).그리고 오랫동안 써온 컴파일러에서도 C++11에서나 쓸 수 있는 새로운 기능을 쓸 수 있다는 건 또 얼마나 멋진 일입니까.

지금 이 책을 살까 말까 고민하면서 이 글을 읽고 계시는 분들에게 어떤 말을 하면 좋을까요? 이 책이 만능은 아닙니다. 여러분이 매일 만나는 모든 문제를 이 책 한 권으로 해결할 수 있는 것도 아닙니다. 그렇지만 여러분이 하고 있는 그 고민을 누군가도 했고 이미 해결한 후 라이브러리로 구축해놨다면, 그리고 그걸 실제 예제를 들어가며 설명해놨다면 여러분 혼자서 처음부터 모두 다시 만들 이유는 없겠지요. 이 책을 곁에 두고 한번 훑어보는 것만으로 디자인하고 구현하고 버그를 잡는 그 기나긴 여정을 단 몇 줄의 라이브러리 함수 호출로 끝낼 수 있을 수도 있습니다. 그것만으로도 이 책의 가치는 충분하지 않을까요?

옮긴이 소개

한정애

서울대학교 컴퓨터공학과를 졸업하고 동 대학원에서 무선 통신에 대한 연구로 박사학위를 받았다. 현재 글로벌 소프트웨어 회사인 SAP에 속한 SAP Labs Korea에서 개발자로 일하고 있다. 리눅스와 리눅스 프로그램 등을 비롯한 컴퓨터와 관련된 다양한 분야에 관심이 많다. 번역서로 에이콘출판사에서 출간한 『리눅스 기반의 임베디드 제품 디자인』(2007), 『C++ 템플릿 가이드』(2008) 및 『두렵지 않은 C++』(2013), 『C++ 표준 라이브러리』(2013)가 있다.

목차

목차
  • 1장. 첫 애플리케이션 제작
    • 소개
    • 선택사항 구성 알아내기
    • 컨테이너나 변수에 아무 값이나 저장
    • 컨테이너나 변수에 선택한 여러 가지 데이터형 저장
    • 여러 데이터형을 저장하는 컨테이너 안전하게 사용
    • 실제 값이 없어도 값이나 플래그 반환
    • 함수에서 배열 반환
    • 여러 값들을 하나로 연결
    • 함수의 파라미터 순서 다시 정렬
    • 함수 파라미터에 값 묶기
    • C++11 이동 에뮬레이션 사용
    • 복사할 수 없는 클래스 생성
    • 복사할 수는 없지만 이동은 할 수 있는 클래스 생성

  • 2장. 데이터 변환
    • 소개
    • 문자열에서 숫자로 변환
    • 숫자에서 문자열로 변환
    • 숫자에서 숫자로 변환
    • 사용자 정의 데이터형과 문자열 간 변환
    • 다형적 객체의 형 변환
    • 간단한 입력 파싱
    • 입력 파싱

  • 3장. 자원 관리
    • 소개
    • 영역을 벗어나지 않는 클래스에 대한 포인터 관리
    • 메소드를 통해 접근하는 배열에 대한 포인터의 참조 횟수 관리
    • 영역을 벗어나지 않는 배열에 대한 포인터 관리
    • 메소드를 통해 접근하는 클래스에 대한 포인터의 참조 횟수 관리
    • 변수에 아무 함수 객체나 저장
    • 변수에 함수 포인터 전달
    • 변수에 C++11 람다 함수 전달
    • 포인터 컨테이너
    • 영역을 벗어날 때 뭔가 처리하기
    • 파생 클래스의 멤버로 기본 클래스 초기화

  • 4장. 컴파일 시간 묘기
    • 소개
    • 컴파일할 때 크기 검사
    • 정수 데이터형에 대해 템플릿 함수 사용하게 만들기
    • 실수 데이터형에 대해 템플릿 함수 사용 못하게 만들기
    • 숫자에서 데이터형 생성
    • 데이터형 특질 구현
    • 템플릿 파라미터에 맞춰 최적인 연산자 선택
    • C++03에서 표현식의 데이터형 알아내기

  • 5장. 다중 스레드
    • 소개
    • 실행 스레드 생성
    • 공통 자원에 대한 접근 동기화
    • 원자 연산으로 공통 자원에 빠르게 접근
    • Work_queue 클래스 생성
    • 다중-읽기-단일-쓰기 잠금
    • 스레드가 개별적으로 갖는 변수 생성
    • 스레드 인터럽트
    • 스레드 그룹 다루기

  • 6장. 작업 다루기
    • 소개
    • 임의의 데이터형을 처리하는 작업 등록
    • 타이머를 만들고 타이머 이벤트를 작업으로 처리
    • 네트워크 통신을 작업으로 처리
    • 들어오는 접속 받아들이기
    • 동시에 여러 가지 작업 실행
    • 컨베이어식 작업 처리
    • 작업 다루기
    • 잠금 없는 장벽 생성
    • 예외를 저장하고 작업으로 생성
    • 시스템 신호를 작업처럼 얻고 처리

  • 7장. 문자열 다루기
    • 소개
    • 대소문자 바꾸기와 대소문자 구별없이 비교
    • 정규 표현식을 써서 문자열 일치 비교
    • 정규 표현식을 써서 문자열 찾고 바꾸기
    • Printf와 비슷하고 안전한 함수로 문자열 형식 맞추기
    • 문자열 바꾸고 삭제
    • 두 반복자로 문자열 표현
    • 문자열 데이터형에 대한 참조자 사용

  • 8장. 메타 프로그래밍
    • 소개
      • ‘데이터형의 벡터’라는 데이터형 사용
    • 데이터형의 벡터 다루기
    • 컴파일할 때 함수의 결과형 알아내기
    • 고차원 메타 함수 생성
    • 메타 함수 게으르게 계산
    • 튜플 요소를 문자열로 변환
    • 튜플 나누기

  • 9장. 컨테이너
    • 소개
    • 엄청 빠르게 문자열 비교
    • 비정렬 집합과 맵 사용
    • 값이 키이기도 한 맵 생성
    • 다중 인덱스 컨테이너 생성
    • 단일 연결 리스트와 메모리 풀의 장점
    • 일차원 연결 컨테이너 사용

  • 10장. 플랫폼과 컴파일러 정보 모으기
    • 소개
    • Int128 지원하는지 알아내기
    • RTTI 지원하는지 알아내기
    • C++11 외부 템플릿 사용해 컴파일 속도 높이기
    • 더 간단한 메소드를 사용해 메타 함수 생성
    • C++11에서 사용자 정의 데이터형의 성능은 높이고 코드 크기는 줄이기
    • 이동 가능한 방식으로 함수와 클래스를 내보내고 불러들이기
    • 부스트 버전 알아내고 최신 기능 가져오기

  • 11장. 시스템 사용
    • 소개
    • 디렉토리 내 파일 나열
    • 파일과 디렉토리 만들고 지우기
    • 한 프로세스에서 다른 프로세스로 빠르게 데이터 옮기기
    • 프로세스 간 통신 동기화
    • 메모리 안에서 포인터 쓰기
    • 가장 빠르게 파일 읽기
    • 코루틴 - 상태를 저장한 후 실행을 잠시 미루기

  • 12장. 빙산의 일각 긁어대기
    • 소개
    • 그래프 써보기
    • 그래프 보여주기
    • 진짜 난수 생성기 사용
    • 이동 가능 수학 함수 쓰기
    • 테스트 생성
    • 여러 테스트를 묶어 테스트 모듈로 생성
    • 이미지 다루기

도서 오류 신고

도서 오류 신고

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

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

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

정오표

정오표

2015. 7 .10

p41, 6행

부정확한 동작을 하게 아니라 → 부정확하게 동작하는 것이 아니라

p67, 14행

기본 지식은 갖추기면 정말 좋겠다. → 기본 지식은 갖추면 정말 좋겠다.

p85, 1행에서 아래 문구 삭제

<--코드에는 iosteam여서 바꿈

p151, 5행

함수 함수 → 함수

p226, 3행 "스레드 안전하다." 설명

"스레드 안전하다."라는 표현은, 여러 스레드가 동시에 실행되고 있더라도 예상하는 방식대로 동작한다는 뜻입니다. 즉, 각 스레드가 수정되고 있는 도중의 내용을 보는 일이 없다는 것입니다.

p418, 10행

관리자들에 따르면 이번 예제에 사용한 수학 함수들을 괄호로 둘러싸서 C 매크로와 충돌하는 일을 막게 좋다.

관리자들의 충고에 따라 이번 예제에 사용한 수학 함수들을 괄호로 둘러싸서 C 매크로와 충돌하는 일을 막는게 좋다.

2016. 5. 16

[p.35: 6행]
//변수의 실제 값이 std::string이 아니라면
->
//변수의 실제 값이 정수가 아니라면