제1장 비주얼 C++ 프로그래밍 1. C++와 윈도우 프로그래밍 배우기 ... 31 1.1 윈도우 프로그래밍에 대한 소개 ... 32 1.2 콘솔 응용 프로그램 ... 34 2. IDE란 ... 35 2.1 시스템의 구성 요소 ... 35 2.2 다른 툴 ... 37 3. IDE 사용하기 ... 38 3.1 툴바 옵션 ... 39 3.2 도킹 가능한 툴바 ... 39 3.3 도큐먼트 ... 40 3.4 프로젝트와 프로젝트 웍스페이스 ... 41 3.5 비주얼 C++에서 옵션 설정하기 ... 55 3.6 윈도우 프로그램 생성하고 실행시키기 ... 57 4. 요약 ... 62 5. 연습 문제 ... 62 제2장 데이터, 변수, 그리고 계산 1. C++ 프로그램의 구조 ... 65 1.1 main() 함수 ... 73 1.2 프로그램 문장 ... 74 1.3 공간(whitespace) ... 76 1.4 문장 블록 ... 77 2. 변수 정의하기 ... 77 2.1 변수의 이름 정하기 ... 78 2.2 변수 선언하기 ... 79 2.3 변수의 초기값 ... 80 3. C++에서의 데이터 형식 ... 81 3.1 정수 변수 ... 81 3.2 부동 소수점 변수 ... 84 3.3 논리 변수 ... 85 3.4 특정한 값의 집합을 가지는 변수 ... 85 3.5 여러분만의 데이터 형식 정의하기 ... 87 3.6 리터럴 ... 88 3.7 기본적인 입·출력 작업 ... 88 3.8 키보드로부터의 입력 ... 89 3.9 이스케이프 시퀀스 ... 92 4. C++에서의 계산 작업 ... 93 4.1 할당문 ... 93 4.2 산술 연산 ... 94 4.3 나머지 계산하기 ... 101 4.4 변수의 값 수정하기 ... 101 4.5 증가 연산자와 감소 연산자 ... 103 4.6 계산의 순서 ... 106 5. 변수의 형식과 변환 ... 107 5.1 Bitwise 연산자 ... 112 6. 범위에 대한 이해 ... 120 6.1 자동 변수 ... 121 6.2 변수 선언의 위치 결정하기 ... 124 6.3 글로벌 변수 ... 124 6.4 정적인 변수 ... 128 7. 네임 공간 ... 129 7.1 네임 공간 선언하기 ... 130 7.2 여러 개의 네임 공간 ... 132 8. 요약 ... 133 9. 연습 문제 ... 135 제3장 의사 결정과 루프 1. 값 비교하기 ... 139 1.1 if 문장 ... 141 1.2 중첩된 if 문장 ... 142 1.3 확장된 if 문 ... 145 1.4 중첩된 if-else 문장 ... 147 1.5 논리 연산자와 표현 ... 150 1.6 조건 연산자 ... 154 1.7 switch문 ... 156 1.8 무조건적인 분기 ... 159 2. 문장 블록 반복하기 ... 160 2.1 루프란 ... 160 2.2 for 루프의 변형 ... 164 2.3 continue 문장 ... 168 2.4 while 루프 ... 173 2.5 do-while 루프 ... 175 2.6 중첩된 루프 ... 176 3. 요약 ... 180 4. 연습 문제 ... 181 제4장 배열, 포인터, 그리고 레퍼런스 1. 동일한 형식을 가지는 여러 개의 데이터값 다루기 ... 185 1.1 배열 ... 186 1.2 배열 선언하기 ... 187 1.3 배열 초기화하기 ... 191 1.4 문자 배열과 문자열 처리 ... 193 1.5 다차원 배열 ... 197 2. 간접적인 데이터 액세스 ... 201 2.1 포인터란 무엇인가 ... 201 2.2 포인터 선언하기 ... 201 2.3 포인터 사용하기 ... 203 2.4 포인터 초기화하기 ... 206 2.5 sizeof 연산자 ... 213 2.6 상수 포인터와 상수에 대한 포인터 ... 215 2.7 포인터와 배열 ... 218 3. 동적인 메모리 할당 ... 226 3.1 free store, 힙의 별칭 ... 226 3.2 new와 delete 연산자 ... 227 3.3 배열에 대해서 메모리를 동적으로 할당하기 ... 229 3.4 다차원 배열의 동적인 할당 ... 232 4. 레퍼런스 사용하기 ... 233 4.1 레퍼런스란 무엇인가? ... 233 4.2 레퍼런스를 선언하고 초기화하기 ... 233 5. 요약 ... 234 6. 연습 문제 ... 235 제5장 프로그램에서 구조 사용하기 1. 함수에 대한 이해 ... 239 1.1 왜 함수가 필요한가? ... 240 1.2 함수의 구조 ... 241 1.3 함수 사용하기 ... 244 2. 함수에 인수 할당하기 ... 249 2.1 값에 의한 전달 메커니즘 ... 250 2.2 함수에 대한 인수로서의 포인터 ... 252 2.3 배열을 함수에 전달하기 ... 254 2.4 함수에 대한 인수로서 사용되는 레퍼런스 ... 259 2.5 const 수정자 사용하기 ... 262 3. 함수로부터 여러 개의 값 리턴 받기 ... 264 3.1 포인터 리턴하기 ... 264 3.2 레퍼런스 리턴하기 ... 268 3.3 함수 안에 있는 정적인 변수 ... 272 4. 재귀 함수 호출 ... 275 4.1 재귀 사용하기 ... 278 5. 요약 ... 278 6. 연습 문제 ... 279 제6장 프로그램 구조에 대한 자세한 사항 1. 함수에 대한 포인터 ... 283 1.1 함수에 대한 포인터 선언하기 ... 284 1.2 함수 인수로서 사용되는 함수에 대한 포인터 ... 287 1.3 함수에 대한 포인터의 배열 ... 299 2. 함수 파라미터 초기화하기 ... 290 3. 예외 ... 292 3.1 MFC에서의 예외 처리 ... 297 4. 메모리 할당 에러 처리하기 ... 298 4.1 함수 오버로딩(overloading) ... 301 4.2 함수 오버로딩이라는 것이 무엇인가? ... 301 4.3 언제 함수를 오버로드하는가? ... 304 5. 함수 템플릿 ... 305 5.1 함수 템플릿 사용하기 ... 305 6. 함수의 실제 적용 ... 307 6.1 계산기 구현하기 ... 308 6.2 문자열에서 빈 칸 없애기 ... 312 6.3 표현 계산하기 ... 313 6.4 항목으로부터 값 얻기 ... 316 6.5 숫자 분석하기 ... 317 6.6 프로그램을 하나로 묶기 ... 321 6.7 프로그램 확장하기 ... 323 6.8 서브 문자열 뽑아내기 ... 325 6.9 수정된 프로그램 실행하기 ... 327 7. 요약 ... 328 8. 연습 문제 ... 329 제7장 이전 방식의 윈도우에 대하여 1. C++ 안에서의 struct ... 333 1.1 struct란 무엇인가 ... 334 1.2 struct 정의하기 ... 334 1.3 struct 초기화하기 ... 335 1.4 struct의 멤버 액세스하기 ... 336 1.5 구조와 함께 사용하는 똑똑한 편집기 ... 341 1.6 struct RECT ... 342 1.7 포인터를 struct와 함께 사용하기 ... 342 2. 윈도우 프로그래밍의 기본적인 사항 ... 345 2.1 윈도우의 요소 ... 345 2.2 도스와 윈도우 프로그램의 비교 ... 348 2.3 이벤트 구동 방식의 프로그램 ... 349 2.4 윈도우 메시지 ... 349 2.5 윈도우 API ... 350 2.6 비주얼 C++ 프로그램의 표기법 ... 351 3. 윈도우 프로그램의 구조 ... 352 3.1 WindMain() 함수 ... 353 3.2 메시지 처리 함수 ... 369 3.3 간단한 윈도우 프로그램 ... 376 4. 요약 ... 378 5. 연습 문제 ... 378 제8장 클래스를 사용하여 데이터 구조화하기 1. 데이터 형식, 객체, 클래스, 그리고 인스턴스 ... 383 1.1 첫 번째 클래스 ... 386 1.2 클래스에 대한 작업 ... 386 1.3 용어 ... 387 2. 클래스 이해하기 ... 388 2.1 클래스 정의하기 ... 388 2.2 클래스의 객체 선언하기 ... 389 2.3 클래스의 데이터 멤버 액세스하기 ... 390 2.4 클래스의 멤버 함수 ... 393 2.5 멤버 함수의 정의의 위치 정하기 ... 396 2.6 inline 함수 ... 397 3. 클래스 컨스트럭터 ... 398 3.1 컨스트럭터란 ... 398 3.2 디폴트 컨스트럭터 ... 401 3.3 컨스트럭터에서 기본값을 할당하기 ... 404 3.4 컨스트럭터에서 초기화 리스트 사용하기 ... 406 4. 클래스의 private 멤버 ... 407 4.1 private 클래스 멤버들 액세스하기 ... 411 4.2 클래스의 friend 함수 ... 412 4.3 디폴트 copy 컨스트럭터 ... 415 5. this 포인터 ... 417 6. 클래스의 const 객체 ... 420 6.1 클래스의 const 멤버 함수 ... 421 7. 클래스 객체의 배열 ... 424 8. 클래스의 정적인 멤버 ... 426 8.1 클래스의 정적인 데이터 멤버 ... 426 8.2 클래스의 정적인 함수 멤버 ... 429 9. 클래스 객체에 대한 포인터와 레퍼런스 ... 430 9.1 클래스 객체에 대한 포인터 ... 430 9.2 클래스 객체에 대한 레퍼런스 ... 434 10. 요약 ... 436 11. 연습 문제 ... 437 제9장 클래스에 대한 자세한 사항 1. 클래스 디스트럭터 ... 441 1.1 디스트럭터란 ... 441 1.2 디폴트 디스트럭터 ... 442 1.3 디스트럭터와 동적인 메모리 할당 ... 444 1.4 copy 컨스트럭터 구현하기 ... 448 2. 변수들 사이에서 메모리 공유하기 ... 451 2.1 union 정의하기 ... 452 2.2 익명의 union ... 453 2.3 클래스 안에서의 union ... 454 3. 연산자 오버로딩 ... 454 3.1 오버로드된 연산자 구현하기 ... 455 3.2 연산자에 대한 완벽한 코드를 구현하기 ... 459 3.3 할당 연산자 오버로드하기 ... 464 3.4 덧셈 연산자 오버로딩하기 ... 470 4. 클래스 템플릿 ... 475 4.1 클래스 템플릿 정의하기 ... 476 4.2 클래스 템플릿으로부터 객체 생성하기 ... 480 4.3 여러 개의 파라미터를 가지는 클래스 템플릿 ... 483 5. 클래스 사용하기 ... 486 5.1 클래스 인터페이스에 대한 개념 ... 486 5.2 문제 정의하기 ... 486 5.3 CBox 클래스 구현하기 ... 487 5.4 CBox 클래스 정의하기 ... 497 5.5 컨스트럭터 정의하기 ... 500 5.6 CBox 클래스 사용하기 ... 509 6. 프로그램의 코드 조직화하기 ... 513 6.1 프로그램 파일의 이름 정하기 ... 514 7. 요약 ... 515 8. 연습 문제 ... 516 제10장 클래스 상속성 1. OOP에 대한 기본적인 개념 ... 521 2. 클래스에서의 상속성 ... 523 2.1 기본 클래스란 ... 524 2.2 기본 클래스로부터 클래스 파생시키기 ... 524 3. 상속되는 환경에서의 액세스 제어 ... 529 3.1 파생된 클래스 안에서의 컨스트럭터 작업 ... 532 3.2 클래스의 protected 멤버들 선언하기 ... 536 3.3 상속된 클래스 멤버들의 액세스 레벨 ... 540 4. 파생된 클래스 안에 있는 copy 컨스트럭터 ... 542 5. friend로서의 클래스 멤버 ... 548 5.1 friend 클래스 ... 550 5.2 클래스 사이의 friend 관계에서의 제약점 ... 550 6. 가상 함수 ... 550 6.1 가상 함수란 ... 554 6.2 클래스 객체에 대한 포인터 사용하기 ... 556 6.3 레퍼런스를 가상 함수와 함께 사용하기 ... 559 6.4 순수한 가상 함수 ... 561 6.5 추상 클래스 ... 562 6.6 간접적인 기본 클래스 ... 566 6.7 가상 디스트럭터 ... 571 7. 다중 상속성 ... 576 7.1 여러 개의 기본 클래스 ... 576 7.2 가상 기본 클래스 ... 578 8. 요약 ... 580 9. 연습 문제 ... 581 제11장 클래스의 사용 사례 1. 클래스 사용하기 ... 585 1.1 문제 정의 ... 585 1.2 문제 분석 ... 586 2. 코딩 작업이 시작되게 하라 ... 589 2.1 CCalculator 클래스 정의하기 ... 590 2.2 계산기 시작하기 ... 605 2.3 계산기 입력 ... 607 2.4 논리 장치 구현하기 ... 613 2.5 CRegister 클래스 ... 618 2.6 산술 연산 처리하기 ... 627 2.7 CLogicUnit 클래스 작성하기 ... 633 2.8 CDisplay 클래스 작성하기 ... 633 2.9 괄호 처리하기 ... 644 3. 요약 ... 650 4. 연습 문제 ... 651 제12장 디버깅 1. 디버깅에 대한 이해 ... 655 1.1 프로그램 버그 ... 657 2. 기본적인 디버깅 작업 ... 659 2.1 breakpoint 설정하기 ... 662 2.2 디버깅 시작하기 ... 664 2.3 변수의 값 변경시키기 ... 672 3. 디버깅 코드 추가하기 ... 673 3.1 assertion 사용하기 ... 673 3.2 여러분만의 디버깅 코드 추가하기 ... 676 4. 프로그램 디버그하기 ... 685 4.1 콜 스택 ... 685 4.2 에러로 곧장 가기 ... 688 5. 확장된 클래스 테스트하기 ... 692 5.1 그 다음의 버그 찾아내기 ... 695 6. 동적인 메모리 디버깅하기 ... 696 6.1 free store를 검사하는 함수들 ... 697 6.2 free store 디버그 작업 제어하기 ... 699 6.3 free store 디버깅 출력 ... 701 7. 요약 ... 708 제13장 윈도우 프로그래밍에 대한 이해 1. 윈도우 프로그램의 본질적인 사항 ... 711 1.1 윈도우 API ... 713 1.2 비주얼 C++와 윈도우 API ... 713 2. MFC ... 714 2.1 MFC 표기법 ... 714 2.2 하나의 MFC 프로그램이 어떻게 구성되는가 ... 715 2.3 도큐먼트와 뷰에 대한 개념 ... 722 2.4 도큐먼트와 그것의 뷰 링크시키기 ... 725 2.5 여러분의 응용 프로그램과 MFC ... 726 3. 비주얼 C++를 사용한 윈도우 프로그래밍 ... 728 3.1 AppWizard란 ... 729 3.2 SDI 응용 프로그램을 생성하는 데 AppWizard 사용하기 ... 730 3.3 AppWizard로부터의 출력 ... 737 3.4 MDI 응용 프로그램을 생성하는 데 AppWizard 사용하기 ... 753 3.5 ClassWizard 사용하기 ... 756 4. 요약 ... 759 5. 연습 문제 ... 760 제14장 메뉴와 툴바 사용하기 1. 윈도우 운영체제와 통신하기 ... 763 1.1 메시지 맵 이해하기 ... 764 1.2 메시지의 종류 ... 768 1.3 프로그램에서 메시지 처리하기 ... 769 2. Sketcher 프로그램 확장시키기 ... 771 3. 메뉴의 요소 ... 771 3.1 메뉴 리소스 생성하고 편집하기 ... 772 4. 메뉴 메시지에 대해서 ClassWizard 사용하기 ... 777 4.1 메뉴 메시지를 처리할 클래스 선택하기 ... 779 4.2 메뉴 메시지 함수 생성하기 ... 780 4.3 메뉴 메시지 함수 작성하기 ... 784 4.4 사용자 인터페이스를 업데이트하기 위해 메시지 핸들러 추가하기 ... 789 5. 툴바 버튼 추가하기 ... 794 6. 요약 ... 798 7. 연습 문제 ... 800 제15장 윈도우 안에서 그리기 1. 윈도우 안에서 드로잉할 때의 기본적인 사항 ... 803 1.1 윈도우의 클라이언트 영역 ... 804 1.2 윈도우 운영체제의 그래픽 장치 인터페이스 ... 805 2. 비주얼 C++에서의 드로잉 매커니즘 ... 808 2.1 응용 프로그램 안에 있는 뷰 클래스 ... 808 2.2 CDC 클래스 ... 810 3. 실제적으로 그림 그리기 ... 822 4. 마우스 프로그래밍하기 ... 825 4.1 마우스로부터의 메시지 ... 825 4.2 마우스 메시지 핸들러 ... 827 4.3 마우스를 사용한 드로잉 ... 831 5. Sketcher 갖고 연습하기 ... 864 5.1 샘플 실행하기 ... 864 5.2 마우스 메시지 포착하기 ... 866 6. 요약 ... 868 7. 연습 문제 ... 869 제16장 도큐먼트를 생성하고 뷰 향상시키기 1. 컬렉션 클래스란 무엇인가? ... 873 1.1 컬렉션의 형식 ... 873 1.2 type-safe 컬렉션 클래스 ... 875 1.3 객체들의 컬렉션 ... 875 1.4 형식을 갖는 포인터 컬렉션 ... 888 2. CList 템플릿 클래스 사용하기 ... 891 2.1 곡선 그리기 ... 892 2.2 CCurve 클래스 정의하기 ... 893 2.3 CCurve 클래스 구현하기 ... 896 2.4 CCurve 클래스 사용해 보기 ... 899 3. 도큐먼트 생성하기 ... 900 3.1 CTypedPtrList 템플릿 사용하기 ... 901 4. 뷰 향상시키기 ... 909 4.1 여러 개의 뷰들 업데이트하기 ... 909 4.2 뷰 스크롤하기 ... 911 4.3 MM_LOENGLISH 맴핑 모드 사용하기 ... 919 5. 도형을 삭제하고 이동시키기 ... 921 5.1 빠른 메뉴 구현하기 ... 922 5.2 요소 반전시키기 ... 935 5.3 메뉴 메시지 지원하기 ... 941 6. 차단된 요소(masked element) 처리하기 ... 951 7. 요약 ... 952 8. 연습 문제 ... 954 제17장 대화 상자와 컨트롤 사용하기 1. 대화 상자란 ... 957 2. 컨트롤이란 ... 958 2.1 공통적인 컨트롤 ... 960 3. 대화 상자 리소스 생성하기 ... 960 3.1 컨트롤을 대화 상자에 추가하기 ... 961 4. 대화 상자 프로그래밍하기 ... 964 4.1 대화 상자 클래스 추가하기 ... 964 4.2 modal 대화 상자와 modeless 대화 상자 ... 966 4.3 대화 상자 나타내기 ... 966 5. 대화 상자 컨트롤 지원하기 ... 969 5.1 컨트롤 초기화하기 ... 970 5.2 라디오 버튼 메시지 처리하기 ... 971 6. 대화 상자 작업 작성하기 ... 971 6.1 펜의 두께를 도큐먼트에 추가하기 ... 972 6.2 펜의 폭을 요소에 추가하기 ... 973 6.3 뷰 안에서 요소 생성하기 ... 975 6.4 대화 상자 사용하기 ... 976 7. 스핀 버튼 컨트롤 사용하기 ... 977 7.1 스케일 메뉴 항목과 툴바 버튼 추가하기 ... 977 7.2 스핀 버튼 생성하기 ... 978 7.3 스케일 대화 상자 클래스 생성하기 ... 980 7.4 스핀 버튼 나타내기 ... 984 8. 스케일 factor 사용하기 ... 985 8.1 스케일할 수 있는 맴핑 모드 ... 986 8.2 도큐먼트 크기 설정하기 ... 987 8.3 맴핑 모드 설정하기 ... 988 8.4 스케일 기능을 사용하여 스크롤 기능 향상시키기 ... 990 9. 상태바 생성하기 ... 993 9.1 상태바를 프레임에 추가하기 ... 994 10. 리스트 박스 사용하기 ... 1000 10.1 스케일 대화 상자 삭제하기 ... 1000 10.2 리스트 박스 컨트롤 생성하기 ... 1001 11. 편집 박스 컨트롤 사용하기 ... 1005 11.1 편집 박스 리소스 생성하기 ... 1006 11.2 대화 상자 클래스 생성하기 ... 1007 11.3 텍스트 메뉴 항목 추가하기 ... 1009 11.4 텍스트 요소 정의하기 ... 1011 11.5 CText 클래스 구현하기 ... 1012 11.6 텍스트 요소 생성하기 ... 1014 11.7 편집 박스 사용하기 ... 1017 12. 요약 ... 1017 13. 연습 문제 ... 1018 제18장 도큐먼트 저장하고 출력하기 1. 시리얼화란 ... 1021 2. 도큐먼트 시리얼화하기 ... 1022 2.1 도큐먼트 클래스 정의 안에서의 시리얼화 작업 ... 1022 2.2 도큐먼트 클래스 구현에서의 시리얼화 작업 ... 1024 2.3 CObject를 기반으로 하는 클래스의 기능 ... 1027 2.4 시리얼화가 작동하는 방식 ... 1029 2.5 클래스에 시리얼화를 구현하는 방법 ... 1031 3. 시리얼화 추가하기 ... 1031 3.1 도큐먼트 변경 사항 기록하기 ... 1031 3.2 도큐먼트 시리얼화하기 ... 1033 3.3 요소 클래스들 시리얼화하기 ... 1035 4. 시리얼화 사용하기 ... 1040 5. 텍스트 이동시키기 ... 1042 6. 도큐먼트 출력하기 ... 1044 6.1 출력 과정 ... 1045 7. 여러 개의 페이지를 출력하는 기능 구현하기 ... 1049 7.1 전체 도큐먼트 크기 얻기 ... 1050 7.2 출력 데이터 저장하기 ... 1051 7.3 프린트 작업 준비하기 ... 1053 7.4 디바이스 컨텍스트 준비하기 ... 1056 7.5 도큐먼트 출력하기 ... 1058 7.6 도큐먼트 출력하기 ... 1063 8. 요약 ... 1064 9. 연습 문제 ... 1065 제19장 DLL 작성하기 1. DLL이란 ... 1069 1.1 DLL이 작동하는 방식 ... 1071 1.2 DLL의 내용 ... 1075 1.3 DLL의 변형 ... 1076 2. 어떤 것을 DLL 안에 포함시킬 것인가 결정하기 ... 1077 3. DLL 작성하기 ... 1078 3.1 확장 DLL을 작성하고 사용하기 ... 1078 3.2 DLL로부터 변수와 함수들 익스포트하기 ... 1088 3.3 심볼을 프로그램 안으로 임포트하기 ... 1090 3.4 DLL로부터 심볼을 익스포트하는 것 구현하기 ... 1090 4. 요약 ... 1094 5. 연습 문제 ... 1095 제20장 데이터 소스와 접속하기 1. 데이터베이스에 대한 기본적인 사항 ... 1099 2. 작은 SQL ... 1102 2.1 SQL을 사용하여 데이터 검색하기 ... 1103 2.2 SQL 사용하여 테이블들 결합시키기 ... 1105 2.3 레코드 정렬하기 ... 1109 3. MFC에서의 데이터베이스 지원 ... 1110 3.1 DAO 對 ODBC ... 1111 3.2 DAO를 지원하는 클래스들 ... 1112 3.3 ODBC를 지원하는 클래스 ... 1113 4. 데이터베이스 응용 프로그램 생성하기 ... 1114 4.1 ODBC 데이터베이스 등록하기 ... 1115 4.2 ODBC 프로그램을 생성하기 위해 AppWizard 사용하기 ... 1117 4.3 프로그램 구조 ... 1122 4.4 예제 사용하기 ... 1135 4.5 레코드셋 정렬하기 ... 1135 4.6 두 번째 레코드셋 객체 사용하기 ... 1137 4.7 고객 사항 보기 ... 1161 5. 요약 ... 1173 6. 연습 문제 ... 1173 제21장 데이터 소스 업데이트하기 1. 업데이트 작업 ... 1177 1.1 CRecordSet 업데이트 작업 ... 1178 1.2 트랜잭션 ... 1181 2. 간단한 업데이트 예제 ... 1183 2.1 응용 프로그램 커스텀화하기 ... 1186 3. 업데이트 과정 관리하기 ... 1188 3.1 업데이트 모드 구현하기 ... 1191 4. 행을 테이블에 추가하기 ... 1203 4.1 order 입력 과정 ... 1204 4.2 리소스 생성하기 ... 1205 4.3 컨트롤들을 대화 상자 리소스에 추가하기 ... 1207 4.4 대화 상자 사이에서 전환하는 것 구현하기 ... 1211 4.5 Order ID 생성하기 ... 1217 4.6 order 데이터 저장하기 ... 1224 4.7 order에 대한 제품 선택하기 ... 1227 4.8 새로운 order 추가하기 ... 1230 5. 요약 ... 1236 6. 연습 문제 ... 1237 제22장 OLE 문서