본문 바로가기

컴퓨터 서적

크로스플랫폼 핵심 모듈 설계의 기술 - 모바일, 리눅스, 맥, 윈도우를 아우르는 C++ 라이브러리 구축 바이블



기술 트렌드에 관계 없이 개발자라면 언젠가 누구나 겪을 법한 내용을 핵심 모듈과 크로스 플랫폼 설계의 관점에서 정리하였다. 변수, 문자열, 예외 처리, 암호화, 디버깅, 테스팅 등 수많은 분야에서 여러분이 알고 있는 지식들을 더욱 더 견고하게 해줄 것이다.

중복 코드를 제거하기 위해 컴파일러와 링커를 응용하는 방법들, 윈도우와 리눅스의 유니코드 처리방식에 대해 정확하게 이해할 수 있는 TCHAR의 기술, 견고한 코드를 작성하게 하는 예외 처리의 기술, 오픈 소스 혹은 상용 제품들의 로그 옵션들에 대해 속속들이 알게 해주는 디버그 로그 개발 기법 등을 담았다.

지은이의 말 
이 책을 읽는 방법 

1장 크로스 플랫폼으로 개발하라
1.1 왜 C++인가? 
1.2 핵심 모듈은 무엇인가? 
1.2.1 핵심 모듈의 첫 번째 특성 : 목적 
1.2.2 핵심 모듈의 두 번째 특성 : 생명력 
1.2.3 핵심 모듈의 세 번째 특성 : 진입장벽 
1.3 아키텍트는 누구인가? 
1.4 크로스 플랫폼으로 개발하라 
1.4.1 크로스 플랫폼 개발 기법 : 런타임 기법과 컴파일 기법 
1.4.2 크로스 플랫폼 개발이 필요한 두 가지 관점: 디바이스와 개발 인력 

2장 개발 기법
2.1 개발 기법의 필요성 
2.2 컴파일러의 활용 
2.2.1 상호 참조 오류 
2.2.2 선언과 구현의 분리 
2.2.3 선언에 직접 구현하는 경우 
2.3 링커 
2.3.1 링커의 역할 
2.3.2 정적 라이브러리 생성 
2.3.3 동적 라이브러리 생성 
2.3.4 템플릿의 사용과 링크 에러 
2.4 모듈 트리 
2.4.1 규모가 큰 모듈의 종속성 문제 
2.4.2 모듈의 순환 참조 구조 
2.4.3 핵심 모듈의 형태 
2.5 공통 헤더 파일(stdafx.h)과 대표 헤더 파일의 활용 68
2.6 테스트 기법 
2.6.1 가장 간단한 테스트 코드 
2.6.2 테스트 모듈의 일반화 
2.6.3 테스트 조건 구성 

3장 핵심 모듈 설계
3.1 네임스페이스의 사용 
3.2 세부 모듈 정의 
3.3 모듈 매트릭스 
3.4 크로스 플랫폼 
3.5 오픈소스의 적용 
3.6 소스코드 구조 
3.7 개발 환경 구축 
3.7.1 GUI 개발 환경 
3.7.2 콘솔 개발 환경 
3.8 코드 중복의 제거를 위한 원소스 듀얼 컴파일 

4장 변수형 정의
4.1 기본적으로 제공되는 변수형 
4.2 long형 변수에 대해서 
4.2.1 개발자들 사이에 논란이 있는 각 변수형의 크기 
4.2.2 플랫폼에 따라 달라지는 변수의 크기 
4.2.3 왜 long형 변수만 차이가 날까? 
4.3 개념적 변수형 정의 
4.4 포인터 변수형 정의 
4.5 const 변수형 정의 
4.6 문자 변수형 정의 
4.7 리눅스 계열 정의 

