언어 자료구조 알고리즘/Escort 자료구조와 STL

[자료구조와 STL] 2. 공통적으로 사용하는 것들

언제나휴일 2016. 4. 18. 09:43
반응형

1.2 이 책에서 공통적으로 사용하는 것들

 

 앞으로 이 책에서 사용할 클래스 ehglobal을 소개를 하겠습니다. ehglobal 클래스에는 이 책에 소개되는 전반적인 예제 프로그램에서 공통으로 사용할 만한 함수들을 정적 멤버 메서드로 캡슐화되어 있습니다. 이 책에 공통으로 사용 가능한 것들에 대한 정의에서는 형식 명과 메서드 명 모두 소문자만을 사용하고 있습니다.

 

 먼저, 콘솔 화면을 지우는 메서드로 clrscr을 제공할 것입니다.

 

static void clrscr();

 

 사실, 메서드 내에서 하는 작업은 단순히 친 명령을 system 함수를 이용하는 것밖에 없습니다. 여기에서는 자주 사용하는 함수들을 ehglobal 클래스의 정적 멤버 메서드로 캡슐화하여 사용자 편의를 제공하는 것 외에는 특별한 의미가 없습니다. 여러분께서 의미 없다고 생각하시면 무시하셔도 무관합니다.

 

void ehglobal::clrscr()

{

    system("cls");

}

 

 그리고 원하는 시간 동안 프로세스를 멈추게 하는 timeflow 메서드를 제공할 것입니다.

 

static void timeflow(int millisecond);

void ehglobal::timeflow(int millisecond)

{

    Sleep(millisecond);

}

 

 참고로 Sleep 메서드는 Win32 API에서 제공되는 기능입니다.

 

 

 정수를 입력받는 메서드로 getnum을 제공하겠습니다.

 

static int getnum();

 

 istream 개체인 cin을 사용을 하여 cin>>num; 과 같은 구문으로 정수를 입력을 받게 되면 사용자가 잘못 입력하거나 정수 이외에 다른 문자열을 포함하여 입력한다면 기본 입력 버퍼에 계속 남아있게 되어 원하는 바대로 수행되지 않습니다. 요청에 맞게 사용자가 제대로 입력한다면 큰 문제가 없겠지만 그렇지 않으면 이후의 동작은 원하지 않는 방향으로 진행될 것입니다. 그리고 실무 프로그램을 작성하는 것일 경우에 사용자의 사소한 실수로 후속 작업에 영향을 미치는 것은 바람직하지 않을 것입니다.

 

 여기에서는 cin개체의 getline 메서드로 사용자가 입력한 stream(아스키코드의 연속된 나열로써 연속의 끝은 '\n'이다. 참고로, 문자열은 '\0'가 오기 전까지의 아스키코드의 연속된 나열입니다.)을 지역 변수에 입력받습니다. 그리고 입력 버퍼를 지운 다음에 입력된 stream을 정수로 치환하여 반환하게 하였습니다.

 

int ehglobal::getnum()

{

    int num;

    char buf[255+1];

    cin.getline(buf,255);

    cin.clear();

    sscanf(buf,"%d",&num);

    return num;

}

  

 

 문자열을 입력받는 메서드로 getstr을 제공하겠습니다.

 

static string getstr();

 

 마찬가지로 cin>>name; 과 같은 형태로 문자열을 입력받으면 공백이나 탭이 중간에 오게 입력을 하면 그 이전까지만 입력을 받게 됩니다. 그리고 입력 버퍼에는 여전히 그 이후의 문자들이 남아있게 되어 다음에 입력 요청을 하면 새롭게 입력받지 않고 남아있는 데이터를 이용하게 됩니다. 이를 방지하기 위해 getstr을 제공하고 있습니다.

 

string ehglobal::getstr()

{

    char buf[255+1];

    cin.getline(buf,255);

    cin.clear();

    return buf;

}

 

 그리고 메뉴를 입력받는 작업과 같이 기능 키를 입력받기 위한 메서드 getkey를 제공하겠습니다. 여기에서는 F1~F7까지와 ESC를 제공하기로 하겠습니다.

 

 먼저, 이와 같은 키를 열거형 keydata로 정의하겠습니다.

 

