✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2022-05-20 11:51:19
조회수 358

컴공 일기 25

게시글 주소: https://orbi.kr/00056748607


#include <iostream>

using namespace std;

#define DEFAULT_FARE 1000


class CPerson{

public:

        CPerson() {}

        virtual ~CPerson(){

            cout << "virtual ~CPerson" << endl;

        }

      

        virtual void CalcFare() = 0;

        virtual unsigned int GetFare() {return m_nFare;}


protected:

        unsigned int m_nFare = 0;       

};


class C_GoinWater : public CPerson{

public:

    virtual void CalcFare() {

        m_nFare = 0; // 무료, 노인 공경 

        

    }

};


class C_3su : public CPerson{

public:

    virtual void CalcFare() {

        m_nFare = DEFAULT_FARE * 50 / 100; // 50%, 중년 공경

        

    }

};


class C_jaesu : public CPerson{

    virtual void CalcFare(){

        m_nFare = DEFAULT_FARE * 75 / 100; // 75%, 넌 아직 젊어

        

    }

};



class C_hyeonyuk : public CPerson{

public:

    virtual void CalcFare() {

        m_nFare = DEFAULT_FARE; // 100% 

       

    }

};


/////////////////////////////////////////////////////////////////////

/////////////사용자 코드


int main() {

    CPerson* arList[4] = {0,};

    int N_SU = 0;

    

    // 1.자료 입력


    for(auto &person : arList){

        cout << "도긩이 : 당신의 N은 몇 입니까?" << endl; 

        cin >> N_SU;


        if(N_SU == 0 or N_SU == 1)

            person = new C_hyeonyuk;


        else if(N_SU == 2)

            person = new C_jaesu;


        else if(N_SU == 3)

            person = new C_3su;


        else if(N_SU > 3)

            person = new C_GoinWater;


        //생성한 객체에 맞는 요금이 자동 한 줄로 계산 끝. 

        person -> CalcFare();    

    }


    //2.자료 출력


    for(auto person : arList)

       cout << person->GetFare()<< "원" << endl;


    

    //3.자료 삭제 및 종료 -> memory leak 막는 건 프로그래머의 기본 덕목 


    for(auto person : arList)

        delete person; 

    

    return 0;

}



실행결과 : 



도긩이 : 당신의 N은 몇 입니까?

4

도긩이 : 당신의 N은 몇 입니까?

3

도긩이 : 당신의 N은 몇 입니까?

2

도긩이 : 당신의 N은 몇 입니까?

1

0원

500원

750원

1000원

virtual ~CPerson

virtual ~CPerson

virtual ~CPerson

virtual ~CPerson


잔혹하긴 하지만.. 수능을 몇 번 봤느냐에 따라 버스 비용을 계산해주는 프로그램을 만들었습니다. 


농담 삼아 만들어 본 예제이긴 하지만, 꽤 중요한 구조이긴 합니다. 일단, 프로그램의 성능을 높이려면 "데이터 분류"는 입력부분에서 모두 이루어지는 게 옳습니다. 왜냐하면, 컴퓨터가 가장 여유로울 때가 입력 시기거든요. 출력 때 분류를 하려고 하면, 연산량이 굉장히 늘어나기 때문에 프로그램이 효율적으로 돌아가진 않습니다. 그래서, 이 코드가 좋은 건 자료 출력부분에서 person->CalcFare(); 딱 한 줄로 선언했다는 것입니다. 이 한 줄로 모든 데이터에 대해서 원하는 출력이 가능하기 때문에 그만큼 효율적인 프로그램이지요. 출력 부분에서 비용 지출을 극한으로 아낀 셈입니다. 원래 성능 업그레이드라는 게, 별 것 없습니다. 안해도 될 걸 안하면 되죠. 


허나, 이 효율적인 구조가 가능했던 건, 단 하나의 예약어 때문인데 그것이 바로 CPerson 부분에 있는 virtual 입니다.

virtual을 해줬기 때문에, CPerson을 상속한 현역(hyeonyuk), 재수(jaesu), 삼수(3su), 고인물(GoinWater) 클래스들이 모두 CalcFare 함수를 재정의할 수 있었지요. 즉, CPerson이라는 추상 클래스가 일종의 interface를 주어서 각각의 상속 클래스들에게 자신이 원하는 CalcFare 함수를 조각할 수 있도록 만들어준 것이지요. 이것이 가능했기 때문에 출력 부분에서 비용을 아낄 수 있었던 겁니다. 


흔히들, 이런 구조를 Look-up table 혹은 편의상 룩업구조라고도 얘기합니다. 


이상 수능 4번 본 4수생 드림..



0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.