머 리 말 어떤 책이 좋은 책일까? 한 번 쓰고 버려지는 책이 되지 않기 위해 지난 20개월간 무던히도 애를 썼습니 다. 이제 책이 나왔지만, 여전히 세상에 내놓기가 두렵습니다. C 언어가 최고의 언어라고 생각하고 있었던 1980년대 후반, 저자는 C++를 처음 접하곤

Similar documents
Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

프입2-강의노트-C++배경

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할


C++ Programming

Windows 8에서 BioStar 1 설치하기

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - C++ 5 .pptx

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

쉽게 풀어쓴 C 프로그래밍

untitled

Microsoft PowerPoint - chap05-제어문.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - 2주차.pptx

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

회원번호 대표자 공동자 KR000****1 권 * 영 KR000****1 박 * 순 KR000****1 박 * 애 이 * 홍 KR000****2 김 * 근 하 * 희 KR000****2 박 * 순 KR000****3 최 * 정 KR000****4 박 * 희 조 * 제

Microsoft PowerPoint - chap10-함수의활용.pptx

초보자를 위한 C++

금오공대 컴퓨터공학전공 강의자료

<B3EDB9AEC0DBBCBAB9FD2E687770>

hlogin2

No Slide Title

Microsoft PowerPoint - chap04-연산자.pptx

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - chap03-변수와데이터형.pptx

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

SBR-100S User Manual

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

설계란 무엇인가?

쉽게 풀어쓴 C 프로그래밍

View Licenses and Services (customer)

강의계획서 1. 강의개요 학습과목명 객체지향프로그래밍 Ⅰ 학점 3 학점교 강사명교 강사전화번호 강의시간 4시간강의실수강대상 2. 교과목학습목표 4차산업혁명시대의도래로컴퓨터와프로그래밍에대한관심이커지고있으며, 여러분야에서소프트웨어의중요성을강조하며, 새시대를이끌

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

BMP 파일 처리

gnu-lee-oop-kor-lec06-3-chap7

슬라이드 1

설계란 무엇인가?

쉽게 풀어쓴 C 프로그래밍

설계란 무엇인가?

C++ Programming

슬라이드 1

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Deok9_Exploit Technique

C++ Programming

(Microsoft PowerPoint - 11\300\345.ppt [\310\243\310\257 \270\360\265\345])

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

쉽게 풀어쓴 C 프로그래밍

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

C++ Programming

지도상 유의점 m 학생들이 어려워하는 낱말이 있으므로 자세히 설명해주도록 한다. m 버튼을 무리하게 조작하면 고장이 날 위험이 있으므로 수업 시작 부분에서 주의를 준다. m 활동지를 보고 어려워하는 학생에게는 영상자료를 접속하도록 안내한다. 평가 평가 유형 자기 평가

Microsoft PowerPoint - additional08.ppt [호환 모드]

Microsoft 을 열면 깔끔한 사용자 중심의 메뉴 및 레이아웃이 제일 먼저 눈에 띕니다. 또한 은 스마트폰, 테블릿 및 클라우드는 물론 가 설치되어 있지 않은 PC 에서도 사용할 수 있습니다. 따라서 장소와 디바이스에 관계 없이 언제, 어디서나 문서를 확인하고 편집

설계란 무엇인가?

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

OCW_C언어 기초


Tcl의 문법

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

PowerPoint Template

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - 00_(C_Programming)_(Korean)_Computer_Systems

Microsoft PowerPoint - Java7.pptx

PowerPoint Presentation

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

설계란 무엇인가?

JAVA PROGRAMMING 실습 08.다형성

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - chap12-고급기능.pptx

02 C h a p t e r Java

K&R2 Reference Manual 번역본

PathEye 공식 블로그 다운로드 받으세요!! 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다.

Microsoft PowerPoint - 2강

초보자를 위한 C++

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

KNK_C_05_Pointers_Arrays_structures_summary_v02

C프로-3장c03逞풚

C++ Programming

Microsoft PowerPoint - chap11-포인터의활용.pptx

Chapter ...

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

PowerPoint 프레젠테이션

C 프로그램의 기본

초보자를 위한 C# 21일 완성

SIGIL 완벽입문

Microsoft PowerPoint - chap06-1Array.ppt

<342EBAAFBCF620B9D720B9D9C0CEB5F92E687770>

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

<C6F7C6AEB6F5B1B3C0E72E687770>

C# Programming Guide - Types

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

BACK TO THE BASIC C++ 버그 헌팅: 버그를 예방하는 11가지 코딩 습관

Transcription:

국립중앙도서관 출판시도서목록(CIP) (명품) C++ programming / 황기태 지음. -- 파주 : 생능출판사, 2013 p. ; cm ISBN 978-89-7050-783-5 93000 : \29000 C++ 프로그래밍[C++ programming] 005.135-KDC5 005.133-DDC21 CIP2013012209

머 리 말 어떤 책이 좋은 책일까? 한 번 쓰고 버려지는 책이 되지 않기 위해 지난 20개월간 무던히도 애를 썼습니 다. 이제 책이 나왔지만, 여전히 세상에 내놓기가 두렵습니다. C 언어가 최고의 언어라고 생각하고 있었던 1980년대 후반, 저자는 C++를 처음 접하곤 객체 지향 개념의 새로움과 묘미에 흥분을 감추지 못했던 경험이 있습니다. 그리고 얼마 있지 않아 Unix 운영체제에서 대규모 VOD(Video On Demand) 시스템 을 시뮬레이션하는 멀티태스킹 프로그램을 C++로 작성하면서, 객체 지향 프로그래 밍의 파워와 아름다움에 완전히 빠져들게 되었습니다. 만일 클래스, 객체, 상속 등 의 개념이 없는 일차원적인 C 언어로 프로그램을 작성해야 했다면 얼마나 고생하였 을까? C++는 1979년 Bjarne Stroustrup에 의해 "C with Classes"라는 이름으로, C 언 어에 객체 지향 개념을 추가하는 정도로 시작되었지만, 지금은 시스템 소프트웨어, 응용 소프트웨어, 게임, 디바이스 드라이버, 임베디드 소프트웨어, 모바일 프로그 램 등 소프트웨어의 전 분야에 활용되고 있습니다. C++는 운영체제, 하드웨어, 응 용 분야를 가리지 않으며, 다른 객체 지향 언어인 Java나 C#에 비해 실행 속도가 빠 르다고 알려져 있고(다소 논쟁의 소지는 있지만), 메모리나 I/O 포트를 직접 세밀 하게 접근하므로 하드웨어 제어에 강점을 가집니다. 이처럼 C++는 광범위하면서도 파괴력 있는 프로그래밍 언어이고, Java나 C# 등 현대적 객체 지향 언어를 낳게 한 모태 언어이므로, 소프트웨어 전문가로서 탄탄한 기반을 갖추기 위해서라면 C++ 언어에 대한 충실한 이해가 필요합니다. 이 책은 C 언어를 알거나 다른 고급 언어의 프로그래밍 경험을 가진 독자들을 대 상으로 하는 책입니다. 변수, 함수, 순환문, 조건문 등 C 언어의 기본 지식들에 대 해서는 다루지 않고, 객체 지향 프로그래밍 및 C++만의 고유한 기능에 집중합니다. 이 책은 15주 한 학기 동안 학습할 수 있도록 총 13장으로 되어 있습니다. 본문 으로 다루기에 벅찬 고급 지식은 특별히 부록에 심화 학습으로 편성하였습니다. 읽 P R E F A C E 3

P R E F A C E 기 쉽고, 이해하기 쉽고, 활용 예제와 실전 연습 거리가 풍부하도록 책을 구성하였 습니다. 강조 단어, 하이라이팅, 말풍선, 그림, 삽화, 다양한 색으로 눈과 직관만으 로도 이해할 수 있도록 하고, 틈틈이 테스트를 위한 Check Time 문제들을 삽입하였 습니다. 연습문제에는 더욱 정성을 쏟았습니다. 이론 문제와 실습 문제로 나누고, 정곡을 찌르는 핵심을 담아 이론 문제를 만들었습니다. 실습 문제의 경우, 문제를 명료하게 제시하고 실행 결과를 삽입하여, 독자가 어떤 코드를 작성해야 하는지 분 명히 하였습니다. 또한 각 장의 주제에 맞는 독창적인 코딩 문제와 함께 난이도를 삽입하였습니다. 특별히 각 장의 마지막에는 재미있는 Open Challenge 문제를 두 어 스스로 도전해 볼 수 있도록 하였습니다. 이 책을 쓰는 동안 많은 사람들의 도움을 받았습니다. 필요할 때마다 시간을 내 준 이신영, 소스 정리를 도와준 서영덕, 한혜림, 김태완, 배진식 학생에게 감사하 고, 교정과 함께 알찬 조언을 주신 유상미 교수님께 감사드립니다. 마지막까지 책 의 디테일을 살리기 위해 애쓴 생능출판사 직원 분들께 진심으로 감사드립니다. 격 려와 관심으로 늘 지켜준 사랑하는 원선, 수연, 연수, 수희에게 감사하고, 겸손한 마음으로 하나님께 영광을 돌립니다. 2013년 7월 촉촉한 장맛비가 내리는 날에, 황기태 4

이 책의 구성과 강의 계획 이 책은 15주의 한 학기 강의에 맞추어 13장으로 구성하였습니다. 초보자에게 3, 4장을 2주에 걸쳐 강의하기에는 다소 부담될 수 있습니다. 16주 강의의 경우 3, 4장을 3주에 걸쳐 강의하는 것도 좋은 방법입니다. 진도가 충분한 경우 부 록의 일부 내용을 1주에 강의해도 됩니다. 과제 - 복습에 적합한 이론 연습문제와, 실습 과제로 풀어 볼 만한 재미있고 유익한 많은 연습 문제들과 Open Challenge 문제가 있습니다. 시험 문제 - Check Time 문제와 각 장의 이론 연습문제는 시험 문제로도 적절합니다. 예제 소스와 정답이 공개된 연습문제의 소스는 Visual Studio 2008과 Visual Studio 2010 용으로 따로 CD에 제공됩니다. 주 내용 목표 1 1장 C++ 시작 C++ 기초 이해, Visual C++ 사용 2 2장 C++ 프로그래밍의 기본 C++ 프로그램 구성, 키 입력, 화면 출력 3 3장 클래스와 객체 클래스 만들기, 객체 생성, 기타 C++의 주요 특징 이해 4 4장 객체 포인터와 객체 배열, 객체의 동적 생성 5 5장 함수와 참조, 복사 생성자 6 6장 함수 중복과 static 멤버 7 7장 프렌드와 연산자 중복 8 중간고사 객체 포인터, 객체의 동적 생성 및 소멸, 동적 배열 다루기, this, string 클래스 사례 활용 값에 의한 호출의 문제점 이해, 참조와 참조에 의한 호출, 복사 생성자 작성 중복 함수 만들기, 중복으로 인한 모호성 이해, 디폴트 매개 변수를 가진 함수 만들기, static 멤버 활용 프렌드 개념 이해 및 활용, 다양한 연산자 중복과 프렌드가 필요한 연산 자 만들기 9 8장 상속 상속 만들기와 파생 클래스의 객체 이해, 다중 상속, 가상 상속 10 9장 가상 함수와 추상 클래스 11 10장 템플릿과 표준 템플릿 라이브러리(STL) 12 11장 C++ 입출력 시스템 13 12장 C++ 파일 입출력 14 13장 예외 처리와 C 언어와의 링크 지정 가상 함수와 오버라이딩 활용, 동적 바인딩 이해, 추상 클래스를 이용하 는 프로그래밍 연습 일반화의 개념 이해, 템플릿 함수와 클래스 만들기, 간단한 STL 라이브러 리 활용 스트림 입출력에 대한 이해, 문자 입출력, 포맷 입출력, 사용자 삽입 연산 자와 추출 연산자 만들기, 사용자 조작자 만들기 텍스트 파일과 바이너리 파일에 대한 이해, 파일 읽기 및 쓰기, 스트림 상태 이해, 임의 접근으로 파일 입출력 실행 오류와 오류 처리 방법 이해, 예외 처리 코드 작성, C++에서 C 코드 링킹 이해 P R E F A C E 15 기말고사 5

이 책 의 특 징 잠깐! 지나치기 쉬운 내용들을 환기시키기 위 해 주의 사항 등을 설명하였습니다. Tip 학습한 내용의 보충 설명이나 참고 사항 등을 정리하였습니다. CHECK TIME 배운 내용을 점검하기 위해 단답형 문제 를 제시하였습니다. 요약 SUMMARY 배운 내용을 정리하기 쉽도록 주요 용 어를 중심으로 주요 내용을 요약하였습 니다. 6

