언어 자료구조 알고리즘/디딤돌 C++

[C++] 54. 개체 출력자

언제나휴일 2016. 4. 25. 01:31
반응형


개체 출력자

이번에는 개체 출력자가 무엇인지 알아보기로 해요.

 

C++에서 기본 형식의 값을 스트림에 출력할 때는 ostream 형식 개체와 왼쪽 쉬프트(<<) 연산자를 이용할 수 있죠. 개발자가 정의한 형식도 기본 형식처럼 ostream 형식 개체를 이용하여 출력할 수 있게 하는 것을 개체 출력자라고 말합니다.

 

ostream은 표준 템플릿 라이브러리에서 정의한 형식이어서 개발자가 ostream 클래스 내부에 개체 출력자를 정의하는 것이 아닙니다. C++문법에 연산자를 중복 정의하는 방법은 클래스 내부에서 할 수도 있지만 전역에 정의할 수도 있죠. 이러한 특징을 이용하여 첫 번째 인자를 ostream이 오게 하고 두 번째 인자로 개발자가 정의한 형식 개체를 전달받는 << 연산자를 중복 정의합니다.

ostream &operator<<(ostream &os,const Member &member);

ostream &operator<<(ostream &os,const Member *member);

 

이처럼 전역에 연산자 중복 정의하면 기본 형식처럼 출력할 수 있습니다.

Member *member = new Member(3,"홍길동");

os<<member<<endl;

delete member;

Member member2(4,"강감찬");

os<<member2<<endl;

 

특히 개체 출력자는 cout을 이용하여 출력하는 것 뿐만 아니라 ostream 형식 개체라면 출력에 사용할 수 있게 작성하세요.

 

다음은 회원 클래스를 정의하고 ostream을 이용하여 개체 출력할 수 있게 개체 출력자를 정의한 예제입니다. 특히 사용하는 곳에서 cout을 이용하여 콘솔 화면에 출력하며 출력 파일 스트림 개체를 이용하여 파일에 출력도 가능합니다.


54. 개체 출력자.zip

 

//Member.h

#pragma once

#include <iostream>

#include <string>

using namespace std;

class Member

{

    string name;

    const int num;

public:

    Member(int num,string name);

    int GetNum()const;

    string GetName()const;

    void View(ostream &os=cout)const;

};

ostream &operator<<(ostream &os,const Member &member); //개체 출력자

ostream &operator<<(ostream &os,const Member *member); //개체 출력자

 

//Member.cpp

#include "Member.h"

Member::Member(int num,string name):num(num)

{

    this->name = name;

}

int Member::GetNum()const

{

    return num;

}

string Member::GetName()const

{

    return name;

}

void Member::View(ostream &os)const

{

    os<<"번호:"<<num<<" 이름:"<<name;

}

ostream &operator<<(ostream &os,const Member &member)

{

    member.View(os);

    return os;

}

ostream &operator<<(ostream &os,const Member *member)

{

    member->View(os);

    return os;

}

//Program.cpp

#include <fstream>

using namespace std;

#include "Member.h"

 

int main()

{

    Member *member = new Member(3,"홍길동");

    Member member2(4,"강감찬");

 

    cout<<member<<endl;   

    cout<<member2<<endl;  

 

    ofstream of("data.txt"); //출력 파일 스트림 개체 선언

    of<<member<<endl; //출력 파일 스트림에 출력

    of<<member2<<endl;  //출력 파일 스트림에 출력

    of.close();

 

    delete member;

    return 0;

}

 

실행 결과

번호:3 이름:홍길동

번호:4 이름:강감찬

 

data.txt 파일 내용

번호:3 이름:홍길동

번호:4 이름:강감찬

반응형