5장 문자열 함수들
5.1 TCHAR 타입 
5.2 char형 함수들과 wchar_t형 함수들 
5.3 문자열 함수 구현의 필요성 
5.4 중복 코드 회피 기법 
[여기서잠깐] 반복적인 코드를 회피하는 방법 
5.5 표준 문자열 함수들 
[여기서잠깐] static 함수에 대해서 
5.6 StringCch, StringCb 함수들 
5.7 String..Ex 함수들 
5.8 std::string 함수들 
5.9 와일드카드가 포함된 문자열 비교 함수 
5.10 숫자 변환 함수들 
5.10.1 숫자에서 문자열로 변환하는 함수군 
5.10.2 자연수 파싱 함수 
5.10.3 8진법, 16진법 파싱 함수 
5.10.4 정수 파싱 함수 
5.10.5 실수 파싱 함수 
5.10.6 지수 표기 파싱 함수 
5.10.7 문자열에서 변수로 변환하는 함수군 
5.10.8 문자열에서 템플릿 변수로 변환하는 함수군 

6장 유니코드
6.1 ASCII 코드와 EUCKR, 멀티바이트 스트링 
6.2 코드 페이지와 유니코드 문자 집합 
[여기서잠깐] EUCKR과 코드페이지 949에 대해서 
6.3 유니코드 인코딩 
6.4 UTF8, UTF16, UTF32 
6.5 유니코드와 char, wchar_t 변수형의 관계 
6.6 유니코드 인코딩 변환 함수들 
6.7 코드를 작성할 때 필요한 변환 함수들 
6.8 BOM에 대해서 
6.9 유니코드 변환 함수 구현 
6.9.1 유니코드 인코딩 변환 함수 선언 
6.9.2 WCS 및 MBS 변환 함수 선언 
6.9.3 TCS 및 NTCS 변환 함수 선언 및 구현 
6.9.4 WCS 및 MBS 변환 함수 구현 
6.9.5 윈도우용 유니코드 문자셋 변환 함수 구현 
6.9.6 리눅스용 유니코드 문자셋 변환 함수 구현 
6.9.7 유니코드 인코딩 변환 함수 구현 

7장 예외처리
7.1 예상치 못한 예외 상황 
7.2 try-catch 구문 사용 
7.3 무엇을 던지고 무엇을 받을 것인가? 
7.4 exception 객체의 생명 주기 
7.5 함수 바깥으로 예외 던지기 
7.6 실무에서의 예외처리 기법 

8장 인코딩, 암호화, 암호식
8.1 용어의 정리 
8.2 인코딩의 여러 개념 
8.3 해시 함수 구현 
8.4 Base64 구현 
[여기서잠깐] 메모리 반환 방식에 대해서 
8.5 대칭키 암호화 구현 
8.5.1 블록 암호화 알고리즘 
8.5.2 블록 암호화 키와 함수 
8.5.3 블록 암호화 운용 방식 
8.5.4 블록 암호화의 설계 
8.5.5 인터페이스 코드 작성 
[여기서잠깐] 인터페이스를 class가 아닌 struct로 선언하는 이유는? 
[여기서잠깐] 다이아몬드 상속 구조에 대해서 
8.5.6 알고리즘 코드 작성 
8.5.7 운용 방식 코드 작성 
[여기서잠깐] 인터페이스 소멸자 virtual 선언의 중요성 
8.6 비대칭키 암호화 
8.6.1. 디피-헬먼 키 교환 
8.6.2. RSA 암호식 
8.6.3. 엘가말 암호식 
8.6.4. ECC 암호식 
[여기서잠깐] 타원 곡선 암호화에 대해서 
8.6.5. 비대칭키 암호화 함수 정의 
8.6.5. 비대칭키 암호화 함수 구현 

9장 디버그 로그 함수 구현
9.1 무엇을 남길 것인가? 
9.2 모든 로그가 필요한 것인가? 
9.3 로그의 1차 분류 : 지역 
9.4 로그의 2차 분류 : 타입 
9.5 로깅 함수 인터페이스 
9.6 로그 메시지의 선택적 상세화 
9.7 어디에 로그 메시지를 남길 것인가? 
9.8 성능 vs 정확성 
9.9 로그 파일 로테이션 
[여기서잠깐] 로그 파일 로테이션 버그 경험에 대해서 
9.10 로그 인스턴스 관리 
9.11 로그 함수들을 핵심 모듈의 어느 위치에 둘 것인가? 
9.12 로그 인스턴스 소멸 시점 369 싱글톤이 무엇인가요? 