Open Challenge 프로젝트 문제로 그 장에서 학습한 내용 을 응용하여 프로그램을 작성할 수 있도 록 하였습니다. 연습문제 EXERCISE 배운 내용을 정확히 이해하고 있는지 스 스로 검토하도록 하기 위한 이론 문제 와 이론을 바탕으로 실전 응용프로그램 을 작성하도록 하는 다양한 실습 문제 를 수록하였습니다. 본문을 쉽게 이해하도록 돕는 그림 과 삽화 내용을 쉽게 이해하고 지루하지 않도 록 그림과 삽화를 다양하게 사용하였습 니다. 7

차 례 머리말 3 C O N T E N T S CHAPTER 01 CHAPTER 02 이 책의 구성과 강의 계획 5 이 책의 특징 6 C++ 시작 1.1 컴퓨터와 프로그래밍 16 1.2 C++ 언어의 역사 19 1.3 C++ 언어의 특징 22 1.4 C++ 프로그램 개발 과정 29 1.5 C++ 표준 라이브러리 34 1.6 Visual C++를 이용한 C++ 프로그램 개발 35 요약 44 Open Challenge 45 연습문제 46 C++ 프로그래밍의 기본 2.1 C++ 프로그램의 기본 요소와 화면 출력 52 2.2 namespace와 std:: 58 2.3 키 입력 받기 63 2.4 키보드로 문자열 입력 68 2.5 #include <iostream>에 숨은 진실 75 요약 80 Open Challenge 81 연습문제 82 8

CHAPTER 03 클래스와 객체 3.1 객체에 대한 이해 94 3.2 C++ 클래스 만들기 99 3.3 객체 생성과 객체 활용 101 3.4 생성자 105 3.5 소멸자 114 3.6 접근 지정 120 3.7 인라인 함수 124 3.8 C++ 구조체 128 3.9 바람직한 C++ 프로그램 작성법 130 요약 136 Open Challenge 137 CHAPTER 04 연습문제 138 객체 포인터와 객체 배열, 객체의 동적 생성 4.1 객체 포인터 152 4.2 객체 배열 155 4.3 동적 메모리 할당 및 반환 163 4.4 객체와 객체 배열의 동적 생성 및 반환 170 4.5 this 포인터 180 4.6 string 클래스를 이용한 문자열 사용 184 요약 197 Open Challenge 198 연습문제 199 C O N T E N T S 9

CHAPTER 05 함수와 참조, 복사 생성자 5.1 함수의 인자 전달 방식 리뷰 214 5.2 함수 호출시 객체 전달 216 C O N T E N T S CHAPTER 06 5.3 객체 치환 및 객체 리턴 223 5.4 참조와 함수 225 5.5 복사 생성자 240 요약 258 Open Challenge 259 연습문제 260 함수 중복과 static 멤버 6.1 함수 중복 270 6.2 디폴트 매개 변수 275 6.3 함수 중복의 모호성 283 6.4 static 멤버 288 요약 300 Open Challenge 301 연습문제 302 CHAPTER 07 프렌드와 연산자 중복 7.1 C++ 프렌드 개념 312 7.2 연산자 중복 319 7.3 이항 연산자 중복 324 7.4 단항 연산자 중복 334 7.5 프렌드를 이용한 연산자 중복 341 요약 349 10

Open Challenge 350 연습문제 351 CHAPTER 08 상속 8.1 상속의 개념 364 8.2 클래스 상속과 객체 368 8.3 상속과 객체 포인터 373 8.4 protected 접근 지정 376 8.5 상속과 생성자, 소멸자 379 8.6 상속의 종류 : public, protected, private 상속 387 8.7 다중 상속 392 8.8 가상 상속 395 CHAPTER 09 요약 400 Open Challenge 401 연습문제 402 가상 함수와 추상 클래스 9.1 상속 관계에서의 함수 중복 416 9.2 가상 함수와 오버라이딩 418 9.3 가상 함수와 오버라이딩의 활용 사례 435 9.4 추상 클래스 438 요약 445 Open Challenge 446 연습문제 448 C O N T E N T S 11

CHAPTER 10 템플릿과 표준 템플릿 라이브러리(STL) 10.1 일반화와 템플릿 462 10.2 다양한 제네릭 함수 만들기 470 C O N T E N T S CHAPTER 11 10.3 제네릭 클래스 만들기 476 10.4 C++ 표준 템플릿 라이브러리(STL)와 활용 483 요약 496 Open Challenge 497 연습문제 498 C++ 입출력 시스템 11.1 C++ 입출력 기초 510 11.2 ostream의 멤버 함수를 이용한 문자 출력 517 11.3 istream의 멤버 함수를 이용한 문자 입력 519 11.4 포맷 입출력 527 11.5 삽입 연산자(<<)와 추출 연산자(>>) 538 11.6 사용자 조작자 만들기 548 요약 552 Open Challenge 553 연습문제 554 CHAPTER 12 C++ 파일 입출력 12.1 텍스트 파일과 바이너리 파일 564 12.2 파일 입출력 개요 569 12.3 <<와 >> 연산자를 이용한 간단한 텍스트 파일 입출력 571 12.4 파일 모드 578 12.5 멤버 함수를 이용한 텍스트 I/O 580 12

12.6 바이너리 I/O 589 12.7 스트림 상태 검사 598 12.8 임의 접근 601 요약 607 Open Challenge 608 연습문제 609 CHAPTER 13 예외 처리와 C 언어와의 링크 지정 13.1 실행 오류와 오류 처리 620 13.2 예외와 예외 처리 624 13.3 예외 처리에 대한 자세한 설명 630 13.4 예외 클래스 만들기 638 13.5 C++ 코드와 C 코드의 링킹 640 요약 647 Open Challenge 648 연습문제 650 Check Time 정답 661 찾아보기 668 C O N T E N T S 13

01 C++ 시작 1.1 컴퓨터와 프로그래밍 1.2 C++ 언어의 역사 1.3 C++ 언어의 특징 1.4 C++ 프로그램 개발 과정 1.5 C++ 표준 라이브러리 1.6 Visual C++를 이용한 C++ 프로그램 개발

01 CHAPTER C++ 시작 1.1 컴퓨터와 프로그래밍 세상을 먹어치우는 소프트웨어(Why Software Is Eating The World?) 최초로 모자이크(Mosaic)라는 인터넷 웹 브라우저를 만들고 넷스케이프를 공동 창업 한 마크 앤드리슨은 2011년 8월 20일 월 스트리트 저널(Wall Street Journal)에 실은 글에서 '소프트웨어 기업이 세상을 지배'하는 전쟁이 시작되었음을 힘주어 말한다. 소프트웨어 ebay, Facebook, Groupon, Skype, Twitter, Android 등 최근 IT 분야는 소프트웨어 기업들이 앞 다투어 이름을 올리면서 세상을 삼킬 듯이 휘저어대고 있다. 철옹성이라 고 믿었던 미국의 대형 서점 보더스(Borders)가 2011년 9월 13일 아마존에 의해 결국 문을 닫고, 블록버스터(Blockbuster)라는 대형 비디오 대여 체인은 네플릭스(Neflix) 라는 온라인 비디오 대여 기업에 의해 완전히 무너지는 등 소프트웨어 기업이 일어서 고 있으며, 아이튠스, 판도라, 애니메이션 기업 픽사(Pixar) 등 소프트웨어 기업이 세 상을 지배하기 시작하였다. 특히 분야를 가리고 않고 모든 분야에서 소프트웨어 혁명 이 일고 있다고 주장한다. 거대 소프트웨어 기업인 마이크로소프트나 오라클 등도 세 일즈포스닷컴이나 안드로이드 같은 새로운 소프트웨어의 물결에 위협을 받고 있다. 앞으로의 10년은 기존 업계의 강자와 새로운 소프트웨어로 무장한 반란군의 엄청난 대결이 예상된다고 힘주어 말한다. [그림 1-1] 세상을 지배하는 소프트웨어

01 CHAPTER C++ 시작 17 "Over the next 10 years, the battles between incumbents and softwarepowered insurgents will be epic." 이제, 소프트웨어가 주목받는 세상이 이미 왔고 이 시대의 IT 세계를 지배할 것이 다. [그림 1-1]은 소프트웨어가 세상을 지배함을 은유적으로 보여준다. 소프트웨어와 컴퓨터 컴퓨터 하드웨어 소프트웨어 컴퓨터의 형태는 [그림 1-2]와 같이 방 하나를 차지하는 메인 프레임, 친숙한 PC, 손안 의 컴퓨터라고 불리는 태블릿(tablet)이나 스마트폰(smartphone), 더 작게는 장난 감에 들어 있는 원 칩 컴퓨터(one-chip computer) 등과 같이 다양해졌다. 컴퓨터 하 드웨어(hardware)를 작동시켜 쇼핑을 하고 신문을 보고 음악을 듣고 게임을 할 수 있 게 하는 것을 소프트웨어(software)라고 하며, 프로그램(program)이라고 부르기도 한다. 소프트웨어는 컴퓨터의 중앙처리장치(CPU)가 이해할 수 있는 일련의 명령들 (instructions)과 데이터로 구성되며, CPU는 이 명령들을 순차적으로 해석하여 실행 함으로써 요구된 기능을 수행한다. 소프트웨어는 보통 CD나 DVD 같은 저장 매체로 제공되지만, 최근에는 인터넷에서 직접 다운로드받을 수 있는 형태로 제공되기도 한다. 특히 태블릿이나 스마트폰에서 작동하는 소프트웨어를 앱(APP)이라고 부르며, 이들은 인터넷 앱 스토어에서 사용자 가 바로 구입하기도 한다. 애플의 아이폰에서 볼 수 있듯이 사용자들이 열광하는 사용자 인터페이스, 앱 스토 어, 시리 등과 같은 것들은 모두 소프트웨어를 통해 이뤄진 혁신들로서, 소프트웨어가 제품 경쟁력을 좌우하는 가장 중요한 요소가 되었다. 하드웨어 경쟁력에 치중하던 국 내 전자업계에서도 최근에는 소프트웨어 경쟁력 강화를 목표로 세우고 있으며 이를 위 해 엄청난 소프트웨어 인력들을 필요로 하고 있다. [그림 1-2] 컴퓨터와 소프트웨어

18 명품 C++ 프로그래밍 프로그래밍과 프로그래밍 언어 프로그래밍 프로그래밍 언어 기계어 어셈블리어 어셈블러 고급 언어 컴파일러 컴파일 컴퓨터가 처리할 일련의 작업을 묘사하는 것을 프로그래밍(programming)이라 하고, 이때 사용하는 컴퓨터 언어를 프로그래밍 언어(programming language)라고 한다. 이것은 마치 사람이 다른 사람에게 뜻을 전달하기 위해 글로 문서를 작성하는 것과 같다. 프로그래밍 언어에는 여러 가지 종류가 있다. 컴퓨터의 두뇌인 CPU는 이진수 (binary code)인 0과 1밖에 이해하지 못한다. 컴퓨터가 바로 이해하고 처리할 수 있 는 0과 1만의 이진수를 사용하는 가장 원시적인 언어를 기계어(machine language)라 고 한다. 그러나 기계어는 사람이 작성하기에는 매우 불편한 저수준 프로그래밍 언어 (low-level programming language)로서, 컴퓨터가 등장한 1950년대 초기에는 기계 어를 사용하여 프로그램을 작성하기도 하였지만, 프로그램을 만들기도 어렵고 작성된 프로그램을 읽고 수정하는 것 또한 어려웠다. 이러한 어려움을 해결하기 위해 0과 1로 구성되는 기계어의 각 명령어를 ADD, SUB, MOVE 등과 같이 사람이 표현하기 쉬운 상징적인 니모닉 기호(mnemonic symbol)로 일 대일 대응시킨 어셈블리어(assembly language)가 만들어졌다. 어셈블리어로 작성된 프로그램은 어셈블러(assembler)라고 부르는 시스템 프로그램에 의해 기계어 프로그 램으로 변환되어 컴퓨터에서 실행된다. 그러나 어셈블리어 역시 사람이 다루기 힘든 저수준 언어로서 복잡한 구조의 프로그램 작성이나 다양한 형태의 자료를 표현하기에 는 한계가 있다. 이에 사람이 이해하고 표현하기 쉬우며, 복잡한 알고리즘이나 다양한 프로그램 구 조 및 자료를 효율적으로 표현할 수 있는 Fortran, Pascal, Basic, C/C++, C#, Java 등 의 고급 언어(high-level programming language)가 생겨나게 되었다. 고급 프로그래 밍 언어로 작성된 프로그램은 컴파일러(compiler)라고 부르는 시스템 프로그램에 의 해 기계어로 변환되어 컴퓨터에서 실행된다. 고급 프로그램을 기계어 프로그램으로 변환하는 과정을 컴파일(compile)이라고 부른다. 그러나 보이지는 않지만 고급 프로 그램은 어셈블리어로 먼저 변환되고 다시 기계어로 변환되는 두 단계의 변환 과정을 거친다. [그림 1-3]은 프로그래밍 언어와 CPU, 사람 사이의 관계를 보여준다. 35 + 56 =? 01010000 00101001 11101011 LOAD AX 35 LOAD BX 56 ADD AX BX int i; i = 35 + 56; 기계어 어셈블 어셈블리어 컴파일 C++ [그림 1-3] 사람과 고급 언어, 그리고 컴퓨터와 기계어 사이의 친밀성

