9
02 C++ 프로그래밍의 기본 CHAPTER 2.1 C++ 프로그램의 기본 요소와 화면 출력 예제 소스 C++ 프로그래밍의 기초를 설명하기 위해, 가장 기본적인 코드로 구성된 C++ 소스를 예 2-1에 준비하였다. 주석문 주석문(comment)은 프로그램의 실행에 영향을 미치지 않으며 개발자가 프로그램에 대 한 설명이나 자유롭게 붙인 특이 사항의 메모이다. C++에는 주석문을 만드는 2가지 방 예제 2-1 기본적인 C++ 프로그램 1 2 3 4 5 6 7 8 9 10 11 12 13 /* 소스: SimpleC++.cpp cout<< 연산자를 이용하여 화면에 출력한다. */ #include <iostream> // cout<< 연산자 포함 // C++ 프로그램은 main() 함수에서부터 실행을 시작한다. int main() { std::cout << "Hello\n"; // 화면에 Hello를 출력하고 다음 줄로 넘어감 std::cout << "첫 번째 맛보기입니다."; return 0; // main() 함수가 종료하면 프로그램이 종료됨 } 실행 결과 Hello 첫 번째 맛보기입니다. 주석문

C++ 프로그래밍의 기본ª…품CPP... · 2017-07-05 · 02 c++ 프로그래밍의 기본 chapter 2.1 c++ 프로그램의 기본 요소와 화면 출력 예제 소스 c++ 프로그래밍의

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • 02 C++ 프로그래밍의 기본CHAP T E R

    2.1 C++ 프로그램의 기본 요소와 화면 출력

    예제 소스

    C++ 프로그래밍의 기초를 설명하기 위해, 가장 기본적인 코드로 구성된 C++ 소스를 예

    제 2-1에 준비하였다.

    주석문

    주석문(comment)은 프로그램의 실행에 영향을 미치지 않으며 개발자가 프로그램에 대

    한 설명이나 자유롭게 붙인 특이 사항의 메모이다. C++에는 주석문을 만드는 2가지 방

    예제 2-1 기본적인 C++ 프로그램

    12345678910111213

    /* 소스: SimpleC++.cpp cout과

  • 113클래스와 객체03 CHAPTER

    4567891011121314151617181920212223242526272829303132333435363738

    class Rectangle { public: int width, height; // 너비와 높이 Rectangle(); // 생성자 Rectangle(int w, int h); // 생성자 Rectangle(int length); // 생성자 bool isSquare();};

    Rectangle::Rectangle() { width = height = 1;}

    Rectangle::Rectangle(int w, int h) { width = w; height = h;}

    Rectangle::Rectangle(int length) { width = height = length;}

    bool Rectangle::isSquare() { // 정사각형이면 true를 리턴하는 멤버 함수 if(width == height) return true; else return false;}

    int main() { Rectangle rect1; Rectangle rect2(3, 5); Rectangle rect3(3);

    if(rect1.isSquare()) cout

  • 195객체 포인터와 객체 배열, 객체의 동적 생성04 CHAPTER

    예제 4-15 문자열 fi nd 및 replace

    & 키가 입력될 때까지 여러 줄의 영문 문자열을 입력 받고, 찾는 문자열과 대치할 문자열을 각각 입력 받아 문자열을 변경하라.

    1234567891011121314151617181920212223242526

    #include #include using namespace std;

    int main() { string s; cout

  • 240 명품 C++ 프로그래밍

    5.5 복사 생성자

    얕은 복사와 깊은 복사

    복사란 원본과 동일한 별개의 사본을 만드는 것으로, 만능 복사기가 있다면 [그림 5-12]

    와 같이 어떤 것도 복사할 수 있다.

    원본 공 복사본 공

    만능 복사기

    [그림 5-12] 만능 복사기로 원본 공과 동일한 사본 공 복사

    복사를 자세히 살펴보면 얕은 복사( shallow copy)와 깊은 복사( deep copy)로 구분

    할 수 있다. [그림 5-13]의 사례로 두 유형의 복사를 비교해 보자. [그림 5-13](a)에서 얕

    은 복사기는 어린이만 복사하고 어린이가 가진 장난감은 복사하지 않는다. 이것을 소

    위 얕은 복사(shallow copy)라고 부른다. 얕은 복사 후, 두 어린이는 장난감을 서로

    자기 것이라고 아는 충돌이 생긴다. 이와 달리 [그림 5-13](b)의 깊은 복사(deep copy)

    는 원본이 소유한 모든 것까지 복사한다. 깊은 복사가 이루어지면 어린이가 소유한 장

    난감도 복사되므로 얕은 복사에서 생기는 충돌은 발생하지 않는다.

    얕은 복사기

    깊은 복사기

    복사본

    복사본

    원본

    원본

    (a) 얕은 복사

    (b) 깊은 복사

    그 장난감내거야!

    내 장난감이야!

    [그림 5-13] 얕은 복사와 깊은 복사

    복사

    얕은 복사

    깊은 복사

    충돌

    Administrator입력 텍스트p.240Swallow → Shallow

    Administrator입력 텍스트

  • 287함수 중복과 static 멤버06 CHAPTER

    배열의 이름은 포인터이기 때문에, 다음 두 함수는 같은 함수로서, 공존할 수 없다.

    void f(int a[]);void f(int* a);

    틀린 함수 중복잠깐!

    1⃞ 다음 함수 중복 중에서 모호한 함수 호출의 가능성이 있는 경우는?① void f(int a, int b); void f(int a=3, int b=3);② void f(int a); void f(int* a);③ void f(int* a); void f(int& a);④ void f(int a, int b); void f(int a=3);

    CHECKTIME

    예제 6-9 디폴트 매개 변수로 인한 함수 중복의 모호성

    디폴트 매개 변수를 가진 함수와 보통 매개 변수를 가진 함수가 중복되는 경우, 함수 호출에 따른 모호

    성이 발생하는 사례를 보인다. 컴파일 오류 메시지는 예제 6-7과 동일하다.

    12345678910111213141516

    #include #include using namespace std;

    void msg(int id) { cout

  • 342 명품 C++ 프로그래밍

    그러나 2가 객체가 아니므로 이 변형식은 완전히 잘못된 문장이다. 이처럼 첫 번째

    피연산자가 객체가 아닌 경우, 컴파일러는 다음과 같은 식([그림 7-7]의 ②식)으로 변

    환한다.

    + ( 2 , a )

    사실 컴파일러에게 두 개의 옵션이 있는 셈이다. 앞의 식이 성공적이기 위해서는

    operator+() 함수를 Power 클래스의 외부 함수로 밖에 구현할 수 없다.

    외부 연산자함수명

    오른쪽피연산자

    왼쪽 피연산자

    Power a(3,4), b;b = 2 + a;

    b = 2 + a;

    c = 2 . + ( a );

    c = + ( 2 , a );

    ① 변환 불가능

    ② 변환 가능

    [그림 7-7] 2+a 식의 변환. 컴파일러에 의한 시도

    [그림 7-8]은 + 연산자를 Power 클래스의 외부 함수로 구현한 코드를 보여준다. 이

    처럼 어떤 연산의 경우, 연산자 함수를 오직 외부 함수로만 작성해야 하는 경우가

    있다.

    컴파일러에 의한 변환b = 2 + a; b = + ( 2, a );

    Power operator+ (int op1, Power op2) { Power tmp; tmp.kick = op1 + op2.kick; tmp.punch = op1 + op2.punch; return tmp;}

    리턴 타입

    매개 변수

    [그림 7-8] 2+a 연산을 위한 외부 operator+(int, Power) 함수 구현

    ●외부 연산자 함수의 프렌드 선언

    [그림 7-8]의 operator+(int, Power) 연산자 함수에는 한 가지 걱정거리가 있다. 함수

    내에서 Power의 private 멤버인 kick과 punch를 자유롭게 접근하고 있기 때문이다.

    이대로라면, 이 연산자 함수에 컴파일 오류가 발생할 것이 뻔하다. 이 문제의 손쉬운

    해결책은 kick과 punch를 public으로 선언하면 된다. 그러나 이러한 해결책은 연산자

    외부 함수

    public

    Administrator스탬프

    Administrator입력 텍스트p.342그림 7-8에서 박스 안에 들어 있는 코드 수정

    Administrator입력 텍스트

    Administrator입력 텍스트

  • 435가상 함수와 추상 클래스09 CHAPTER

    9.3 가상 함수와 오버라이딩의 활용 사례

    가상 함수는 파생 클래스에서 재정의할 함수를 알려주는 인터페이스의 역할을 한다. 이

    절에서는 사례를 통해 가상 함수와 오버라이딩을 활용하는 객체 지향 프로그래밍의 응

    용에 대해 다룬다. 저자는 이 응용 사례를 통해 다음의 4가지 주제를 설명하고자 한다.

    •가상 함수를 가진 기본 클래스의 목적 •가상 함수 오버라이딩

    •동적 바인딩 실행 •기본 클래스의 포인터 활용

    가상 함수를 가진 기본 클래스의 목적

    [그림 9-10]은 이 절에서 다루고자 하는 응용 프로그램의 코드를 보여준다. 그래픽에

    #include #include "Shape.h"#include "Line.h"using namespace std;

    void Line::draw() { cout

  • 441가상 함수와 추상 클래스09 CHAPTER

    virtual void draw() { cout

  • 481템플릿과 표준 템플릿 라이브러리(STL)10 CHAPTER

    두 개 이상의 제네릭 타입을 가진 제네릭 클래스

    템플릿을 사용하여 2개 이상의 제네릭 타입을 가진 제네릭 클래스를 만들 수 있다. 다

    음은 T1, T2, T3의 3개의 제네릭 타입을 선언하는 사례이다.

    template

    예제 10-8은 두 개의 제네릭 타입 T1과 T2를 가진 클래스를 만든 사례를 보여준다.

    16171819202122232425262728293031323334353637383940

    int *p = new int [3]; for(int i=0; i