enum keydata

{

    NO_DEFINED,F1,F2,F3,F4,F5,F6,F7,ESC

};

 

 기능 키를 입력받는 메서드에서는 사용자로부터 입력받은 키를 keydata 형식에 열거된 값으로 변환하여 반환하도록 하겠습니다.

 

static keydata getkey();

 

 getch 함수를 호출하였을 때 ESC 키를 누르면 27을 반환합니다. , getch 함수가 반환하는 값이 27인 경우에는 keydata 형식에 열거된 ESC를 반환하게 하였습니다.

 

 그리고 기능 키를 누르면 0이 반환되며 다시 getch를 호출하면 사용자로부터 다시 입력을 받지 않고 F1일 경우에는 59, F2일 경우에는 60을 반환합니다. , getch 함수를 호출하여 반환 값이 0이면 다시 getch 함수를 호출하여 반환 값에 따라 F1~F7을 반환하도록 하였습니다. 이 외에는 NO_DEFINED 값을 반환합니다.

 

keydata ehglobal::getkey()

{

    int key = getch();

    if(key == 27)

    {

        return ESC;

    }

    if(key == 0)

    {

        key = getch();

        switch(key)

        {

        case 59: return F1;

        case 60: return F2;

        case 61: return F3;

        case 62: return F4;

        case 63: return F5;

        case 64: return F6;

        case 65: return F7;

        }

    }

    return NO_DEFINED;

}

 

 

//EHGlobal.h

#pragma once

#pragma warning(disable:4996)

#include <string>

using std::string;

#include <iostream>

using std::cout;

using std::cin;

using std::ostream;

using std::endl;

#include <conio.h>

#include <windows.h>

enum keydata

{

    NO_DEFINED,F1,F2,F3,F4,F5,F6,F7,ESC

};

 

//공통적으로 사용할 정적 메서드를 캡슐화한 클래스

class ehglobal

{

public:

    static void clrscr();//화면을 지우는 메서드

    static void timeflow(int millisecond); //원하는 시간동안 지연시키는 메서드

    static int getnum();//수를 입력받는 메서드

    static string getstr();//문자열을 입력받는 메서드

    static keydata getkey();//기능 키를 입력받는 메서드

private:

    ehglobal(void){ }//개체를 생성하지 못하게 하기 위해 private으로 접근 지정

    ~ehglobal(void){}

};

 

 

//EHGlobal.cpp

#include "ehglobal.h"

 

void ehglobal::clrscr()//화면을 지우는 메서드

{

    system("cls");

}

 

void ehglobal::timeflow(int millisecond) //원하는 시간동안 지연시키는 메서드

{

    Sleep(millisecond);

}

 

int ehglobal::getnum()//정수를 입력받는 메서드

{

    int num;

    char buf[255+1];

    cin.getline(buf,255); //버퍼에 입력받음

    cin.clear();//cin 내부 버퍼를 지움

    sscanf(buf,"%d",&num); //포맷에 맞게 버퍼에 내용을 정수로 변환

    return num;

}

 

string ehglobal::getstr()//문자열을 입력받는 메서드

{

    char buf[255+1];

    cin.getline(buf,255);

    cin.clear();

    return buf;

}

 

keydata ehglobal::getkey()//기능 키를 입력받는 메서드

{

    int key = getch();

 

    if(key == 27) //ESC를 누를 때의 key 값이 27

    {

        return ESC;

    }

    if(key == 0) //기능 키를 눌렀을 때는 getch의 반환값이 0

    {

        //어떤 기능 키를 눌렀는지 확인하려면 getch를 다시 호출해야 함

        //사용자에게 다시 키를 입력받는 것은 아님

        key = getch();

        switch(key) //입력한 키에 따라 약속된 값 반환

        {

        case 59: return F1;    case 60: return F2;

        case 61: return F3;    case 62: return F4;

        case 63: return F5;    case 64: return F6;

        case 65: return F7;

        }

    }

    return NO_DEFINED; //열거되지 않은 키를 눌렀을 때

}

 

반응형