10장 크로스 플랫폼 구축
10.1 크로스 플랫폼 코드의 기초 
10.2 에러 코드 처리 
10.2.1 반환되는 에러 코드에 따라 로직을 구현해야 하는 경우 
10.2.2 직접 개발한 함수에서의 에러 코드 사용 
[여기서잠깐] 또 다른 에러 코드 처리 방법에 대해서 
10.2.3 에러 코드 타입 정의 
10.3 컴파일 기법 
10.4 플랫폼 고유의 함수들 
10.5 크로스 플랫폼 코드의 최종 형태 
10.6 공통 함수 정의 
10.6.1 함수명에 대해서 
10.6.2 리턴 값 처리 

11장 시스템 공통 함수들
11.1 유닉스 시간 변환 함수 
11.2 윈도우 시간 변환 함수 
11.3 요일 계산 함수 
11.4 현재 시스템의 엔디안 판단 함수 
11.5 바이트 오더링 변환 함수군 
11.6 빅엔디안/리틀엔디안으로부터 복원하는 함수군

12장 윈도우: 시스템 정보 함수군
12.1 에러 코드 조회 및 설정 
[여기서잠깐] 스레드에 안전한 스레드 지역 변수에 대해서 
12.2 지역 시간과 협정 세계 시간 
12.3 타임존 
12.4 사용자 및 컴퓨터 이름 조회 
[여기서잠깐] 날짜 변경선과 본초자오선에 대해서 
[여기서잠깐] GetComputerName 함수 호출할 때의 버퍼 크기 
12.5 스레드와 프로세스 ID 및 핸들 조회 
12.6 경과 시간 계산 및 유휴 상태 설정 

13장 윈도우: 파일 및 디렉토리 관련 함수군
13.1 POSIX 파일 함수 
13.2 네이티브 파일 함수 
13.3 시스템 디렉토리와 임시 디렉토리 
13.4 파일 존재 여부 확인, 복사, 이동, 삭제 
13.5 디렉토리 생성, 삭제 
13.6 디렉토리 탐색 
[여기서잠깐] 클래스 변수가 담겨있는 구조체의 초기화 
13.7 현재 실행 경로 확인, 설정 
13.8 현재 파일명 얻어오기 

14장 윈도우: 멀티 스레드 동시성 제어 함수들 커널 객체란? 
14.1 세마포어 
14.2 뮤텍스 
[여기서잠깐] 뮤텍스를 이용한 프로세스 생성 제한 기법 
14.3 크리티컬 섹션 
14.4 이벤트 
14.5 원자성이 보존되는 함수군 
[여기서잠깐] 변수의 volatile 선언에 대해서 

15장 윈도우: 프로세스와 스레드, 동적 라이브러리
15.1 스레드 
[여기서잠깐] 윈도우의 커널 객체 관리 함수들 
15.2 스레드 우선순위 
15.3 프로세스 관련 함수군 
15.4 동적 라이브러리 호출 
15.5 동적 라이브러리 제작 
15.6 공유 메모리, 메모리 매핑 파일 
16장 리눅스 : 시스템 정보 함수군
16.1 에러 코드 조회 및 설정 
16.2 지역 시간과 협정 세계 시간 
16.3 타임존 
16.5 사용자 및 컴퓨터 이름 조회 
16.6 스레드와 프로세스 ID 및 핸들 조회 
16.7 경과 시간 계산 및 유휴 상태 설정 

17장 리눅스: 파일 및 디렉토리 관련 함수군
17.1 POSIX 파일 시스템 함수 
17.1.1 네이티브 파일 함수 
17.2 시스템 디렉토리, 임시 디렉토리 
[여기서잠깐] 파일 경로 만들 때의 팁 
17.4 파일 존재 여부 확인, 복사, 이동, 삭제 
17.4.1 파일 존재 여부 확인하기 : access( ) 
17.4.2 파일 복사하기 : API가 존재하지 않음 
17.4.3 파일 이동하기 : rename( ) 
17.4.4 파일 삭제하기 : unlink() 
17.5 디렉토리 생성, 삭제 
17.6 디렉토리 탐색 
17.7 현재 실행 경로 확인, 설정 
17.8 현재 파일명 얻어 오기 
[여기서잠깐] dladdr로 파일 경로 조회에 실패하는 경우에 대해서 

