CHAPTER 1 프로그래밍 및 문제 해결 방법에 대한 개관 1.1 프로그래밍의 개요 ... 2 프로그래밍이란 무엇인가? ... 2 어떻게 프로그램을 작성하는가? ... 2 1.2 프로그래밍 언어란 무엇인가? ... 8 1.3 컴퓨터란 무엇인가? ... 12 1.4 전산 전문직의 윤리와 책임 ... 17 소프트웨어 불법복제 ... 17 자료의 비공개성 ... 17 컴퓨터 자원의 사용 ... 18 소프트웨어 공학 ... 19 1.5 문제 해결 기법 ... 20 질문하라 ... 20 친숙한 것을 찾아라 ... 20 유추(Analogy)를 이용하여 풀어라 ... 21 수단-목적 분석(Means-Ends Analysis) ... 22 나누어 해결(Divide and Conquer) ... 23 블록쌓기 접근 방법(The Building-Block Approach) ... 23 답 합치기(Merging Solutions) ... 24 정신적 장벽 : 시작을 두려워함 ... 24 알고리즘적 문제 해결 ... 25 요약 ... 25 CHAPTER 2 C++ 구문법 및 의미론과 프로그램 개발 과정 2.1 C++ 프로그램 요소 ... 28 C++ 프로그램 구조 ... 28 구문법과 의미론 ... 31 구문법 템플릿 ... 32 프로그램 구성요소 명명하기 : 식별자 ... 34 자료와 자료형 ... 35 구성요소 명명하기 : 선언 ... 37 행동 개시 : 실행문(Executable Statements) ... 41 최소한의 것 외 : 프로그램에 주석 달기 ... 46 2.2. 프로그램 작성 ... 47 블록(복합문) ... 49 C++ 전처리기 ... 51 이름 공간에 대한 소개 ... 52 2.3 출력에 대해 좀 더 자세히 ... 54 빈 줄 만들기 ... 54 출력행 내에 공백 삽입하기 ... 55 테스트와 디버깅 ... 61 요약 ... 62 즉석 체크 ... 63 시험 준비 연습문제 ... 65 프로그래밍 워밍업 연습문제 ... 68 프로그래밍 문제 ... 69 CHAPTER 3 수치 자료형, 표현식, 출력 3.1 C++ 자료형의 개관 ... 72 3.2 수치 자료형 ... 73 정수형 ... 73 부동소수점형 ... 74 3.3 수치 자료형의 선언 ... 75 이름상수 선언 ... 75 변수 선언 ... 76 3.4 간단한 산술식 ... 77 산술 연산자 ... 77 증감연산자 ... 80 3.5 복합 산술식 ... 81 우선순위 규칙 ... 82 형 강제 변환 및 명시적 형 변환 ... 83 3.6 함수 호출 및 라이브러리 함수 ... 86 값 반환 함수 ... 86 라이브러리 함수 ... 88 Void 함수 ... 89 3.7 출력 형식 지정 ... 90 정수 및 문자열 ... 91 부동소수점 수 ... 93 3.8 기타 string 연산 ... 98 length와 size 함수 ... 98 find 함수 ... 99 substr 함수 ... 101 테스트와 디버깅 ... 106 요약 ... 107 시험 준비 연습문제 ... 110 프로그래밍 워밍업 연습문제 ... 113 프로그래밍 문제 ... 116 CHAPTER 4 프로그램의 입력과 소프트웨어 설계 과정 4.1 프로그램에 자료 넣기 ... 120 입력 스트림과 추출 연산자(>>) ... 120 읽기 표시와 새줄문자 ... 123 get 함수로 문자 자료 읽기 ... 125 ignore 함수를 사용하여 문자들 건너뛰기 ... 127 문자열 자료 읽기 ... 128 4.2 대화식 입출력 ... 129 4.3 비대화식 입출력 ... 131 4.4 파일 입출력 ... 132 파일들 ... 132 파일 사용하기 ... 133 파일을 사용하는 예제 프로그램 ... 136 실행중 파일명의 입력 ... 138 4.5 입력 실패 ... 140 4.6 Software 설계 방법론 ... 141 4.7 객체란 무엇인가? ... 143 4.8 객체지향 설계 ... 144 4.9 함수 분해 ... 145 모듈 ... 147 설계에 대한 개관 ... 148 테스트와 디버깅 ... 154 요약 ... 156 즉석 체크 ... 157 시험 준비 연습문제 ... 158 프로그래밍 워밍업 연습문제 ... 161 프로그래밍 문제 ... 163 CHAPTER 5 조건들, 논리식들 그리고 선택 제어구조들 5.1 제어의 흐름 ... 166 5.2 조건과 논리식 ... 167 부울(bool) 자료형 ... 167 논리식 ... 168 연산자 우선순위 ... 174 부동소수점형과 관계연산자 ... 175 5.3 If문 ... 177 If-Then-Else 형식 ... 177 블록(복합문) ... 179 If-Then 형식 ... 180 흔한 실수 ... 182 5.4 중첩된 If문 ... 182 매달린 else ... 185 5.5 I/O Stream 상태의 테스트 ... 186 테스트와 디버깅 ... 192 요약 ... 203 즉석 체크 ... 203 시험 준비 연습문제 ... 204 프로그래밍 워밍업 연습문제 ... 208 프로그래밍 문제 ... 210 CHAPTER 6 반복 6.1 While문 ... 214 6.2 루프 실행의 단계들 ... 216 6.3 While문을 이용한 루프 ... 216 계수제어 루프 ... 217 사건제어 루프 ... 218 루프 하위 작업들 ... 221 6.4 루프 설계 방법 ... 223 제어 흐름의 설계 ... 224 루프 내의 프로세스 설계하기 ... 225 루프 탈출 ... 226 6.5 중첩된 논리 ... 226 중첩된 루프 설계 ... 228 테스트와 디버깅 ... 233 요약 ... 237 즉석 체크 ... 237 시험 준비 연습문제 ... 238 프로그래밍 워밍업 연습문제 ... 241 프로그래밍 문제 ... 243 CHAPTER 7 함수(Functions) 7.1 Void 함수를 이용한 함수 분해 ... 246 Void 함수로 모듈 작성하기 ... 246 7.2 사용지정의 함수의 개요 ... 250 함수 호출의 제어 흐름 ... 250 함수 매개변수 ... 250 7.3 Void 함수의 구문법과 의미론 ... 252 함수 호출 ... 252 함수 선언과 정의 ... 253 지역변수 ... 255 반환문 ... 256 헤더파일 ... 257 7.4 매개변수 ... 258 값 매개변수 ... 259 참조 매개변수 ... 260 7.5 함수 설계 ... 262 단언들을 프로그램 주석으로 작성하기 ... 263 자료흐름의 방향을 문서화하기 ... 265 테스트와 디버깅 ... 275 요약 ... 279 즉석 체크 ... 280 시험 준비 연습문제 ... 281 프로그래밍 워밍업 연습문제 ... 286 프로그래밍 문제 ... 289 CHAPTER 8 영역, 존속기간 그리고 함수에 대한 추가사항 8.1 식별자의 영역 ... 294 영역 규칙 ... 296 변수 선언과 정의 ... 299 이름 공간 ... 300 8.2 변수의 존속기간 ... 303 선언에서의 초기화 ... 304 8.3 인터페이스 설계 ... 306 부작용 ... 306 전역상수 ... 307 8.4 값 반환 함수 ... 308 부울(Boolean) 함수 ... 312 값 반환 함수의 인터페이스 설계 ... 313 값 반환 함수를 사용해야 할 때 ... 314 테스트와 디버깅 ... 324 요약 ... 326 즉석 체크 ... 327 프로그래밍 워밍업 연습문제 ... 331 프로그래밍 문제 ... 333 CHAPTER 9 그 밖의 제어구조들 9.1 Switch문 ... 336 9.2 Do-While문 ... 340 9.3 For문 ... 342 9.4 Break와 Continue문 ... 345 9.5 루프문 선택을 위한 지침 ... 348 테스트와 디버깅 ... 353 요약 ... 354 즉석 체크 ... 354 시험 준비 연습문제 ... 355 프로그래밍 워밍업 연습문제 ... 357 프로그래밍 문제 ... 359 CHAPTER 10 단순 자료형 : 기본형과 사용자정의형 10.1 기본 단순 자료형 ... 362 정수형 ... 364 부동소수점 자료형 ... 365 10.2 추가적인 C++ 연산자들 ... 366 배정 연산자와 배정 수식 ... 367 증가와 감소 연산자 ... 369 비트용 연산자 ... 369 형 변환(cast) 연산 ... 370 sizeof 연산자 ... 370 ?: 연산자 ... 370 연산자 우선순위 ... 371 10.3 문자 자료 이용하기 ... 372 문자 집합 ... 373 C++ char 상수 ... 374 프로그래밍 기법 ... 375 10.4 부동소수점 수에 대한 보충 ... 379 부동소수점 수의 표현 ... 379 10.5 사용자정의 단순형 ... 384 typedef 문장 ... 384 열거형 ... 385 사용자 작성 헤더파일 ... 392 10.6 형 변환에 대한 보충 ... 394 산술식과 관계식에서의 형 변환 ... 394 배정, 인자 전달 그리고 함수값의 반환에서의 형 변환 ... 395 테스트와 디버깅 ... 403 즉석 체크 ... 406 시험 준비 연습문제 ... 407 프로그래밍 워밍업 연습문제 ... 409 프로그래밍 문제 ... 411 CHAPTER 11 구조적 자료형, 자료 추상화 그리고 클래스 11.1 단순 자료형과 구조적 자료형 ... 414 11.2 레코드(C++ 구조체) ... 415 개별 구성요소의 접근 ... 417 구조체의 군집 연산 ... 419 구조체 선언에 대해 자세히 알아보기 ... 421 계층적 레코드 ... 421 11.3 공용체(Union) ... 424 11.4 자료 추상화 ... 425 11.5 추상 자료형 ... 427 11.6 C++ 클래스 ... 430 클래스, 클래스 객체, 클래스 멤버 ... 432 클래스 객체에 대한 기본 연산 ... 433 클래스의 통용 범위(scope) ... 436 정보은닉(Information Hiding) ... 436 11.7 명세와 구현 파일 ... 438 명세 파일 ... 439 구현 파일 ... 440 다중 파일 프로그램의 컴파일과 링킹하기 ... 445 11.8 클래스 생성자를 이용한 보증된 초기화 ... 447 생성자의 호출 ... 450 TimeType을 위한 명세와 구현 파일의 개정 ... 450 테스트와 디버깅 ... 470 즉석 체크 ... 476 시험 준비 연습문제 ... 478 프로그래밍 워밍업 연습문제 ... 482 프로그래밍 문제 ... 484 CHAPTER 12 배열 12.1 1차원 배열 ... 490 배열 선언 ... 492 각 요소 접근하기 ... 493 범위 밖(Out-of-Bounds)의 배열 인덱스 ... 496 선언에서의 배열 초기화 ... 496 군집 배열 연산(의 부족) ... 497 배열의 선언과 접근의 예 ... 498 인자로서 배열 전달 ... 501 배열에 대한 단언 ... 503 배열에서의 Typedef 사용 ... 504 12.2 레코드와 클래스 객체의 배열 ... 505 레코드의 배열 ... 505 클래스 객체의 배열 ... 507 12.3 특별한 종류의 배열 처리 ... 508 부분배열 처리 ... 508 의미론적 내용을 가진 인덱스 ... 508 12.4 2차원 배열 ... 509 12.5 2차원 배열 처리 ... 512 행의 합계 ... 513 배열의 초기화 ... 516 배열의 인쇄 ... 517 12.6 인자로써 2차원 배열 전달 ... 518 12.7 2차원 배열을 정의하는 또 다른 방법 ... 521 12.8 다차원 배열 ... 523 테스트와 디버깅 ... 538 요약 ... 542 즉석 체크 ... 543 시험 준비 연습문제 ... 545 프로그래밍 워밍업 연습문제 ... 551 프로그래밍 문제 ... 554 CHAPTER 13 배열 기반 리스트 13.1 추상 자료형으로서의 리스트 ... 560 13.2 비정렬 리스트 ... 565 기본 연산 ... 565 삽입과 삭제 ... 567 순차 탐색 ... 569 정렬 ... 570 13.3 정렬 리스트 ... 574 기본 연산 ... 576 순차 탐색 ... 579 이진 탐색 ... 580 삭제 ... 586 13.4 문자열의 이해 ... 588 C 문자열의 초기화 ... 590 C 문자열 입력과 출력 ... 591 문자열 클래스 또는 C 문자열? ... 596 테스트와 디버깅 ... 603 요약 ... 604 즉석 체크 ... 605 시험 준비 연습문제 ... 606 프로그래밍 워밍업 연습문제 ... 609 프로그래밍 문제 ... 610 CHAPTER 14 객체지향 소프트웨어 개발 14.1 객체지향 프로그래밍 ... 614 14.2 객체(Objects) ... 616 14.3 상속(Inheritance) ... 617 새로운 파생 클래스 만들기 ... 618 ExtTime 클래스의 명세 ... 622 ExtTime 클래스의 구현 ... 624 헤더파일들의 중복 포함 피하기 ... 628 14.4 포함(Composition) ... 629 TimeCard 클래스의 설계 ... 629 TimeCard 클래스의 구현 ... 631 14.5 동적 바인딩과 가상 함수 ... 633 슬라이싱 문제 ... 634 가상 함수 ... 636 14.6 객체지향 설계 ... 638 단계 1 : 객체들과 연산들을 식별한다 ... 638 단계 3 : 드라이버를 설계한다 ... 640 14.7 설계의 구현 ... 641 테스트와 디버깅 ... 663 요약 ... 665 즉석 체크 ... 665 시험 준비 연습문제 ... 667 프로그래밍 워밍업 연습문제 ... 669 프로그래밍 문제 ... 671 CHAPTER 15 재귀 15.1 재귀란? ... 674 15.2 하노이 탑 ... 678 15.3 구조적 변수를 사용하는 재귀 알고리즘 ... 683 15.4 재귀 대 반복? ... 686 테스트와 디버깅 ... 686 요약 ... 687 즉석 체크 ... 687 시험 준비 연습문제 ... 688 프로그래밍 워밍업 연습문제 ... 689 프로그래밍 문제 ... 690 APPENDIX 부록 A 예약어 ... 694 B 연산자 우선순위 ... 694 C 표준 라이브러리 루틴의 선택 ... 696 C.1 헤더파일 cassert ... 696 C.2 헤더파일 cctype ... 697 C.3 헤더파일 cfloat ... 699 C.4 헤더파일 climits ... 699 C.5 헤더파일 cmath ... 700 C.6 헤더파일 cstcllib ... 702 C.7 헤더파일 cstring ... 704 C.8 헤더파일 string ... 705 D 이 책을 구버전 C++과 함께 사용하기 ... 706 D.1 string형 ... 706 D.2 표준 헤더파일들과 이름 공간 ... 707 D.3 fixed와 showpoint 처리자 ... 708 D.4 bool형 ... 709 E 문자 집합 ... 711 F 프로그램 스타일, 형식, 문서화 ... 713 F.1 일반 가이드라인 ... 713 F.2 주석 ... 713 F.3 식별자 ... 716 F.4 행과 수식들의 형식 ... 716 F.5 들여쓰기 ... 717 용어해설 ... 719 연습문제 해답 ... 725 찾아보기 ... 747