Part 01 C++ 프로그래밍 입문 Part 1의 학습 목표 ... 49 Chapter 01 C++ 프로그래밍의 시작 ... 50 간단한 C++의 역사 ... 51 프로그램이란 무엇인가? ... 51 문제 해결 방식 ... 52 순차적 프로그래밍, 구조적 프로그래밍, 객체 지향 프로그래밍 ... 52 C++와 객체 지향 프로그래밍 ... 54 C++는 어떻게 진화되어 왔는가? ... 55 ANSI 표준 ... 55 프로그램 준비 ... 56 개발자의 개발 환경 ... 56 원시 코드 컴파일하기 ... 57 링커로 실행 가능한 파일 만들기 ... 57 개발 주기 ... 58 첫 번째 C++ 프로그램 작성, HELLO.cpp ... 59 HELLO.cpp 예제의 입력과 컴파일 ... 59 컴파일 오류들 ... 65 Q/A ... 66 실습해보기 ... 66 퀴즈 ... 66 연습 문제 ... 67 Chapter 02 C++ 프로그래밍의 구성 요소 ... 68 간단한 프로그램의 각 구성 요소 ... 69 간단히 살펴보는 cout ... 70 주석문 ... 72 주석문의 형태 ... 72 주석문 쓰기 ... 72 각 파일의 처음에 필요한 주석들 ... 73 주석에 대한 주의 사항 ... 74 함수 ... 74 함수 사용법 ... 75 Q/A ... 77 실습해보기 ... 78 퀴즈 ... 78 연습 문제 ... 78 Chapter 03 변수와 상수 ... 79 변수란 무엇인가? ... 80 메모리 할당하기 ... 80 정수(Integer)의 크기 ... 80 Signed와 Unsigned ... 82 기본적인 변수형 ... 82 변수 정의하기 ... 83 대ㆍ소문자의 구별 ... 84 예약어 ... 84 한꺼번에 같은 형 변수를 하나 이상 만들 때 ... 85 변수에 값을 대입하는 법 ... 85 typedef ... 86 언제 short을 쓰고, 언제 long을 쓰는가? ... 87 unsigned 정수형에서의 올림 초기화 ... 88 signed 정수에서의 올림 초기화 ... 89 문자(Character) ... 90 문자와 숫자 ... 90 특수 출력 문자 ... 91 상수 ... 91 문자 상수 ... 92 기호 상수 ... 92 상수 나열형 ... 93 Q/A ... 95 실습해보기 ... 96 퀴즈 ... 96 연습 문제 ... 97 Chapter 04 수식과 문장 ... 98 문장 ... 99 공백 문자 ... 99 블록문과 복합문 ... 99 수식문 ... 100 연산자 ... 101 대입 연산자 ... 101 산술 연산자 ... 102 정수 나눗셈과 나머지 연산 ... 103 대입 연산자와 수학 연산자의 혼용 ... 103 증가 연산자와 감소 연산자 ... 104 전치 연산자와 후치 연산자 ... 104 연산자 우선순위 ... 106 중첩 괄호 ... 106 참 값의 속성 ... 107 관계 연산자 ... 107 If 문장 ... 108 들여쓰기 ... 111 else ... 111 복합 if 문 ... 113 중첩 if 문에서의 중괄호 사용 ... 115 논리 연산자 ... 117 논리곱 ... 117 논리합 ... 118 논리적 부정 ... 118 관계 연산자의 우선순위 ... 118 참과 거짓에 대한 몇 가지 사항들 ... 119 조건(삼항) 연산자 ... 119 Q/A ... 121 실습해보기 ... 122 퀴즈 ... 122 연습 문제 ... 122 Chapter 05 함수 ... 124 함수란 무엇인가? ... 125 함수 선언과 정의 ... 125 함수 선언 ... 125 함수 원형 ... 126 함수 정의 ... 128 함수 실행 ... 129 지역 변수 ... 129 전역 변수 ... 132 전역 변수 - 주의해야 할 단어 ... 133 지역 변수에 대한 추가 사항 ... 133 함수문 ... 135 함수 인자 ... 135 함수의 매개변수로 함수를 사용하는 함수 ... 135 매개변수는 지역 변수 ... 136 반환값 ... 137 기본 매개변수 ... 139 함수 오버로딩 ... 142 함수에 관한 특별한 주제들 ... 144 인라인 함수 ... 145 재귀 호출 ... 146 함수는 어떻게 동작되는가? ... 149 추상화 단계 ... 150 RAM 나누기 ... 150 스택과 함수 ... 152 Q/A ... 153 실습해보기 ... 154 퀴즈 ... 154 연습 문제 ... 154 Chapter 06 기본적인 클래스 ... 156 새로운 자료형 만들기 ... 157 왜 새로운 자료형을 만드는가? ... 157 클래스와 멤버 ... 157 클래스 선언 ... 158 이름짓는 법 ... 158 객체 정의 ... 159 클래스와 객체 ... 159 클래스 멤버에 접근 ... 160 클래스가 아니라 객체에 대입하기 ... 160 선언을 하지 않으면 클래스는 이를 가질 수 없다 ... 160 private과 public ... 161 멤버 자료를 전용으로 만들기 ... 163 전용성과 보안성에 대하여 ... 164 클래스 메서드 구현 ... 166 생성자와 소멸자 ... 168 기본 생성자와 기본 소멸자 ... 169 const 멤버 함수 ... 172 인터페이스와 구현 ... 173 클래스 선언과 메서드 정의를 어디에서 할 것인가? ... 175 inline 구현 ... 176 다른 클래스를 멤버 자료로 갖는 클래스 ... 179 구조체 ... 182 왜 두 개의 예약어는 같은 일을 할까? ... 182 Q/A ... 183 실습해보기 ... 184 퀴즈 ... 184 연습 문제 ... 185 Chapter 07 프로그램의 흐름 ... 187 순환문 ... 188 순환문의 조상: goto ... 188 왜 goto 문을 권장하지 않는가? ... 189 while 순환문 ... 189 다소 복잡해진 while 문 ... 190 continue와 break ... 192 while(1) 순환문 ... 195 do...while 순환문 ... 196 do...while ... 197 for 순환문 ... 199 for 순환문의 고급 사용 ... 201 빈 for 순환문 ... 204 중첩된 순환문 ... 205 for 순환문에서의 범위 규칙 ... 206 순환문 요약 ... 206 switch 문 ... 209 메뉴 구성 프로그램에서 switch 문 사용하기 ... 212 Q/A ... 215 실습해보기 ... 215 퀴즈 ... 216 연습 문제 ... 216 Part 01 마치면서 ... 218 Part 01을 마치면서 ... 222 Part 02 효율적인 C++ 프로그래밍 Part 2의 학습 목표 ... 225 Chapter 08 포인터 ... 226 포인터란 무엇인가? ... 227 포인터에 주소를 저장 ... 228 포인터 이름 ... 230 간접 지정 연산자 ... 230 포인터, 주소, 변수 ... 230 포인터를 사용한 자료 연산 ... 231 주소 관찰 ... 232 도대체 왜 포인터를 쓰는가? ... 234 스택과 자유 기억 공간(Free Store, 힙) ... 235 new ... 236 delete ... 236 메모리 누수 ... 238 자유 기억 장소에 객체 만들기 ... 239 객체 delete ... 239 자료 멤버에 접근 ... 241 자유 기억 공간의 멤버 자료에 대해 ... 242 this 포인터 ... 243 허상 포인터 ... 245 const 포인터 ... 247 const 포인터와 const 멤버 함수 ... 248 const this 포인터 ... 249 Q/A ... 250 실습해보기 ... 251 퀴즈 ... 251 연습 문제 ... 251 Chapter 09 참조자 ... 253 참조자란 무엇인가? ... 254 참조자에 주소 연산자 & 사용하기 ... 255 무엇이 참조될 수 있는가? ... 258 널 포인터와 널 참조자 ... 259 함수 인수를 참조자로 전달하기 ... 260 포인터를 이용한 swap()의 구현 ... 261 참조자를 이용한 swap()의 구현 ... 262 함수 헤더와 함수 원형에 대한 이해 ... 264 여러 개의 값을 반환하는 법 ... 265 참조자를 사용한 값 반환 ... 266 효율성을 위해 참조자를 전달하자 ... 268 상수 포인터 전달하기 ... 271 그 대안으로써 참조자를 사용하자 ... 273 참조자와 포인터를 사용하는 때 ... 275 참조자와 포인터를 섞어서 사용할 때 ... 276 범위 벗어난 객체에 대한 참조자를 반환하면 안 된다 ... 277 힙에 있는 객체에 대한 참조자 반환하기 ... 278 포인터, 도대체 누가 포인터를 가지고 있는가? ... 280 Q/A ... 281 실습해보기 ... 281 퀴즈 ... 282 연습 문제 ... 282 Chapter 10 고급 함수들 ... 284 멤버 함수 오버로딩 ... 285 기본값 쓰기 ... 287 기본값과 오버로딩 함수 중 어떤 것을 선택할 것인가? ... 289 기본 생성자 ... 289 생성자 오버로딩 ... 290 객체 초기화 ... 291 복사 생성자 ... 292 연산자 오버로딩 ... 296 증가 함수 만들기 ... 297 전치 연산자 오버로딩하기 ... 298 오버로딩 연산자 함수에서의 반환값 형 ... 300 이름 없는 임시 객체 반환 ... 301 this 포인터 사용하기 ... 303 후치 연산자 오버로딩하기 ... 304 전치 연산자와 후치 연산자의 차이 ... 304 덧셈 연산자 ... 307 operator+ 오버로딩 ... 308 연산자 오버로딩에서 몇 가지 중요 사항들 ... 310 연산자 오버로딩의 한계 ... 310 무엇을 오버로딩시킬 것인가? ... 311 대입 연산자 ... 311 변환 연산자 ... 313 형 변환 연산자 ... 316 Q/A ... 318 실습해보기 ... 318 퀴즈 ... 318 연습 문제 ... 319 Chapter 11 배열 ... 320 배열이란 무엇인가? ... 321 배열 요소 ... 321 배열의 끝을 지나 값을 저장할 경우 ... 322 울타리 말뚝 오류 ... 325 배열의 초기화 ... 325 변수 선언 ... 326 객체의 배열 ... 328 다차원 배열 ... 329 다차원 배열의 초기화 ... 330 메모리에 관하여 ... 331 포인터 배열 ... 332 자유 기억 공간에 배열 선언하기 ... 333 배열을 가리키는 포인터와 포인터가 저장된 배열 ... 334 포인터와 배열명 ... 334 자유 기억 공간의 배열 지우기 ... 336 char 배열(문자 배열) ... 336 strcpy()와 strncpy() ... 339 문자열 클래스 ... 340 연결 리스트와 다른 구조체들 ... 347 클래스 배열 ... 352 Q/A ... 353 실습해보기 ... 354 퀴즈 ... 354 연습 문제 ... 354 Chapter 12 상속 ... 356 상속이란 무엇인가? ... 357 상속과 파생 ... 357 동물의 왕국 ... 358 파생 구문 ... 358 private과 protected ... 360 생성자와 소멸자 ... 362 기본 생성자에게 인수 전달하기 ... 365 함수 오버라이딩 ... 369 오버로딩과 오버라이딩 ... 371 기본 클래스 메서드의 은폐 ... 371 기본 메서드 호출 ... 372 가상 메서드 ... 374 가상 함수는 어떻게 동작하는가? ... 378 없는 것을 얻을 수는 없다 ... 379 분할하기 ... 379 가상 소멸자 ... 381 가상 복사 생성자 ... 382 가상 메서드를 사용하는 대가 ... 385 Q/A ... 386 실습해보기 ... 386 퀴즈 ... 386 연습 문제 ... 387 Chapter 13 다형성 ... 388 단일 상속의 문제점 ... 389 상승 ... 391 하향 형 변환 ... 391 두 개의 목록에 넣기 ... 394 다중 상속 ... 394 다중 상속 객체의 각 부분들 ... 397 다중 상속된 객체에서의 생성자 ... 398 모호성 해결 ... 400 공유된 기본 클래스로부터 상속 ... 401 가상 상속 ... 405 다중 상속의 문제점들 ... 409 혼합 그리고 만능 클래스 ... 409 추상 자료형 ... 410 순수 가상 함수 ... 413 순수 가상 함수의 구현 ... 414 추상의 복합 계층 ... 418 어떤 형이 추상인가? ... 421 Q/A ... 422 실습해보기 ... 423 퀴즈 ... 423 연습 문제 ... 423 Chapter 14 특수 클래스와 함수들 ... 424 정적 멤버 자료 ... 425 정적 멤버 함수 ... 430 함수를 가리키는 포인터 ... 432 함수 포인터를 사용하는 이유 ... 435 함수 포인터 배열 ... 437 함수 포인터를 다른 함수에 전달하는 방법 ... 439 함수 포인터를 typedef로 선언하기 ... 441 멤버 함수에 대한 포인터 ... 442 멤버 함수 포인터에 대한 배열 ... 445 Q/A ... 447 실습해보기 ... 448 퀴즈 ... 448 연습 문제 ... 448 Part 2 마치면서 ... 449 Part 03 유용하고 실무적인 고급 프로그래밍 Part 3의 학습 목표 ... 461 Chapter 15 고급 상속 기능 ... 462 포함 ... 463 포함된 클래스의 멤버에 접근 ... 469 포함된 멤버에 대한 접근 걸러내기 ... 469 포함의 대가 ... 469 값에 의한 복사 ... 471 상속/포함, 대리 관점 구현 ... 473 대리(Delegation) ... 474 전용 상속 ... 482 프렌드 클래스 ... 486 프렌드 함수 ... 494 프렌드 함수와 연산자 오버로딩 ... 494 삽입 연산자 오버로딩 ... 498 Q/A ... 500 실습해보기 ... 500 퀴즈 ... 500 연습 문제 ... 501 Chapter 16 스트림 ... 503 스트림에 대한 개괄 ... 504 캡슐화 ... 504 버퍼링 ... 504 스트림과 버퍼 ... 506 표준 입ㆍ출력 객체 ... 506 재지정 ... 507 cin을 사용한 입력 ... 507 문자열 ... 509 문자열의 문제 ... 509 istream 객체 참조자를 반환하는 연산자:〉〉 ... 512 cin의 또 다른 멤버 함수 ... 512 단일 문자 입력 ... 512 표준 입력으로부터 문자열을 받는 방법 ... 514 cin.ignore() 사용하기 ... 517 peek()와 putback() ... 518 cout으로 출력 ... 518 출력할 산출물을 방출함 ... 519 관련된 함수들 ... 520 조종자, 플래그, 규격 명령어 ... 521 cout.width()를 사용하는 법 ... 521 채울 문자의 설정 ... 522 설정 플래그 ... 523 스트림과 printf() 함수 ... 525 파일의 입력과 출력 ... 527 ofstream ... 527 조건을 나타내는 상태 ... 528 입ㆍ출력을 위한 파일 열기 ... 528 파일 열기에서 ofstream 객체의 기본 작동을 변화시키는 법 ... 529 이진 파일과 텍스트 파일 ... 531 명령 줄 처리 ... 533 Q/A ... 538 실습해보기 ... 538 퀴즈 ... 539 연습 문제 ... 539 Chapter 17 전처리계 ... 540 전처리계와 컴파일러 ... 541 중간 형태의 보기 ... 541 define 지시자 사용하기 ... 541 define 지시자를 사용한 상수 정의 ... 541 검사용으로 define 지시자 사용 ... 542 else 전처리계 지시자 ... 542 포함 및 포함 감시자 ... 543 라인 명령어 환경에서 정의하는 방법 ... 544 undef 사용하기 ... 545 조건부 컴파일 ... 546 매크로 함수 ... 547 왜 괄호들이 필요한가? ... 547 매크로와 함수 및 템플릿 ... 549 확장 함수 ... 549 문자열 연산 ... 551 문자열 만들기 ... 551 문자열 연결 ... 551 내장 매크로 ... 552 assert() ... 552 assert() 가지고 디버깅하기 ... 554 assert()와 예외 사항 ... 554 부작용 ... 554 클래스의 불변성 ... 555 중간값 출력 ... 560 디버그 수준 ... 561 Q/A ... 565 실습해보기 ... 566 퀴즈 ... 566 연습 문제 ... 566 Chapter 18 객체 지향 분석과 설계 ... 567 개발 주기 ... 568 경보 시스템 시뮬레이션 ... 568 예비 설계 ... 569 무엇이 객체인가? ... 569 다른 객체들 ... 570 클래스란 무엇인가? ... 570 경보는 어떻게 보고되는가? ... 571 이벤트 순환문 ... 571 전자우편 시스템(PostMaster) ... 573 생각은 여러 번, 결정은 한번에 ... 574 분할한 후에 정복하라 ... 574 메시지 규격화 ... 575 초기 클래스 설계 ... 575 순종과 잡종 계층 ... 576 인터페이스 설계 ... 578 프로토타입 만들기 ... 579 80/80의 법칙 ... 579 PostMasterMessage 클래스 설계 ... 580 응용 프로그램 인터페이스 ... 580 다수의 개발그룹이 참여하는 프로그래밍 ... 581 설계에서 기타 고려 사항들 ... 582 설계 시 판단 ... 582 판단, 판단 ... 582 구동 프로그램 ... 583 Q/A ... 590 실습해보기 ... 591 퀴즈 ... 591 연습 문제 ... 591 Chapter 19 템플릿 ... 592 템플릿이란 무엇인가? ... 593 매개변수화된 형 ... 593 템플릿 정의 ... 593 이름을 사용하여 ... 595 템플릿의 구현 ... 596 템플릿 함수 ... 599 템플릿과 프렌드 ... 599 비 템플릿 프렌드 클래스와 함수 ... 600 일반 템플릿 프렌드 클래스와 함수 ... 601 형이 서술된 템플릿 프렌드 클래스와 함수 ... 602 템플릿 항목 사용하기 ... 605 특수 함수들 ... 609 정적 멤버와 템플릿 ... 614 Q/A ... 618 실습해보기 ... 619 퀴즈 ... 619 연습 문제 ... 619 Chapter 20 예외 사항과 오류 처리 ... 621 버그, 오류, 실수, 녹슨 코드(Code Rot) ... 622 예외 ... 622 '녹슨 코드(Code Rot)'라는 말에 대해 ... 623 예외 ... 623 예외는 어떻게 사용되는가? ... 624 try 블록과 catch 블록의 사용 ... 628 예외 사항 잡기 ... 628 하나 이상의 catch 문 ... 629 예외 사항 계층 구조 ... 632 예외의 자료와 예외 객체 명명법 ... 635 예외 처리와 템플릿 ... 642 오류가 없는 예외 사항 ... 644 버그와 디버깅 ... 645 분기점 ... 645 경계점 ... 646 메모리 살펴보기 ... 646 어셈블러 ... 646 Q/A ... 646 실습해보기 ... 647 퀴즈 ... 647 연습 문제 ... 648 Chapter 21 다음은 무엇을 할 것인가? ... 649 표준 라이브러리 ... 650 문자열 라이브러리 함수 ... 650 strcpy()와 strncpy() ... 651 strcat()과 strncat() ... 654 다른 문자열 함수들 ... 655 시간과 날짜 관련 함수 ... 655 stdlib ... 656 qsort() ... 657 다른 라이브러리 함수 ... 659 비트 연산 ... 659 비트 연산자 AND ... 660 비트 연산자 OR ... 660 배타적 비트 OR 연산자 ... 660 보수 연산자 ... 660 비트 설정 ... 660 비트 초기화 ... 661 비트 바꾸기 ... 661 비트 필드 ... 662 스타일 ... 665 들여쓰기 ... 665 중괄호 정렬 ... 665 긴 줄의 처리 ... 665 switch 문 정렬 ... 665 프로그램 코드 텍스트 ... 666 상술자 명명법 ... 667 이름에 철자 붙이기와 대문자 붙이기 ... 667 주석 ... 667 접근 ... 668 클래스 정의 ... 668 include 파일 ... 668 assert() ... 669 const ... 669 다음 단계 ... 669 어디에서 도움과 충고를 구할 것인가? ... 669 Q/A ... 670 실습해보기 ... 671 퀴즈 ... 671 연습 문제 ... 671 Part 3 마치면서 ... 672 Part 04 부록 Appendix A 연산자 우선순위 ... 685 Appendix B C++ 예약어 ... 687 Appendix C 퀴즈, 연습 문제 해답 ... 689