18장 리눅스: 멀티 스레드 동시성 제어 함수들
18.1 세마포어 
18.1.1 세마포어 함수군 
18.1.2 세마포어 객체 관리 방식 : 윈도우 
18.1.3 세마포어 객체 관리 방식 : 리눅스 
18.1.4 세마포어 함수군 작성하기 605 SharedPointer에 대해서 
18.2 뮤텍스 
18.2.1 뮤텍스의 특성 
18.2.2 뮤텍스 구현하기 
18.3 크리티컬 섹션 
18.4 이벤트 
18.5 원자성이 보존되는 함수군 

19장 리눅스: 프로세스와 스레드, 동적 라이브러리
19.1 스레드 
19.1.1 스레드 제어 함수 소개 
19.1.2 스레드 함수 구현하기 
19.2 스레드 우선순위 
19.2.1 스레드 스케줄링 정책과 우선 순위 조정 
19.2.2 스레드 우선순위에 따른 실행 결과 확인 
19.3 프로세스 관련 함수군 
19.4 동적 라이브러리 호출 
19.5 동적 라이브러리 제작 
19.6 공유 메모리, 메모리 매핑 파일 

20장 맥: OS X를 위한 시스템 함수들 구현
20.1 이름 없는 세마포어 
20.2 일부 상수들의 이름 변경 
20.3 현재 파일명을 얻어오는 GetFileName 함수 
20.4 리눅스에만 존재하고 맥에는 존재하지 않는 함수들 

21장 자주 쓰이고 유용한 클래스들
21.1 복제 방지 클래스 
21.2 크리티컬 섹션, 뮤텍스 클래스 
21.3 세마포어 클래스 
21.4 텍스트 파일 접근 클래스 
21.4.1 텍스트 파일을 읽어오는 클래스 
21.4.2 텍스트 파일로 저장하는 클래스 
21.5 동기화 큐 클래스 
21.6 락프리 큐 클래스 
21.7 링형 락프리 큐 클래스 
[여기서잠깐] 락프리 큐의 명과 암 
21.8 메모리 접근 인터페이스 
21.9 메모리 매핑된 파일 클래스 
21.10 공유 메모리 클래스 

22장 자주 쓰이고 유용한 함수들
22.1 파일을 읽어오는 함수 
22.2 파일에 기록하는 함수 
22.3 파일 경로를 정규화하는 함수 
22.4 파일 경로를 절대 경로로 만들어주는 함수 
22.5 파일 경로에서 일부만 추출하는 함수들 
22.6 파일 해시 값 생성 함수군 
22.7 파일 시스템을 뒤져보는 함수 
22.8 파일이나 디렉토리 목록을 읽어오는 함수 
22.9 다단계 디렉토리를 생성, 파괴하는 함수 
22.10 하위 파일과 디렉토리를 복사하는 함수 
22.11 클래스 내부의 스레드 생성 함수 

맺음말 
찾아보기




저자의 말
최근에는 Boost 등의 이미 잘 만들어진 크로스플랫폼 모듈들이 제공되고 있는데, 왜 그와 비슷한 코드를 다시 작성해야 하느냐고 비판할지 모릅니다. 물론 결과물 자체는 무의미할 수 있습니다. 하지만 개발하는 과정에서 겪는 여러 가지 문제들의 해결책을 찾으면서 얻게 되는 설계 및 개발 지식들은 이후의 다른 소프트웨어를 개발할 때 분명히 큰 도움이 될 것입니다. 단순히 사용하기만 해서는 그런 내공을 쌓을 수가 없습니다. 게다가 다른 사람보다 더 깊이 있는 지식을 얻기 위해서는 무의미한 이런 시도가 거의 유일한 방법일지도 모릅니다.

이 책은 지금 당장 유행하는 기술에 관한 책이 아니다. 기술 트렌드에 관계 없이 개발자라면 언젠가 누구나 겪을 법한 내용을 핵심 모듈과 크로스 플랫폼 설계의 관점에서 정리하였다. 변수, 문자열, 예외 처리, 암호화, 디버깅, 테스팅 등 수많은 분야에서 여러분이 알고 있는 지식들을 더욱 더 견고하게 해줄 것이다. 지금 당장은 아니더라도 앞으로 닥칠 위기에 크게 도움을 줄 수도 있다. 차근차근 처음부터 읽어볼 수도 있고 관심 분야를 선택해서 읽어볼 수 있게 구성하였다.