01 CHAPTER C++ 시작 19 CHECK TIME 많은 전문가들이 미래 세상을 바꾸고 지배할 것으로 예측하는 것은? 1 CPU 2 소프트웨어 3 C++ 4 스티브잡스 다음 중 가장 고급 언어는? 1 C++ 2 기계어 3 어셈블리어 4 자바의 바이트 코드 1.2 C++ 언어의 역사 프로그래밍 언어의 진화와 C++ 언어 BCPL B 언어 C 언어 C++ 언어 객체 지향 Java [그림 1-4]는 C++ 언어를 기준으로 지금까지 개발된 프로그래밍 언어의 진화 과정을 축 소하여 보여준다. 1950년대부터 어셈블리어의 한계를 극복한 고급 언어들이 개발되 기 시작했다. 1954년에 Fortran이 개발되었으며, 1967년에 운영체제나 컴파일러와 같 은 시스템 소프트웨어(system software)를 작성하기 위한 용도로 BCPL이라는 언어가 Martin Richards에 의해 개발되었다. Ken Tompson은 1970년 BCPL을 개선하여 B 언어 를 만들었고, 1972년에 Ken Tompson과 Dennis Ritchie는 DEC PDP-11 컴퓨터에서 실 행되는 유닉스 운영체제(UNIX)를 작성하기 위해 B 언어를 개선한 C 언어를 만들었다. 그 후 C 언어는 가장 강력한 언어로 많은 프로그램 개발자들의 사랑을 받아 왔으며, 많 은 소프트웨어 작성에 사용되었고, 지금도 여전히 활발히 사용되고 있다. C 언어는 시 스템 소프트웨어뿐만 아니라 모바일, 게임, 그래픽, 임베디드 등 다양한 응용프로그램 의 개발에 이르기까지 광범위하게 사용되고 있다. 한편, 컴퓨터의 속도가 빨라짐에 따라 소프트웨어의 크기도 커지게 되었고, C 언 어로 덩치 큰 소프트웨어를 개발할 때 프로그램 코드 관리에 어려움을 겪게 되었 다. 이러한 어려움을 개선하기 위해 C 언어에 객체 지향 특성(object oriented programming) 및 기능을 추가하여 1983에서 1985년 사이에 Bell 연구소의 Bjarne Stroustrup은 C++ 언어를 만들었다. 객체 지향 프로그래밍 기법은 클래스와 상속을 이용하여 소프트웨어의 재사용성을 높이고 소프트웨어의 개발과 관리를 쉽게 한다. C++ 언어는 C 언어의 모든 기능을 가지고 있기 때문에 이미 작성된 C 소스 프로그램을 그대로 혹은 조금만 수정하면 C++ 프로그램으로 재사용할 수 있고, 이미 컴파일된 C 목적 코드도 C++ 프로그램에서 링크하여 사용할 수 있다. 객체 지향 특성의 장점은 다른 언어가 태동하는데 큰 기여를 하였다. 1995년에는 C++의 영향을 받은 또 하나의 객체 지향 언어인 Java가 선마이크로시스템(현재는 오

20 명품 C++ 프로그래밍 C# 언어 라클에 인수됨)의 제임스 고슬링에 의해 만들어졌으며, 2000년에는 마이크로소프트에 서 C++와 Java의 개념을 섞은 C# 언어를 만들었다. C#은.NET 프레임워크가 설치된 마 이크로소프트의 플랫폼 상에서만 실행된다. C++, C#, Java는 모두 C 언어에 바탕을 두 었기 때문에 서로 매우 유사하며, C 언어를 잘 알면 이들 언어의 습득은 매우 쉽다. Assembly 1954 Fortran 1958 Algol Martin Richards 1967 BCPL 1964 Basic Ken Tompson 1970 B Ken Tompson과 Dennis Ritchie 1972 C Bjarne Stroustrup 1983 C++ 1983 Objective-C 1987 Perl 1991 Visual Basic 1995 PHP 1995 Java 1995 Javascript 2000 C# [그림 1-4] 프로그래밍 언어의 진화와 C++의 기원 표준 C++ 프로그램의 중요성 ANSI C++ 표준 산업의 모든 분야에서 그렇지만 소프트웨어 개발 분야에서도 표준(standard)은 중요 하다. 1998년 미국 국립 표준원인 ANSI(American National Standards Institute)에 서 C++ 언어에 대한 표준을 정하였다. 그 후 2003년, 2007년, 2011년, 표준을 갱신하면 서 C++ 표준은 계속 진화해가고 있다. 현재 C++ 표준은 ISO/IEC14882 문서에 작성되어 있으나 아쉽게도 이 문서는 공짜가 아니다. 현재 대부분의 컴파일러 회사들은 이 ANSI

01 CHAPTER C++ 시작 21 표준의 중요성 비주얼 C++만의 전용 키워드 표준을 따르는 C++ 컴파일러를 제작 공급하고 있다. 그러므로 ANSI 표준에 따라 만들 어진 C++ 프로그램 소스는 모든 플랫폼, 모든 C++ 컴파일러에 의해 컴파일 가능하고, 모두 동일한 실행 결과를 보장한다. 이것이 바로 표준의 중요성이다. 한편, 볼랜드 사의 C++, 마이크로소프트의 비주얼 C++ 등 컴파일러를 제작하는 대 부분의 회사들은 표준 C++ 기능에 자신만의 기능을 첨가한다. 현재 PC에서 많이 사 용하는 비주얼 C++의 경우, C++ 표준에 자신만의 독특한 기능을 추가하고 있기 때문 에, C++ 언어 표준에 대한 이해 없이 비주얼 C++로 C++ 프로그램을 작성하였을 때, 다른 C++ 컴파일러나 표준 C++ 컴파일러에서는 컴파일되지 않는 문제가 나타날 수 있다. [그림 1-5]를 보자. 왼쪽의 경우, 표준 C++ 규칙에 따라 작성된 C++ 프로그램은 어떤 컴파일러에 의해서도 컴파일되고 타겟 컴퓨터에서 동일하게 실행되지만, 오른쪽 경우 cdecl이라는 비주얼 C++만의 전용 키워드를 사용하여 비주얼 C++ 컴파일러가 아닌 다른 컴파일러에 의해서는 컴파일되지 않는다. 표준 C++ 칙에 라 작성된 C++ 프로그램 표준 C++ 칙에 라 작성되지 않는 비주얼 C++ 프로그램 모든 C++ 컴파일러에 의해 컴파일 #include <iostream> int main() { std::cout << "Hello"; return 0; } 비주얼 C++ 전용 키워드 #include <iostream> int cdecl main() { std::cout << "Hello"; return 0; } 드 C++ 컴파일러 비주얼 C++ 컴파일러 GNU C++ 컴파일러 드 C++ 컴파일러 비주얼 C++ 컴파일러 GNU C++ 컴파일러 실행 파일 실행 파일 실행 파일 실행 파일 실행 파일 실행 파일 컴퓨터 컴퓨터 [그림 1-5] C++ 표준으로 작성된 C++ 프로그램은 모든 컴파일러에 의해 컴파일됨 ANSI 표준의 C++ 비주얼 C++ 도구를 이용하되 C++ 언어 표준에 준하여 프로그래밍하면 컴파일러나 플랫폼에 상관없이 컴파일되고 실행 가능하다. C++ 언어로 소프트웨어를 개발하여 세 상의 모든 컴퓨터와 플랫폼 사용자에게 판매하고자 한다면, 표준 C++ 언어로 프로그램 을 작성하는 것이 바람직하다. 이 책은 ANSI 표준의 C++에 대해서만 다룬다.

22 명품 C++ 프로그래밍 잠깐! 컴파일러와 목적 코드 컴파일러 회사는 자사의 독자적 기술을 사용하기 때문에, 컴파일러마다 컴파일한 실행 파일이 서로 다르다. 컴파일러 회사들은 목적 코드의 길이를 줄이고, 실행 속도를 높이고, 혹은 전력 소모를 적게 하는 기계어 명령들로 컴파일하기 위해 서로 경쟁하고 있다. CHECK TIME 다음 언어들을 만들어진 연대순으로 나열하라. Java, C, C#, C++ 다음 언어 중에서 가장 관련성이 떨어지는 것은? 1 C 2 C++ 3 Basic 4 Java C++ 표준이 중요한 이유는? 1 개발 속도 2 호환성 3 특수성 4 정확성 1.3 C++ 언어의 특징 C++ 언어의 주요한 설계 목표 호환성 객체 지향 개념 타입 체크 엄격 효율성 저하 최소화 C++ 언어의 기본적인 설계 목표에 대해 알아보자. 첫째, C 언어로 작성된 프로그램과의 호환성(compatability)을 유지한다. 기존 에 작성된 C 프로그램을 그대로 사용할 수 있도록 C 언어의 문법적 체계를 그대로 계 승한다. 또한 C 언어로 작성되어 컴파일된 목적 파일(object file)이나 라이브러리 (library)를 C++ 프로그램에서 링크하여 사용할 수 있도록 한다. 둘째, 소프트웨어의 재사용을 통해 소프트웨어 생산성을 높이고, 복잡하고 큰 규모 의 소프트웨어 작성, 관리, 유지 보수를 쉽게 하기 위해 데이터 캡슐화, 상속, 다형성 등 객체 지향 개념을 도입한다. 셋째, 타입 체크를 엄격히 하여 실행 시간 오류의 가능성을 줄이고 디버깅을 돕는다. 넷째, 실행 시간의 효율성 저하를 최소화한다. 객체 지향 개념의 도입으로 멤버 함 수의 호출이 잦아지고 이로 인해 발생하는 실행 시간 저하의 비효율성을 막기 위해 인 라인 함수의 도입 등 함수 호출로 인한 시간 저하를 막는다.

01 CHAPTER C++ 시작 23 C 언어에 추가한 기능 C++ 언어는 C 언어의 문법적 규칙을 그대로 승계하며, 프로그래밍의 편리와 다양성을 위해 다음과 같은 기능을 추가하였다. 인라인 함수 함수 중복 디폴트 매개 변수 참조 참조에 의한 호출 new와 delete 연산자 연산자 재정의 제네릭 함수와 클래스 인라인 함수(inline function) 자주 호출되는 함수의 경우 함수 호출 대신 함 수 코드를 확장 삽입하는 방식이며, 실행 시간을 줄인다(3장). 함수 중복(function overloading) 매개 변수의 개수나 타입이 서로 다른 동일 한 이름의 함수들을 선언할 수 있게 한다(6장). 디폴트 매개 변수(default parameter) 매개 변수에 값이 전달되지 않는 경우 디폴트 값이 전달되도록 함수를 선언할 수 있게 한다(6장). 참조(reference)와 참조 변수 변수에 별명을 붙여 변수 공간을 같이 사용할 수 있는 참조의 개념을 도입한다(5장). 참조에 의한 호출(call-by-reference) 함수 호출시 참조를 전달할 수 있게 한 다(5장). new와 delete 연산자 동적 메모리 할당, 해제를 위한 new, delete 연산자를 도 입한다(4장). 연산자 재정의(operator overloading) 기존의 연산자에 새로운 연산을 정의할 수 있게 한다(7장). 제네릭 함수와 클래스(generics) 함수나 클래스를 데이터 타입에 의존하지 않 고 일반화시킬 수 있게 한다(10장). C++의 객체 지향 특성 C++는 객체 지향 언어로서 다음과 같은 객체 지향 특성을 가지고 있다. 객체와 캡슐화(Encapsulation) 캡슐화 클래스 객체 실체 캡슐화는 데이터를 캡슐로 싸서 외부의 접근으로부터 데이터를 보호하는 객체 지향 특성이다. C++에서 캡슐의 역할을 하는 것이 클래스이며 class 키워드를 이용하여 작 성한다. 클래스는 객체를 정의하는 틀이며, 객체는 클래스라는 틀에서 생겨난 실체 (instance)이다. C++ 클래스는 멤버 변수들과 멤버 함수들로 이루어지며, 멤버들은 캡슐 외부에 공개하거나(public), 보이지 않게(private) 선언할 수 있다. 이중 공개 된 멤버들만 외부 객체들이 접근할 수 있다. C++ 프로그램 개발 시, 멤버 변수들은 외 부에 보이지 않게(private) 선언하여 외부에 노출시키지 않는 것이 좋다. 대신 일부 멤버 함수들을 외부에 공개하여(public), 이 멤버 함수를 통해서 멤버 변수에 간접적 으로 접근하게 한다. [그림 1-6]은 원 객체를 C++로 추상화한 Circle 클래스를 작성한 사례이다.

24 명품 C++ 프로그래밍 원 객체들 class Circle { 버들 private: int radius; // 지름 public: Circle(int r) { radius = r; } double getarea() { return 3.14*radius*radius; } }; [그림 1-6] 원 객체를 정의하는 C++ 클래스 상속 상속성(Inheritance) 객체 지향 언어에서 상속이란, 자식이 부모로부터 유산을 물려받는 개념이라기보다 는, 자식이 부모의 유전자를 물려받는 것과 유사하다. C++에서 상속은 객체를 정의하 는 클래스 사이에 상속 관계를 두어, 자식 클래스의 객체가 생성될 때 자식 클래스에 선언된 멤버뿐 아니라 부모 클래스에 선언된 멤버들도 함께 가지고 탄생하게 한다. 상 속은 구현된 코드의 재사용성을 높여서 소프트웨어 생산성을 높인다. [그림 1-7]은 상 속 관계로 선언된 3개의 클래스를 보여준다. MobilePhone(휴대 전화기) 클래스는 Phone(전화기) 클래스의 기능을 물려받고, MusicPhone(음악 기능 전화기) 클래스는 MobilePhone 클래스의 기능을 물려받는다. Phone 전화 기 전화 기 상속 기 MobilePhone 무선 기지 연결 배터리 전하기 상속 기 MusicPhone 음 다 기 음 재생하기 상속 관계 표현 class Phone { void call(); void receive(); }; class MobilePhone : public Phone { void connectwireless(); void recharge(); }; MobilePhone을 상속 는다. class MusicPhone : public MobilePhone { void downloadmusic(); void play(); }; C++로 상속 선언 Phone을 상속 는다. 전화기 대 전화기 음 기능 전화기 [그림 1-7] 상속 관계와 C++로 클래스 상속을 선언한 예 다형성 다형성(Polymorphism) 다형성은 하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 현상을 일컫는다. 다형성의 한 예로서 더하기 연산자(+)를 보자. + 연산자는 다음과 같이 정 수 덧셈이나 문자열 연결(concatenation), 객체 더하기 등 피연산자에 따라 서로 다

01 CHAPTER C++ 시작 25 른 연산이 이루어질 수 있다. 2 + 3 --> 5 "남자" + "여자" --> "남자여자" redcolor 객체 + bluecolor 객체 --> purplecolor 객체 연산자 중복 operator overloading 함수 중복 function overloading 이것을 C++에서는 연산자 중복(operator overloading)이라고 부른다. 또한 같은 이름의 함수가 매개 변수의 개수나 타입이 다르면 서로 다른 함수로 인식되는 함수 중 복(function overloading)도 다형성의 하나이다. 다음 3개의 함수 add()는 C++에서 서로 다른 함수로 다루어진다. void add(int a, int b) {... } void add(int a, int b, int c) {... } void add(int a, double d) {... } 함수 재정의 함수 오버라이딩 function overriding C++에서 다형성은 상속 관계에서도 나타난다. [그림 1-8]은 상속 관계의 다형성을 보 여주는 한 예로서, 강아지, 고양이, 닭은 모두 동물 클래스의 속성을 상속받고, '소리 내기' 함수를 강아지, 고양이, 닭에서 모두 서로 다르게 구현하였다. 이것은 부모 클 래스에 구현된 함수를 동일한 이름으로 자식 클래스에서 다르게 구현하는 함수 재정의 혹은 함수 오버라이딩(function overriding)으로 불린다...... 소리내기 상속 기 [그림 1-8] 상속 관계에서 다형성 사례. 각 객체들의 소리내기 함수가 다르게 구현됨 C++ 언어에서 객체 지향 개념을 도입한 목적 C++는 C, Pascal 등 기존의 절차 지향 언어가 가진 단점을 보완하고 다음과 같은 목적 으로 객체 지향 개념을 도입하였다.

26 명품 C++ 프로그래밍 소프트웨어의 생산성 향상 컴퓨터 산업이 발전함에 따라 소프트웨어의 생명 주기(life cycle)가 짧아졌다. 이로 인해 제품이 기획되면 짧은 시간 내에 소프트웨어를 만들어야만 한다. C++는 상속, 다 형성, 객체, 캡슐화 등 소프트웨어의 재사용을 위한 객체 지향적 장치를 내장하고 있 기 때문에, 이미 만들어진 C++ 클래스를 상속받거나 C++ 객체를 가져다 재사용하거나, 부분 수정을 통해, 소프트웨어를 작성하는 부담을 대폭 줄일 수 있다. 소프트웨어의 생산성이 향상된다. 실세계에 대한 쉬운 모델링 과거의 소프트웨어는 수학 계산이나 통계 처리 등 대체로 처리 과정이나 계산의 절차 가 중요하므로 절차 지향 언어가 적합하였다. 그러나 컴퓨터가 산업 전반에 다양하 게 활용되는 요즘 시대에는 응용 소프트웨어를 하나의 절차로 모델링하기 어렵다. 산 업 전반에서 요구되는 응용 소프트웨어 특성상, 절차나 과정보다 관련된 많은 물체(객 체)들의 상호 작용으로 묘사하는 것이 더 쉽고 적합하다. 이에 실세계의 현상을 보다 쉽게 프로그래밍하기 위해 객체를 중심으로 하는 객체 지향 언어가 나타나게 되었다. 게임을 예로 들어보자. 게임은 하나의 흐름도(flow chart)에 의해 진행되지 않는다. 게 임에는 인물, 무기, 배경 등의 요소들이 등장하며, 이들은 프로그램이 실행되는 동안 그래, 이 모든 것들을 객체로 프로그래밍하니 쉽구나. [그림 1-9] 실세계의 일을 프로그래밍하기 적합한 객체 지향 언어

01 CHAPTER C++ 시작 27 사용자의 입력에 의해 죽고, 살고, 움직이는 등 상호 작용하기 때문에 여기에 흐름도 는 힘을 쓰지 못한다. 객체 지향 언어는 게임에 등장하는 각 요소를 객체로 정의하고, 객체의 속성과 행위를 묘사하고 객체 사이의 상호 작용을 표현하는 방법으로 효과적인 프로그래밍을 할 수 있게 한다. 절차 지향 프로그래밍과 객체 지향 프로그래밍 C 언어 등을 이용하여 실행하고자 하는 절차대로 일련의 명령어를 나열하여 프로그래 절차 지향 프로그래밍 밍하는 방법을 절차 지향 프로그래밍(procedural programming)이라고 부르며, 이런 방법론에 사용되는 언어를 절차 지향 언어라고 한다. 절차 지향 프로그래밍은 작업을 절차로 표현하며, 명령들의 순서나 흐름에 중점을 둔다. 자판기 시뮬레이터를 구현하 는 경우를 예로 들어보자. 절차 지향 프로그래밍은 [그림 1-10](a)와 같이 흐름도(flow chart)를 설계하고 흐름도상의 동작들을 함수로 작성하여 흐름도에 따라 일련의 동작 들이 순서에 맞추어 실행되도록 작성한다. 그러나 실제 응용의 세계는 일련의 행위뿐만 아니라 각 물체 간의 관계, 상호 작용 시작 동전 입력 돈이 충분 한가? 아니오 예 돈통 커피통 물통 프림통 컵통 버튼2 버튼3 상품 선택 상품 재고 있나? 아니오 자판기 엔진 예 상품 인도 디스플레이 버튼1 종료 (a) 절차 지향 프로그래밍으로 구현할 때의 흐름도 (b) 객체 지향 프로그래밍으로 구현할 때의 객체 관계도 [그림 1-10] 자판기 시뮬레이터를 구현하는 절차 지향 프로그래밍과 객체 지향 프로그래밍의 비교

28 명품 C++ 프로그래밍 객체 지향 프로그래밍 등 훨씬 복잡하게 구성되어 있다. 이것을 절차 지향 언어로 표현하기에는 한계가 있 다. 객체 지향 개념은 이런 단점을 극복하며 프로그램을 보다 실제 세상에 가깝게 모 델링(modeling)하여 실제 세상의 물체를 객체로 표현한다. 그리고 객체들의 관계, 상 호 작용을 객체 지향 기법으로 구현한다. 자판기 시뮬레이터를 객체 지향 프로그래밍 으로 구현하는 경우, [그림 1-10](b)와 같이 객체를 추출하고 객체들의 관계를 결정하고 이들의 상호 작용을 멤버 함수와 멤버 변수로 구현한다. 11장 연습문제에서 커피자판 기 시뮬레이터를 작성하는 실습 문제를 풀어보라. C++ 언어와 제네릭 프로그래밍 제네릭 프로그래밍 generic programming 제네릭 함수 제네릭 클래스 템플릿 STL 최근에 제네릭 프로그래밍(generic programming)이라는 새로운 프로그래밍 패러 다임이 사용되고 있다. 동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있 도록 함수와 클래스를 일반화시킨 제네릭 함수(generic function)와 제네릭 클 래스(generic class)를 만들고, 제네릭 함수와 제네릭 클래스에서 개발자가 원하 는 데이터 타입을 적용시켜 프로그램 코드를 틀에서 찍어내는 듯이 생산하는 기법 이다. 2003년 ANSI C++ 표준에서 전격적으로 C++ 표준 라이브러리의 2/3를 제네릭으로 표 준화하였다. 입출력 라이브러리를 과감하게 템플릿(template)으로 선언하여 제네릭 화하고, 응용프로그램 개발에 필요한 대부분의 자료 구조를 제네릭 함수와 제네릭 클 래스로 구현한 STL(Standard Template Library)을 도입하여, 제네릭 프로그래밍 시 대를 출범시켰다. 제네릭은 C++뿐 아니라 Java, C# 등 다른 객체 지향 언어에서도 이미 도입하여 사용 하고 있으며 점점 그 중요성이 높아지고 있으므로 독자들이 잘 알아두어야 할 것이다. 10장에서는 제네릭 함수와 제네릭 클래스를 만들고 활용하는 방법과 C++ 표준 STL 라 이브러리를 사용하는 방법을 다루며, 부록 G에서는 STL의 고급 활용에 대해서 추가적 으로 설명한다. C++ 언어의 아킬레스 캡슐화 전역 변수 C++ 언어는 C 코드와의 호환성이라는 중요한 목표로 설계되어 기존의 C 코드 를 재사용할 수 있게 되었지만, 그것으로 인해 객체 지향의 핵심 개념인 캡슐화 (encapsulation)의 원칙이 다소 무너졌다. 캡슐화의 기본 원칙은 코드와 데이터를 외부의 접근으로부터 보호하기 위해, 변수 와 함수를 캡슐 즉 클래스 안에 선언하도록 하는 강력한 원칙이다. Java 언어는 이 원 칙을 굳건히 지키고 있지만, C++에서는 C 언어로 작성된 프로그램을 수용하기 위해, 함수 바깥에 전역 변수를 선언할 수 있는 C 언어의 특성을 받아들일 수밖에 없었다. 결

01 CHAPTER C++ 시작 29 국 이것 때문에, C++에서 클래스라는 캡슐 바깥에 함수나 전역 변수를 만들 수 있게 허 용하였으며, C 프로그래밍에 있었던 전역 변수의 사용에 따른 부작용(side effect)이 여전히 존재하게 된다. 비유하자면, 집 안에 있어야 하는 내 소유물들을 집 바깥에 두 어서 오가는 사람들이 함부로 건드릴 수 있게 된 것과 같다. CHECK TIME C 언어와 호환성을 유지하기 위해 원칙이 무너지게 된 C++ 언어의 객체 지향 특성은? 1 캡슐화 2 다형성 3 상속성 4 데이터 추상화 C++에서 C 언어에 새로 추가한 기능이 아닌 것은? 1 멀티스레딩 2 인라인 함수 3 연산자 중복 4 참조에 의한 호출 1.4 C++ 프로그램 개발 과정 [그림 1-11]을 통해 C++로 프로그램을 개발하는 과정을 알아보자. 이 과정은 C++ 소스 프 로그램(source program) 작성, 컴파일(compile), 링킹(linking)을 통해 하나의 실행 파일(executable file)을 만드는 과정으로 세분화된다. 일단 실행 파일이 생성되면 실 행 파일은 독립적으로 실행 가능하므로, 실행되는 동안 소스 파일이나 목적 파일이 필 요 없다. 이제 [그림 1-11]을 보면서 이 과정을 하나씩 살펴보자. C++ 소스 프로그램 작성 통합 개발 환경 C++ 소스 프로그램은 표준 확장자가 cpp인 텍스트 파일이므로 아무 텍스트 편집기를 이용하여도 작성 가능하다. [그림 1-11]에서 hello.cpp는 화면에 "Hello" 문자열을 출력 하는 간단한 C++ 소스 프로그램이다. 대부분의 컴파일러 회사들이 C++ 소스 프로그램 의 작성 및 편집, 컴파일, 링킹, 실행, 디버깅 등 C++ 프로그램 개발의 모든 단계를 지 원하는 통합 개발 환경(Integrated Development Environment)을 제공하고 있기 때문 에, 독자들은 허접한 텍스트 편집기를 이용하지 말고 C++ 통합 개발 소프트웨어를 이 용하기 바란다. 마이크로소프트의 Visual C++(비주얼 C++)는 PC에서 사용되는 대표적 인 통합 개발 소프트웨어이다.

30 명품 C++ 프로그래밍 C++ 라이브러리 cout... << Hello C++ 소스 프로그램 작성 #include <iostream> int main() { std::cout << "Hello"; return 0; } 소스 파일 (hello.cpp) 01010000 _main,12# 01000101 컴파일 $<<01010 01001111 링킹 00000111 _Hello001 실행 오 발생 목적 파일 (hello.obj) 01011010 10100101 11010101 실행 파일 (hello.exe) 오 수정 디버깅 [그림 1-11] C++ 프로그램 개발 과정 컴파일(compile) C++ 소스 프로그램 작성이 완료되었으면, C++ 컴파일러를 이용하여 C++ 소스 프로그램 을 컴파일한다. C++ 컴파일러는 C++ 소스 프로그램이 문법에 맞게 작성되었는지 검사 하고, 기계어 코드로 변환하여 목적 파일(object file)을 생성한다. 만일 문법에 맞지 않게 작성된 C++ 코드를 발견하면 컴파일 오류를 발생시킨다. 컴파일 후 기계어로 변환된 모양을 보여 주기 위해, [그림 1-12]를 마련하였다. [그 림 1-12]는 hello.cpp를 컴파일한 기계어 코드 리스트를 보여준다. C++ 소스의 각 라인 별로 컴파일된 기계어 코드와 각 기계어 코드에 해당하는 어셈블리어 코드도 함께 보 인다.

01 CHAPTER C++ 시작 31 1 2 3 4 5 6 #include <iostream> int main() { std::cout << "Hello"; return 0; } (a) hello.cpp 소스 파일 _main PROC ; COMDAT int main() { 라인을 어셈블리어 코드 ; 3 int main() { 컴파일한 기계어 코드 00000 55 push ebp 00001 8b ec mov ebp, esp 00003 81 ec c0 00 00 00 sub esp, 192 ; 000000c0H 00009 53 push ebx 0000a 56 push esi 0000b 57 push edi 0000c 8d bd 40 ffff ff lea edi, DWORD PTR [ebp -192] 00012 b9 30 00 00 00 mov ecx, 48 ; 00000030H 00017 b8 cc cc cc cc mov eax, -858993460 ; cccccccch 0001c f3 ab rep stosd ; 4 : std::cout << "Hello"; 0001e 68 00 00 00 00 push OFFSET??_C@_05COLMCDPH@Hello?$AA@ 00023 a1 00 00 00 00 mov eax, DWORD PTR imp_?cout@std@@3v?$basic_ostream@du?$ 00028 50 push eax 00029 e8 00 00 00 00 call??$?6u?$char_traits@d@std@@yaaav?$basic_ostream@du?$ 0002e 83 c4 08 add esp, 8 ; 5 : return 0; 00031 33 c0 xor eax, eax ; 6 : } 00033 5f pop edi 00034 5e pop esi 00035 5b pop ebx 00036 81 c4 c0 00 00 00 add esp, 192 ; 000000c0H 0003c 3b ec cmp ebp, esp 0003e e8 00 00 00 00 call RTC_CheckEsp 00043 8b e5 mov esp, ebp 00045 5d pop ebp 00046 c3 ret 0 _main ENDP (b) hello.cpp를 컴파일한 기계어와 어셈블리어 코드 리스트 [그림 1-12] hello.cpp를 컴파일하여 생성된 기계어와 어셈블리어 코드 리스트

32 명품 C++ 프로그래밍 잠깐! 컴파일 시 어셈블리어 출력 결과 얻기 [그림 1-12]는 비주얼 C++로 hello.cpp를 컴파일할 때, 기계어와 어셈블리어 코드 리스트를 파일로 저장하도록 한 후, 설명을 위해 파일을 보기 좋게 정리한 것이다. C++ 소스 파일을 컴파일한 기계어 나 어셈블리어 코드 리스트를 얻고 싶다면, 비주얼 C++의 프로젝트 메뉴에서 속성 메뉴를 선택하여 속성 창을 출력하고, 이 창에서 구성 속성/C/C++/출력 파일/어셈블러 출력 메뉴를 차례로 선택하고, 어셈블리, 기계어 코드, 소스 (/FAcs) 옵션을 선택한 후, 창을 닫고 나와서 프로젝트를 빌드하면 프 로젝트 폴더의 Debug 폴더 안에 hello.cod 파일이 생성된다. 이 파일은 텍스트 파일이므로 비주얼 C++에서 열어 볼 수 있다. 링킹(linking) 컴파일 후 기계어로 구성된 목적 파일(object file)이 생성되었다 하더라도 목적 파일 은 바로 실행될 수 없다. 개발자가 작성한 C++ 프로그램이 표준 C++ 라이브러리나 다 른 C++ 프로그램에 있는 함수, 객체, 데이터를 이용하는 경우, 개발자가 작성한 C++ 소 스의 목적 파일에는 이들에 대한 참조 표시만 있을 뿐 이들 코드를 포함하지 않는다. 그러므로 목적 파일은 온전한 실행 파일이 아니며 이들과 결합되어야만 비로소 실행 가능한 파일이 된다. [그림 1-11]의 hello.cpp 예를 들어보자. 다음 라인은 "Hello"를 화면에 출력하기 위 해 cout 객체와 << 연산자를 사용하고 있다. std::cout << "Hello"; 링킹 하나의 실행 파일로 만드는 과정 cout 객체와 << 연산자 함수 코드는 C++ 표준 라이브러리에 컴파일된 형태로 존재 하며, hello.obj에는 이들에 대한 참조 표시만 있다. 그러므로 hello.obj와 cout, << 연산자 함수의 코드를 함께 결합하는 링킹 과정이 필요하다. 링킹(linking)이란 어떤 목적 파일이 참조하는 C++ 표준 라이브러리나 다른 목적 파일 속에 있는 함수, 객체, 데이터를 포함하여 실행에 필요한 모든 기계어 코드를 확 보하여, 하나의 실행 파일로 만드는 과정이다. 링킹의 결과 비로소 실행에 필요한 모 든 요소를 포함한 하나의 실행 파일(exe 파일)이 만들어진다. 실행 파일에는 실행 에 필요한 모든 요소들이 들어 있다. [그림 1-13]은 hello.obj와 표준 C++ 라이브러리 로부터 cout 객체와 << 연산자 함수를 합쳐 hello.exe 파일로 링킹하는 과정을 보여 준다. 만일 링킹 과정 동안 목적 파일에서 참조하는 코드를 다른 목적 파일이나 C++ 표준 라이브러리 속에서 발견할 수 없다면 링크 오류가 발생한다.

01 CHAPTER C++ 시작 33 hello.obj 표준 C++ 라이브러리 hello.exe << << 링킹 cout cout [그림 1-13] 링킹은 목적 파일이 필요로 하는 함수나 객체를 다른 목적 파일이나 라이브러리로부터 찾고 결합하여 실행 파일을 만드는 과정 잠깐! 링킹과 DLL(Dynamic Linking Library) 일반적으로 개발자가 작성한 C++ 소스와 이 소스에서 필요한 모든 라이브러리는 링킹 단계에서 완전 히 결합되어 하나의 온전한 실행 파일이 만들어지며, 실행 시 이 실행 파일 외에 다른 코드는 필요 없 다. 하지만, 링킹 단계에서 결합하지 않고, 실행 중 필요한 순간에 결합하도록 만들어진 라이브러리가 있는데, 이것이 바로 DLL이다. DLL은 실행 파일의 크기를 줄이는 역할과 함께 여러 응용프로그램이 실행 중에 공유하는 특징이 있다. 프로그램 실행과 디버깅 디버깅 디버거 링킹의 과정에 의해 생성된 실행 파일(exe 파일)은 컴퓨터에서 바로 실행 가능하다. 만일 프로그램에 논리적 오류가 있다면, 실행 중 프로그램이 중단되거나 잘못된 결 과를 내게 된다. 이런 경우, 프로그램 내에 오류 위치를 발견하거나 문제의 원인을 찾아 수정하는 과정을 디버깅(debugging)이라고 부른다. 디버깅은 일반적으로 디 버거(debugger)라는 특별한 소프트웨어를 이용한다. 디버거는 C++ 프로그램을 라 인 단위로 실행시키면서 변수 값의 변화를 관찰하거나, 원하는 소스 라인에 정지점 (breakpoint)을 설정하여 프로그램이 정상적인 경로로 실행되는지 관찰하는 등 다양 한 오류 수정 방법을 제공한다. 디버거는 일반적으로 컴파일러를 공급하는 회사에서 함께 공급한다. 잠깐! C++ 프로그램의 확장자 ANSI C++ 표준에서 C++ 소스 프로그램의 확장자는.cpp이다. 컴파일러에 따라.cxx,.c++,.cc,.C,.CC 등 다양한 확장자를 사용하고 있으므로, 해당 컴파일러의 매뉴얼을 참조할 필요가 있다. 목적 파 일의 확장자 역시 운영체제에 따라 조금씩 다르다. 윈도우 운영체제에서는.obj이며 유닉스 운영체제 의 경우.o를 사용한다. 실행 파일의 경우, 윈도우 운영체제에서는.exe이며 유닉스에서는 정해진 확 장자가 없고 개발자가 마음대로 사용하면 된다.

34 명품 C++ 프로그래밍 CHECK TIME C++ 프로그램 개발에서 링킹이 필요한 이유가 아닌 것은? 1 C++ 코드의 디버깅을 효율적으로 하기 위해 2 C++ 프로그램에서 표준 C++ 라이브러리의 함수를 호출한 경우, 개발자가 작성한 코드와 표준 라 이브러리 코드를 합쳐 실행 파일을 만드는 과정이 필요하기 때문 3 C++ 프로그램을 여러 개의 C++ 소스 파일로 나누어 작성할 때, 한 소스 파일에서 다른 소스 파일 의 함수를 호출하면 두 프로그램을 합치는 과정이 필요하기 때문 4 C++ 언어로 작성된 목적 파일과 C 언어로 작성된 목적 파일을 합쳐 실행 파일을 만드는 과정이 필요하기 때문 main.cpp, f.cpp, g.cpp로 구성되는 C++ 프로그램 개발 과정에 대해 다음에 답하라. (1) main.cpp, f.cpp, g.cpp를 각각 컴파일하여 생성되는 목적 파일은 무엇인가? (2) 목적 파일들을 연결하여 하나의 실행 파일을 만드는 과정을 무엇이라고 하는가? 1.5 C++ 표준 라이브러리 C++ 표준 라이브러리 C 라이브러리 C++ 입출력 라이브러리 C++ STL 라이브러리 개발자들은 자신이 필요한 함수나 클래스를 스스로 작성하기도 하지만, 이미 만들어 진 함수나 클래스를 활용하여 프로그램 개발에 걸리는 시간을 단축하고 프로그램의 확 장성이나 정확성을 높인다. C++ 표준 라이브러리는 개발자들이 불러 쓸 수 있는 다양 한 종류의 함수와 클래스가 컴파일된 목적 파일(object file)들이다. 이들 함수나 클 래스 이름이 표준화되어 있기 때문에 C++ 표준 컴파일러 사이에 호환된다. C++ 표준 라이브러리는 컴파일된 목적 파일로만 제공되고 원시 소스 코드는 공개되지 않는다. C++ 표준 라이브러리에 포함된 함수와 클래스는 <표 1-1>과 같이 수십 개의 헤더 파 일에 분산되어 있으며 다음 3그룹과 기타 기능으로 나뉜다. C 라이브러리 기존 C 표준 라이브러리를 수용하여 C++에서 사용할 수 있게 한 함수들로서, <표 1-1>에 이름이 c로 시작하는 헤더 파일에 선언됨 C++ 입출력 라이브러리 콘솔 및 파일 입출력을 위한 함수와 클래스들로서, 제 네릭 프로그래밍을 지원하기 위해 템플릿으로 작성. <표 1-1>에서 초록색 글자로 표기된 것들 C++ STL 라이브러리 제네릭 프로그래밍을 지원하기 위해 템플릿으로 작성된 유 용한 함수와 클래스를 포함하는 라이브러리. <표 1-1>에서 검은색 글자로 표기된 것들 C++ 표준 라이브러리에 대한 구체적인 설명은 다음 사이트를 참고하기 바란다. http://www.cplusplus.com/reference/

01 CHAPTER C++ 시작 35 <표 1-1> C++ 표준 라이브러리를 구성하는 헤더 파일들 algorithm complex exception list stack bitset csetjmp fstream locale stdexcept cassert csignal functional map strstream cctype cstdarg iomanip memory streambuf cerrno cstddef ios new string cfloat cstdio iosfwd numeric typeinfo ciso646 cstdlib iostream ostream utility climits cstring istream queue valarray clocale ctime iterator set vector cmath deque limits sstream * <new> 헤더 파일은 STL에 포함되지 않는 기타 기능을 구현함 1.6 Visual C++를 이용한 C++ 프로그램 개발 Visual C++ 통합 개발 환경 Visual C++는 마이크로소프트의 Visual Studio 패키지에 포함된 C++ 통합 개발 환경 (IDE, Integrated Development Environment)으로서, C++ 소스 편집기, C++ 컴파일러 및 링커, 소스 레벨 디버거 등을 모두 갖추고 있으므로, Visual C++만 있으면 C++ 프로 그램을 개발하는데 다른 도구가 필요 없다. 이 책에서는 누구나 무료로 다운받아 사용할 수 있는 Visual C++ 2010 Express 판 을 사용한다. 다음 사이트는 Visual C++ 등 Visual Studio의 각종 Express 판(평가판) 을 무료로 다운받을 수 있는 사이트이다. http://www.microsoft.com/visualstudio/kor/products/visual-studio-express-products Visual C++ 2010 Express는 이 사이트에서 제품 메뉴를 선택하면 다운받을 수 있 다. 현재 Visual C++ 2012 판이 출시되어 있지만, 많이 배포되어 있지 않기 때문에 이 책에서는 2010 Express 판으로 선택하였다. 원하는 독자는 2012 Express 판을 다운받 고 제품 등록하여 키를 입력하면 영구적으로 사용할 수 있다.

36 명품 C++ 프로그래밍 Visual C++ 시작 Visual C++ 2010 Express를 설치하였으면 윈도우의 왼쪽 하단에 시작 버튼을 클릭하 고 모든 프로그램 을 선택한다. 여기서 다시 Microsoft Visual C++ 2010 Express 를 선택하면 3가지 메뉴가 보이고 이 중 첫 번째 메뉴로 보이는 Microsoft Visual C++ 2010 Express 를 선택하면 Visual C++가 실행되어 [그림 1-14]와 같은 창이 출력된다. [그림 1-14] Visual C++ 2010 Express를 처음 실행한 화면 프로젝트 만들기 프로젝트 솔루션 C++ 프로그램을 작성하기 위해서는 프로젝트(project)를 생성하는 작업부터 시작해 야 한다. 하나의 프로젝트는 하나의 C++ 프로그램을 작성하기 위해 필요한 소스 파일, 헤더 파일, 리소스 파일, 그리고 컴파일된 목적 파일과 실행 파일, 마지막으로 이들을 관리하기 위한 메타 파일 등을 포함하는 폴더의 개념이다. Visual C++에는 프로젝트보다 큰 개념으로 솔루션(solution)이 있다. 솔루션이란 개발자가 작성하고자 하는 소프트웨어를 구성하는 모든 프로젝트를 담는 컨테이너이 다. 솔루션은 하나의 프로젝트로만으로 이루어질 수도 있고, 여러 개의 프로젝트로 이 루어질 수도 있다. [그림 1-14]의 왼쪽에 보이는 솔루션 탐색기 창은 솔루션에 포함된 여러 프로젝트와 각 프로젝트에 포함된 파일들을 보여 주는 탐색기 창이다.

01 CHAPTER C++ 시작 37 이제, 다음과 같은 솔루션과 프로젝트를 만들어보자. 솔루션명 : chap1 프로젝트명 : Hello C++ 소스 파일명 : hello.cpp 프로그램 내용 : 화면에 "Hello" 문자열 출력 우선 솔루션과 프로젝트를 생성하기 위해 파일/새로 만들기/프로젝트 메뉴를 차례 로 선택하면 [그림 1-15]와 같은 창이 출력된다. 왼쪽의 템플릿 창에서 Win32 를 선택하 면 오른쪽 창에 2가지 종류의 프로젝트가 보인다. 여기서 Win32 콘솔 응용 프로그램 을 선택한다. 그리고 아래에 있는 이름 칸에 프로젝트 이름 Hello를, 위치 칸에 솔루 션을 담을 폴더를, 솔루션 이름 칸에 chap1을 입력한 후, 확인 버튼을 누른다. 프로젝트 이름 C:\C++\chap1\Hello 폴더가 생 다. 솔루션 위 C:\C++\chap1 폴더를 생성한다. [그림 1-15] 프로젝트 메뉴에서 프로젝트 이름, 솔루션 이름 등을 입력하는 창 프로젝트 생성 그러면 생성된 프로젝트에 대한 간략한 설명과 함께 마법사의 실행을 알리는 창이 [그림 1-16]과 같이 출력된다. 여기서 다음> 버튼을 누르면, 마법사는 다시 [그림 1-17]과 같은 창을 보여주며, 독자들은 추가 옵션 란에 빈 프로젝트 를 체크하고 마침 버튼을 누르면 된다. 이제 프로젝트 생성이 완료되었다.

38 명품 C++ 프로그래밍 [그림 1-16] 생성된 프로젝트에 대한 확인 창 체크해 함 [그림 1-17] Win32 응용 프로그램 마법사에서 빈 프로젝트 선택 C++ 소스 프로그램 편집 프로젝트가 생성되면 [그림 1-18]의 Visual C++ 인터페이스를 가진 창이 보인다. 왼쪽 의 솔루션 탐색기 창에 솔루션 chap1 과 프로젝트 Hello 가 보이고, 프로젝트에 포함 된 4개의 요소(리소스 파일, 소스 파일, 외부 종속성, 헤더 파일)가 보인다.

01 CHAPTER C++ 시작 39 [그림 1-18] Hello 프로젝트 생성 후 이제, C++ 소스 프로그램을 작성할 차례이다. [그림 1-19]와 같이 솔루션 탐색기 창에 서 소스 파일 위에 마우스 오른쪽 버튼을 누르면 콘텍스트 메뉴가 보이며 여기서 추 가/새 항목 메뉴를 선택한다. 그러면 [그림 1-20]의 새 항목 추가를 위한 창이 출력되며, 왼쪽 창에서 코드 를 선택 하고 오른쪽 창에서 C++ 파일(.cpp) 를 선택한다. 그리고 마지막으로 [그림 1-20] 아래 부분의 이름 란에 hello.cpp 를 입력하고 추가 버튼을 누른다. 이제, [그림 1-21] 창이 보이고 빈 hello.cpp 파일이 생성되었다. [그림 1-19] 소스 파일 에 마우스 오른쪽 버튼을 눌러 새 항목을 만드는 메뉴 선택

40 명품 C++ 프로그래밍 코드 선택 C++ 소스 파일 이름 입력 hello.cpp가 생기는 폴더 [그림 1-20] hello.cpp 소스 파일 생성 빈 hello.cpp 파일 생성 [그림 1-21] hello.cpp가 생성된 초기 모습 비야네 스트롭스트룹(덴마크어 : Bjarne Stroustrup 비아르네 스트 로우스트루프, 1950. 6. 11. ~ )은 C++ 프로그래밍 언어를 개발한 것으 로 유명한 덴마크의 컴퓨터 과학자이며, 2004년 현재 텍사스 A&M 대학 의 컴퓨터과 학과장으로 재직 중이다. 그는 1975년 덴마크의 Aarhus 대학에서 수학과 컴퓨터 과학 석사를 받았고, 1979년 영국 케임브리 지 대학교에서 컴퓨터 과학 분야의 박사학위를 받았다. 2002년까지는 (사진 출처 : 위키백과)

01 CHAPTER C++ 시작 41 독자들은 [그림 1-22]와 같이 소스 프로그램을 입력하라. hello.cpp는 화면에 "Hello"를 출력하고 종료하는 간단한 프로그램이다. 프로그램 작성 [그림 1-22] hello.cpp를 작성한 모습 컴파일과 빌드 컴파일 빌드 hello.cpp 파일의 작성이 끝났으면 컴파일을 해보자. [그림 1-23]과 같이 솔루션 탐색 기 창에서 hello.cpp 위에 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴를 출력하고 컴파 일 메뉴를 선택한다. 혹은 Ctrl+F7 키를 입력한다. 그 결과, hello.cpp만 컴파일하여 hello.obj가 만들어진다. 컴파일과 링킹을 모두 시행하여 실행 파일 Hello.exe를 만 들려고 하면 빌드(build) 명령을 시행하여야 한다. 빌드는 [그림 1-24]와 같이 프로젝 트명 Hello 위에 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴를 출력하고 빌드 메뉴를 선택하면 된다. 빌드 명령 실행 결과 컴파일과 링킹을 거쳐 Hello.exe가 만들어진다. AT&T 벨연구소에서 대형 프로그래밍 연구부(Large-scale Programming Research Department)를 이끌었었다. 그리고 지금까지 20여 년 동안 ISO에서 활동하면서, C++ 언어를 소프트웨어 개발을 위한 안 전성과 최신 기반을 제공하는 언어로 만들기 위해 애쓰고 있다.

42 명품 C++ 프로그래밍 hello.cpp 컴파일, 컴파일만 수행 [그림 1-23] 솔루션 탐색기에서 hello.cpp에 마우스 오른쪽 버튼을 누를 때 컴파일 메뉴 빌드 메뉴를 선택하면, 컴파일과 링크 후 Hello.exe 생성 [그림 1-24] Hello 프로젝트의 빌드로 Hello.exe 생성 프로그램 실행 컴파일 된 프로그램을 실행시키기 위해서는 메인 메뉴에서 디버거/디버깅하지 않고

01 CHAPTER C++ 시작 43 Ctrl+F5 시작 메뉴를 선택하든지 Ctrl+F5 키를 선택하면 된다. 그 결과 [그림 1-25]와 같이 빌드 할 것인지를 묻는 창이 출력된다. 여기서 예 를 선택하면 빌드가 이루어지고 프로그램 이 실행된다. 그 결과 [그림 1-26]과 같은 DOS 윈도우가 나타나며 프로그램의 실행 결과 가 출력된다. 컴파일과 빌드의 과정을 한 번에 하려면 앞의 [그림 1-23]의 컴파일 과정을 생략하고 바로 Ctrl+F5 키를 치면 된다. F5 키만 입력하면 디버거 모드에서 실행되어 실행 결과 를 보여주고 바로 DOS 윈도우를 닫아버리므로 사용자는 출력 결과를 볼 수 없음에 주 의하기 바란다. [그림 1-25] Ctrl+F5(디버깅하지 않고 실행하기 메뉴) 키로 실행하였을 때 빌드를 묻는 창 Hello 프로젝트 빌드 성. Hello.exe 생성 [그림 1-26] Hello 프로젝트가 실행되는 화면

44 명품 C++ 프로그래밍 요약 SUMMARY 컴퓨터와 프로그래밍 전문가들은 소프트웨어가 주목받는 세상이 왔고, 이 시대의 IT 세계를 지배할 것으로 예측한다. 소프트웨어는 컴퓨터의 중앙처리장치(CPU)가 이해할 수 있는 일련의 명령들과 데이터로 구성되며, CPU는 이 명령들을 실행함으로써 요구된 기능을 수행한다. 프로그래밍 언어는 0과 1의 이진수로 구성되는 기계어(machine language), 기계어의 각 명령어를 ADD, SUB, MOVE 등과 같은 상징적 니모닉 기호로 일대일 대응시킨 어셈블리어(assembly language), 사람의 언어에 보다 가까운 C, C++, Java 등의 고급 언어로 진화하였다. 고급 언어는 컴파일러에 의해 기계어로 변환되고, 어셈블리어 프로그램은 어셈블러라는 시스템 프로 그램에 의해 기계어로 변환된다. 대부분의 경우 컴파일러는 기계어로 변환할 때 어셈블러를 이용한다. C++ 언어의 역사 C++는 1967년 BCPL 언어에서 태동하여, 1970년 B, 1972년 C 언어로 진화하고, 1983년 Bjarne Stroustrup에 의해 만들어졌다. 표준 C++ 규칙에 맞게 작성된 C++ 프로그램은 하드웨어, 운영체제 플랫폼에 상관없이 표준 C++ 컴파 일러에 의해 컴파일되고 동일한 실행 결과가 보장된다. C++ 언어의 특징 C++ 언어의 주요한 설계 목표는 C 언어와의 호환성, 객체 지향 개념 도입, 엄격한 타입 체크, 실행 시 간의 효율성 저하 최소화 등이다. C++ 언어에서 C 언어에 추가적으로 도입한 기능은, 인라인 함수, 함수 중복, 디폴트 매개 변수, 참조와 참조 변수, 참조에 의한 호출, new와 delete 연산자, 연산자 재정의, 제네릭 함수와 제네릭 클래스 등 이다. C++의 객체 지향 특성으로는 캡슐화, 상속, 다형성 등이며, C++에서 객체 지향 특성을 도입한 목적은 소프트웨어의 생산성을 향상하고, 실세계 문제를 쉽게 모델링하기 위한 것이다. 실행하고자 하는 절차대로 명령어를 나열하여 프로그램을 작성하는 방법을 절차 지향 프로그래밍 (procedural programming)이라고 부른다. 실제 세상과 가깝게 모델링하기 위해, 응용에 필요한 물체(객체)를 모델링하고, 이들 간의 관계, 상호 작용을 표현하는 프로그래밍 기법이 객체 지향 프로그래밍(object oriented programming)이다. 제네릭 프로그래밍은 동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있도록 클래스와 함 수를 일반화시킨 제네릭 함수와 제네릭 클래스를 활용하는 기법이다. C++ 언어는 C 언어와의 호환성으로 인해 클래스 바깥에 변수를 선언할 수 있도록 허용함에 따라 캡슐 화의 원칙이 무너졌다. C++ 프로그램의 개발 과정 C++ 프로그램은 C++ 소스 프로그램의 편집, 컴파일, 링킹 과정으로 세분화된다. 그리고 실행 오류를 수정하는 작업을 디버깅이라고 부른다. C++ 소스 프로그램은 표준 확장자가.cpp인 텍스트 파일로서 아무 텍스트 편집기로 작성 가능하다. C++ 컴파일러로 생성된 목적 코드는 바로 실행할 수 없고, 링킹 과정을 거쳐야 한다. Visual C++와 같이 C++ 프로그램 작성, 컴파일, 링킹, 실행, 디버깅 등 C++ 프로그램 개발에 필요한 모든 도구를 지원하는 C++ 통합 개발 환경을 사용하는 것이 좋다. C++ 표준 라이브러리 C++ 표준 라이브러리는 C 라이브러리, C++ 입출력 라이브러리, STL 라이브러리의 3그룹과 기타로 구 분되며, C 라이브러리를 제외한 두 그룹은 템플릿(제네릭)으로 작성되어 있다.

01 CHAPTER C++ 시작 45 Open Challenge 기본 C++ 프로그램 작성 목 적 Visual C++로 솔루션과 프로 젝트 만들기, 기본 C++ 프로 그램 작성 Visual Studio를 활용하여 다음에 지시한 대로 C++ 프로그램을 작성하고 실행하라. 난이도 3 솔루션명 : OpenChallenge 프로젝트명 : chap1 소스 파일명 : add.cpp add.cpp 코드와 실행 결과는 아래와 같다. 30계속하려면 아무 키나 누르십시오...

46 명품 C++ 프로그래밍 연습문제 EXERCISE 이론 문제 홀수 문제는 정답이 공개됩니다. 1. 전문가들은 IT 분야에서 어떤 종류의 기업이 미래를 지배할 것이라고 예측하는가? 1 가전 기업 2 소프트웨어 기업 3 증권사 4 석유회사 2. 다음 설명 중에서 틀린 것은? 1 사람과 가장 친밀한 프로그래밍 언어가 고급 언어이다. 2 CPU는 기계어만 이해하고 처리할 수 있다. 3 고수준 언어를 저수준 언어로 번역할 컴파일러가 필요하다. 4 기계어를 익혀서 프로그램을 작성하는 것이 좋은 개발자가 되는 지름길이다. 3. 다음 언어 중에서 계보가 다른 것은? 1 Java 2 C 3 C++ 4 Fortran 4. 다음 중 객체 지향 언어가 아닌 것은? 1 Java 2 C 3 C++ 4 C# 5. 객체 지향 언어가 태동하게 된 원인이 아닌 것은? 1 소프트웨어의 크기가 점점 커지게 되어 관리의 어려움을 극복하기 위해 2 소프트웨어의 생명 주기가 짧아지게 됨에 따라 빠른 소프트웨어 작성이 요구되어 3 운영체제 독립적인 프로그램 작성이 필요해서 4 실세계의 문제를 모델링하는데 객체의 개념이 적합해서 6. 다음 중 객체 지향 개념에 포함되지 않는 것은? 1 상속 2 흐름도 3 캡슐화 4 다형성 7. C++ 언어가 C 언어의 문법적 체계를 계승받음으로써 좋은 점은? 1 C 언어로 작성된 프로그램과 호환성을 가질 수 있다. 2 C 언어처럼 빠르게 실행될 수 있다. 3 C 언어처럼 절차 지향 프로그래밍도 할 수 있다. 4 전역 변수를 만들어서 여러 함수에서 공유할 수 있다.

01 CHAPTER C++ 시작 47 8. C++ 언어가 C 언어의 문법적 체계를 계승받음으로써 나타난 문제점은? 1 개발 과정이 복잡해졌다. 2 프로그램 관리가 어려워졌다. 3 C 라이브러리를 사용할 수 없게 되어 불편하다. 4 전역 변수가 존재하게 되어 캡슐화의 원칙이 무너졌다. 9. 다음 빈칸에 적절한 단어를 기입하라. C++는 언어와의 호환성을 목표로 하여 설계되었으며 객체 지향 개념을 추가하였다. 그러 나 클래스 바깥에 전역 변수나 함수들을 선언하게 됨으로써 객체 지향의 핵심 개념인 의 원칙이 무너지게 되었다. 10. ANSI C++ 표준으로 C++ 프로그램을 작성할 때의 장점은? 1 확장성 2 호환성 3 실행 성능 4 개발 용이성 11. C++의 객체 지향 특징이 아닌 것은? 1 상속 3 인라인 함수 2 함수 중복 4 클래스 12. C++ 언어가 가지고 있는 3가지 객체 지향 특성을, 주어진 예를 이용하여 설명하라. (1) 캡슐화 : TV 객체로 캡슐화를 설명하라. (2) 다형성 : > 연산자로 다형성을 설명하라. (3) 상속성 : 메뚜기는 생물이다 라는 문구로 상속성을 설명하라. 13. C++에서는 C 언어와 달리 다음 3개의 함수를 함께 작성하고 구분하여 호출할 수 있다. 어떤 객체 지향 특성을 말하는가? int big(int a, int b); int big(int a[], int size); int big(int a, int b, int c); 14. C++ 언어가 C 언어에 추가한 내용이 아닌 것은? 1 인라인 함수 2 함수 중복 3 참조에 의한 호출 4 타입 변환

48 명품 C++ 프로그래밍 15. C와 C++ 언어에 대해 말한 것 중 틀린 것은? 1 C++ 코드는 객체 지향 개념의 도입에 따라 C 코드에 비해 실행 속도가 떨어질 우려 가 있다. 2 C++ 표준에 따라 소스 프로그램을 작성하면 높은 호환성으로 인해 거의 모든 종류 의 C++ 컴파일러에 의해 컴파일 가능하다. 3 C++ 프로그램은 C 소스 프로그램을 수용하여 사용할 수 있지만, 이미 컴파일된 C 언어의 목적 파일은 링크시켜 사용할 수 없다. 4 C 소스 파일의 표준 확장자는.c이고 C++ 소스 파일의 표준 확장자는.cpp이다. 16. C++ 프로그램에 대해 다음 중 틀린 것은? 1 C++ 소스 파일은 텍스트 파일이 아니라 바이너리 파일이다. 2 C++ 소스 파일의 표준 확장자는.cpp이지만 컴파일러에 따라.cc,.CC,.c++ 등의 확장자를 갖기도 한다. 3 C++ 소스 파일을 컴파일한 목적 파일의 확장자는.obj 혹은.o와 같이 운영체제에 따라 다를 수 있다. 4 C++ 프로그램의 디버깅이란 실행 파일(exe 파일)을 실행할 때 나타나는 오류를 발 견하고 수정하는 과정이다. 17. 링킹에 대한 설명 중 바른 것은? 1 C++ 소스 파일을 컴파일하여 생긴 목적 파일(obj 파일)은 기계어로 이루어져 있기 때문에 바로 실행 가능하다. 2 링킹 후 생성되는 실행 파일(exe 파일)을 컴퓨터에서 실행시키기 위해서는 목적 파일(obj 파일)도 함께 필요하다. 3 링킹은 C++ 프로그램 개발 과정에서 실행 파일을 만들기 위해 반드시 필요하다. 4 링킹을 통해 실행 파일(exe 파일)과 다른 실행 파일을 합쳐서 하나의 실행 파일 (exe 파일)을 만들 수 있다. 18. 다음 그림에서 링킹의 의미를 구체적으로 설명하라. hello.obj 표준 C++ 라이브러리 hello.exe << << 링킹 cout cout

01 CHAPTER C++ 시작 49 19. C++ 프로그램의 확장자에 대한 설명 중 틀린 것은? 1 C++ 소스 파일의 확장자는.cpp,.cxx,.c++ 등 운영체제에 따라 다양하다. 2 비주얼 C++에서.c 확장자를 가진 파일은 C 컴파일러가,.cpp 확장자를 가진 파일 은 C++ 컴파일러가 자동으로 컴파일한다. 3 목적 파일의 확장자는.obj나.o 등 운영체제에 따라 다르다. 4 실행 파일의 확장자는 운영체제에 관계없이.exe로 표준화되어 있다. 20. C++ 표준 라이브러리에 포함되지 않는 것은? 1 C++ 통신 라이브러리 2 C++ 입출력 라이브러리 3 STL 라이브러리 4 C 라이브러리 21. 다음 빈칸에 적절한 단어를 기입하라. 최근에 동일한 프로그램 코드에 구체적인 타입을 적용할 수 있도록 함수나 클래스를 일반화시 킨 함수와 클래스를 이용하여 프로그램을 작성하는 새로운 프로그래밍 패러다임인 이 활발히 사용되고 있다. 이것은 흐름도를 중심으로 작업의 실행 순 서에 따라 프로그램을 작성하는 프로그래밍 기법에서, 객체 사이의 상호 작용과 관계 를 중심으로 프로그램을 작성하는 프로그래밍 기법 이후에 도입된 것이다. 22. C++ 통합 개발 환경이란 무엇을 말하는가? 실습 문제 표시가 있는 문제는 정답이 공개됩니다. 1. Visual C++를 활용하여 다음에 지시한 대로 C++ 프로그램을 작성하고 실행하라. 솔루션명 : prac1 프로젝트명 : 1-1 소스 파일명 : name.cpp 난이도 3 #include <iostream> int main() { std::cout << "My name is Mike.\n"; return 0; } My name is Mike. 계속하려면 아무 키나 누르십시오...

50 명품 C++ 프로그래밍 2. 다음 지시대로 자신의 학과, 나이, 희망 직업을 화면에 출력하는 C++ 프로그램을 Visual C++로 작성하라. 난이도 3 솔루션명 : prac1 프로젝트명 : 1-2 소스 파일명 : me.cpp 컴퓨터공학과 21세 대통령 계속하려면 아무 키나 누르십시오... 3. 1에서 10까지 더하여 결과를 화면에 출력하는 C++ 프로그램을 Visual C++로 작성하 라. 난이도 3 1에서 10까지 더한 결과는 55입니다 계속하려면 아무 키나 누르십시오... std::cout을 이용하여 숫자, 문자, 문자열 등을 출력할 수 있다. std::cout << "결과는 " << 55 << "입니다"; 4. 다음과 같이 출력하는 C++ 프로그램을 Visual C++로 작성하라. 난이도 3 * ** *** **** 계속하려면 아무 키나 누르십시오...

저 자 약 력 황기태 현 한성대학교 컴퓨터공학과 교수 서울대학교 컴퓨터공학과 박사 서울대학교 컴퓨터공학과 석사 서울대학교 컴퓨터공학과 학사 비트교육센터 센터장 IBM Watson Research Center 방문 연구원 University of California, Irvine 방문 교수 University of Florida 방문 교수 저자와의 협의에 의해 인지를 생략합니다. 명품 C++ Programming 황기태 지음 초 판 인 쇄 : 2013. 7. 19 초 판 발 행 : 2013. 7. 26 발 행 인 : 김 승 기 발 행 처 : 생능출판사 신 고 번 호 : 제406-2005-000002호 신 고 일 자 : 2005. 1. 21 - 경기도 파주시 문발동 507-12 파주출판도시 대표전화 : (031)955-0761, FAX : (031)955-0768 홈페이지 : http://www.booksr.co.kr I S B N : 978-89-7050-783-5(93000) * 파본 및 잘못된 책은 바꾸어 드립니다. 정가 29,000원

부록-심화학습

머 리 말 한 권의 책에 C++에 관한 이론과 연습을 담는 것은 거의 불가능합니다. 명품 C++ 프로그래밍 책은 C 언어를 아는 독자들이 15주 한 학기에 C++를 학습할 수 있도록 구성하였으며, 책에서 다루지 못한 심화 내용과 실전에서 필요한 지식은 부록에 보 충하였습니다. 부록에 담은 내용을 간략히 요약하면 다음과 같습니다. 부록 A. C와 C++ 비교 C++를 처음 공부하는 사람들은 공통적으로 C++와 C의 다른 부분에 대해 궁금해 합니다. 부록 A는 큰 관점에서 이들을 간략히 비교합니다. 부록 B. namespace 2003년 C++의 새로운 표준에서 namespace의 개념이 수용됩니다. 부록 B는 이름 공간과 namespace에 대한 개념, 자신만의 이름 공간을 만드는 방법 등에 초점을 맞 추어 설명합니다. 부록 C. 키 입력 시 흔히 발생하는 문제 키 입력을 받는 프로그램을 작성할 때 개발자들이 당면하는 두 가지 문제와 해결 방법을 설명합니다. cin >>로 정수를 입력받고자 하는데, 사용자가 문자를 입력해 서 프로그램이 무한 루프를 돌거나 실행이 종료되는 상황을 경험하였을 것입니다. 또 cin >>와 get(), getline() 등을 섞어서 키 입력을 받으면, <Enter> 키 때문에 오류가 발생하기도 합니다. 부록 C는 이 두 가지 문제에 대한 해결 방안을 설명합 니다. 부록 D. private이나 protected 생성자 : singleton 사례 생성자를 private이나 protected로 작성하는 경우가 있을까요? 있습니다. 부록 D는 이런 경우에 대해 설명하고, 대표적인 사례로 singleton 프로그래밍 기법을 설명합니다. P R E F A C E 3

부록 E. 한글 문자열과 한글 입출력 한글 입출력은 과거부터 지금까지 여전히 다루기 힘든 부분입니다. char 타입의 변수에 한글 한 글자를 저장할 수 없고, cin으로 한글 문자열을 입력받을 수는 있 지만, 한글 문자를 입력받을 수는 없습니다. 또한 cin으로 한글과 영어가 섞인 문 자열을 입력받았다 할지라도 글자 단위로 떼어서 사용하려고 할 때 문제가 생깁니 다. 부록 E는 한글 문자와 입출력에 관해 자세히 설명합니다. P R E F A C E 부록 F. 연산자 중복 추가 설명 책의 본문에서 다루지 못했던 [], new, delete, (), = 연산자를 작성하는 방법에 대해 사례와 함께 설명합니다. 부록 G. STL 고급 활용 STL을 잘 알면 프로그래밍이 쉬워집니다. 책의 본문에서는 초보자의 수준에 맞 추어 STL의 기초 개념과 vector 클래스의 기초적인 사용법에 관해서만 소개하였습 니다. 부록 G에서는 STL에 관한 고급 활용에 대해 설명합니다. 실전에서는 객체를 vector의 원소로 주로 사용하기 때문에, vector에 객체나 객체 포인터를 삽입 삭 제하는 응용 사례를 소개하고, vector에 삽입된 객체들에 알고리즘 함수 sort()를 적용하는 방법과 함수 객체(predicate)를 이용하여 소팅하는 방법을 설명합니다. 또한 연관 컨테이너 클래스인 map 컨테이너로 객체를 관리하는 방법을 자세히 소 개합니다. 부록 H. RTTI 실행 중에 포인터로 실제 타입 알아내기 실행 중에 포인터가 가리키는 객체와 관련된 정보를 알아낼 필요가 있습니다. 부록 H는 이를 위해, typeid 연산자, type_info 클래스, dynamic_cast 연산자에 대해 소개합니다. 부록 I. 파일 입출력 팁과 응용 사례 파일 입출력과 관련된 몇 가지 이슈를 설명하고, 점수 관리 응용프로그래밍 사 례를 통해 파일 입출력 코드 작성에 대해 설명합니다. 부록 J. ASCII 코드 책의 본문에서 필요한 ASCII 코드표를 첨부합니다. 4

차 례 부록 A. C와 C++ 비교 6 부록 B. namespace 10 부록 C. 키 입력 시 흔히 발생하는 문제 18 부록 D. private이나 protected 생성자 : singleton 사례 23 부록 E. 한글 문자열과 한글 입출력 25 부록 F. 연산자 중복 추가 설명 38 부록 G. STL 고급 활용 50 부록 H. RTTI-실행 중에 포인터로 실제 타입 알아내기 74 부록 I. 파일 입출력 팁과 응용 사례 79 부록 J. ASCII 코드 88 C O N T E N T S 5

APPENDIX A C와 C++ 비교 1. 기초 문법 비교 C++ 언어는 C 언어의 키워드와 문법 구조를 그대로 계승한다. 지금부터 C 언어를 기준 으로 C++ 언어가 C 언어에 추가한 내용을 간단히 요약해보자. bool true false 데이터 타입과 변수 선언 C++는 C 언어의 데이터 타입과 리터럴을 그대로 계승하며, bool 타입과 bool 타입의 리터럴인 true와 false를 추가하였다. 3, -1, 3.3, 0x1a, 'a', "hello", true, false // 리터럴 bool isvisible = true; // bool 타입의 사례 객체 배열 배열 C 언어의 배열 선언과 사용은 C++에서 모두 동일하다. 다만 C++에서는 객체 배열을 선 언할 수 있다. 참조 개념 도입 포인터와 참조 C++는 C 언어의 포인터 개념을 그대로 계승하였으며, C 언어에는 없는 참조(reference) 개념을 새로 도입하였다. 참조는 기존 변수에 대한 별명으로서 변수 공간을 따로 만들 지 않고 기존 변수 공간을 공유한다. 다음은 참조 변수 country를 선언하고 사용하는 사례이다. int nation; int & country = nation; // country는 nation과 동일한 공간을 공유. 참조 변수 country = 1; // nation과 country 모두 값 1을 가짐

APPENDIX 부록 A. C와 C++ 비교 7 주석 // C 언어에서 주석을 다는 방법은 /* */뿐이지만 C++에서는 /* */ 외에 //를 추가하였 다. //부터 시작하여 라인의 끝까지 주석으로 처리한다. /* 이 프로그램은 정수 배열을 정렬하여 출력합니다. 작성자 : 황기태 작성일 : 2013년 9월 */ int main() { // C++ 프로그램은 main()에서 실행을 시작한다. return 0; } 문장과 식, 연산자 C++는 C 언어와 동일하게 문장 끝에 세미콜론(;)을 붙인다. 그리고 C++ 연산자는 C 언 어의 연산자를 그대로 계승하고, dynamic_cast, static_cast, reinterpret_cast, const_cast, typeid, new, delete 연산자를 새로 추가하였다. 조건문 C++는 C 언어의 조건문을 그대로 계승하며 추가된 것은 없다. if, else, else if, switch, break, continue, goto 반복문 C++는 C 언어의 3개의 반복문을 그대로 계승하며 추가된 것은 없다. for, while, do-while 동적 메모리 할당 new delete C 언어에서 힙으로부터 동적으로 메모리를 할당받아 사용하기 위해 malloc()과 calloc()을, 반환하기 위해서는 free() 함수를 이용한다. 그러나 C++에서는 힙으로부터 메모리를 할당받는 특별한 라이브러리 함수가 필요 없도록, new와 delete 연산자를 도입 하였다. 그러므로 C++에서는 언어 차원에서 메모리 할당 해제를 지원하고 있다.

8 명품 C++ 프로그래밍 함수 원형 선언 C++ 함수를 작성하는 방법은 C 언어의 함수 작성 방법을 그대로 계승한다. 그러나 함 수의 원형을 선언하는 방식은 다르다. C 언어에서는 함수의 매개 변수가 있든 없든 함 수 이름만으로 선언한다. 예를 들면 다음과 같다. int add(); // C 언어 함수 원형 선언. 본래는 int add(int x, int y)이지만 매개 변수 선언이 필요 없음 매개 변수의 타입을 반드시 기입 그러나 C++에서는 함수의 원형을 선언할 때 매개 변수의 타입을 반드시 기입하여야 한다. int add(int x); // C++에서 함수 원형 선언 int add(int x, int y); // C++에서 함수 원형 선언 return 문 main() 함수만 return 문을 생략 또한 C 언어에서는 int를 리턴하는 함수의 경우 return 문이 없어도 되지만, C++에 서 리턴 타입에 적합한 return 문이 반드시 있어야 한다. 예외적으로 main() 함수만 return 문을 생략할 수 있으며 이때 return 0;로 처리된다. 함수의 인자 전달 참조에 의한 호출 매개 변수가 참조 타입 C 언어에서 함수의 인자 전달 방식은 '값에 의한 호출', '주소에 의한 호출'의 2 가지 방식만 있지만, C++에서 '참조에 의한 호출'을 새로 도입하였다. '참조에 의한 호출' 은 매개 변수가 참조 타입으로 선언된 경우이다. 인라인 함수 inline 인라인 함수 실행 속도 향상 C++에서 인라인 함수를 새로 도입하였다. 함수 앞에 inline으로 선언하여 인라인 함수 를 만든다. 컴파일러는 인라인 함수를 호출하는 위치에 인라인 함수의 코드를 확장하 는 방식으로 컴파일하여 함수 호출 과정이 없게 한다. 이로 인해 프로그램의 실행 속 도가 향상된다. 헤더 파일의 확장자 헤더 파일은 확장자가 없다 C 언어에서 헤더 파일의 확장자는.h이다. 구버전 C++에서도.h의 확장자를 사용하였 지만, 2003년 이후 새 버전의 C++ 표준에서 헤더 파일은 확장자가 없다. 입출력 방법 C++와 C 언어의 입출력 혹은 파일 입출력 라이브러리는 확연히 다르다. C++ 프로그램

APPENDIX 부록 A. C와 C++ 비교 9 istream ostream iostream ifstream ofstream fstream 개발자는 C 언어의 입출력 방식을 완전히 잊고 C++ 입출력 라이브러리를 사용하는 것 이 좋다. C 언어에서는 <stdio.h> 헤더 파일에 선언된 scanf(), printf(), getchar(), putchar() 등의 함수를 사용하지만, C++에서는 이들 기능을 모두 캡슐화한 istream, ostream, iostream 클래스를 이용한다. 파일 입출력 또한 C 언어에서는 fopen(), fread(), fwrite(), fseek() 등의 함수를 이용하지만 C++에서는 이들 기능을 캡슐화 한 ifstream, ofstream, fstream 클래스를 사용한다. 2. 객체 지향 특성 함수 중복 C++에서는 같은 이름의 함수를 매개 변수 타입이나 개수만 다르면 얼마든지 중복하여 작성할 수 있다. 연산자 중복 C++에서는 피연산자가 다른 경우 기존의 연산자에 새로운 연산을 실행하는 연산자 중 복을 허용한다. 'cout <<'이나 'cin >>'에서 << 와 >> 연산자는 입출력 라이브러리에 새로 중복된 연산자이다. 클래스와 상속 C++에서는 객체를 캡슐화하는 클래스를 선언하고, 클래스 사이에 상속을 선언할 수 있다. 템플릿과 제네릭 프로그래밍 template 키워드 C++에서는 template 키워드를 이용하여 함수나 클래스를 데이터 타입에 의존하지 않 고 일반화시킨 템플릿 함수나 템플릿 클래스를 작성할 수 있다. 템플릿에서 구체적인 타입을 대입하여 구체적인 타입만 처리할 수 있는 구체화된 버전의 함수나 클래스를 이용하여 프로그램을 작성하는 제네릭 프로그래밍을 지원한다. namespace namespace C++에서 namespace는 이름 공간을 만드는 키워드로서 개발자가 작성하는 프로그램에 이름 공간을 선언할 수 있게 하여, 동일한 이름의 변수나 함수, 클래스가 이름 공간이 다르면 서로 다르게 인식되어 이름 충돌을 막는다.

저 자 약 력 황기태 현 한성대학교 컴퓨터공학과 교수 서울대학교 컴퓨터공학과 박사 서울대학교 컴퓨터공학과 석사 서울대학교 컴퓨터공학과 학사 비트교육센터 센터장 IBM Watson Research Center 방문 연구원 University of California, Irvine 방문 교수 University of Florida 방문 교수 저자와의 협의에 의해 인지를 생략합니다. 명품 C++ Programming 부록-심화학습 황기태 지음 - 경기도 파주시 문발동 507-12 파주출판도시 대표전화 : (031)955-0761, FAX : (031)955-0768 홈페이지 : http://www.booksr.co.kr * 파본 및 잘못된 책은 바꾸어 드립니다. 초 판 인 쇄 : 2013. 7. 19 초 판 발 행 : 2013. 7. 26 발 행 인 : 김 승 기 발 행 처 : 생능출판사 신 고 번 호 : 제406-2005-000002호 신 고 일 자 : 2005. 1. 21