대상 독자
1. 개발 기본기가 부족해 실무에서 삽질이 많은 개발자
2. 개발 경력이 많지만 특급 개발자로 내세우기엔 2%가 부족한 개발자
3. JAVA 등의 다른 언어의 한계에 도달해 C++을 배우고 싶은 개발자
4. 윈도우 개발자가 리눅스로, 리눅스 개발자가 윈도우로 영역을 넓히고 싶은 개발자
5. 대칭키와 공개키 암호화에 대해 제대로 알고 싶은 개발자 
6. 시스템 API와 친하지 않은 개발자
7. 리눅스 서버와 통신하는 윈도우 클라이언트 개발자 혹은 그 반대
8. 정적 라이브러리와 동적 라이브러리를 자유자재로 다루고 싶은 개발자
9. 프로세스 생성과 공유 메모리, 파일 시스템 등을 잘 이해하고 싶은 개발자
10. 타임존과 그 프로그래밍 방법에 대해 배우고 싶은 개발자
11. 스레드와 동기화 객체에 대해 뿌리 깊이 이해하고 싶은 개발자
12. 나만의 공통 모듈을 개발하고 싶은 개발자
13. 유니코드로 인해 고통받는 개발자
14. 이 모든 것을 다 떠나서 친구 같은 개발 바이블을 갖고 싶은 개발자

주요 내용
어떤 플랫폼에서도 자유롭게 실행되는 코딩의 기술

_중복 코드를 제거하기 위해 컴파일러와 링커를 응용하는 방법들
_윈도우와 리눅스의 유니코드 처리방식에 대해 정확하게 이해할 수 있는 TCHAR의 기술
_견고한 코드를 작성하게 하는 예외 처리의 기술
_오픈 소스 혹은 상용 제품들의 로그 옵션들에 대해 속속들이 알게 해주는 디버그 로그 개발 기법
_서로 다른 인코딩을 쉽게 사용하기 위한 인터페이스를 구축하기 위한 기술
_윈도우와 리눅스, 맥뿐 아니라 모바일 플랫폼 안드로이드와 아이폰까지 전천후로 개발할 수 있는 크로스 플랫폼의 기술
_규칙성과 불규칙성에서 배우는 윈도우 시스템 함수들
_윈도우 시스템과 차이점과 공통점을 배울 수 있는 리눅스 시스템 함수들
_리눅스와 아주 유사하며 일부가 다른 맥 시스템 함수들
_크로스 플랫폼 완성 후에 주요한 기능 중심으로 클래스와 함수를 만들어내는 기술

편집자 코멘트
저자와의 인연은 로드북의 사람 냄새 나는 프로그래밍 에세이 시리즈인 [사람과 프로그래머]의 여섯 번째 책인 [보안에 미쳐라]의 공동저자로 시작되었다. 같은 공저자인 필명 미친감자님으로부터 "흔치 않은 아키텍트가 있으니 꼭 저자로서 추천한다"는 말을 처음엔 흘려들었는데, 진지함과 개발에 대한 프로의식이 묻어난 그의 에세이에 반하고 말았다. 그리고 이어진 몇 번의 만남과 대화. 십수 년 IT 전문서 분야에서 글로 먹고 살다 보니, 코딩을 전문으로 하지는 않았지만 코드를 보지 않더라도 대화를 하다 보면 그 사람의 내공이 느껴진다. "잡아야겠다. 이 사람." 그리고 2년을 고생시켰다. 결국엔 출판하는 날이 왔지만, 짠하고 미안한 마음도 든다. 마지막까지 이미지의 해상도까지 걱정하며 수정하던 저자의 노력에 편집자로서 많은 감사를 드린다.
최근에, 인공지능이나 웹 서비스 위주의 책들을 보면서, 다시 한번 C++ 개발자들이 볼 만한 고급서적이 나온 것에 만족한다. 또 한 권의 책을 라인업하면서 다음 책을 준비하는 여정을 떠나야 하기는 하지만, 이 책과 함께 한 여정은 편집자로서 큰 추억이었고 행복 그 자체였다.