이번 포스팅은 직원 관리 시스템의 마지막 내용으로 사용자 인터페이스 부분에 대해서 정리했습니다. 사용자는 콘솔화면에 나타나는 텍스트 기반 메뉴를 사용하여 직원 데이터를 관리합니다.
인터페이스(Interface) 클래스 정의
화면에 메뉴를 출력하고 사용자가 선택한 동작을 수행하는 함수를 별도의 인터페이스 클래스로 정의했습니다. 아래 예제는 인터페이스 클래스의 정의 부분이며, 멤버 변수는 없고, 오로지 멤버 함수로만 이루어져 있습니다.
#pragma once
namespace Records
{
class Database; //전방 선언
class Interface
{
public:
Interface() = default;
int displayMenu(); //콘솔화면에 사용자 메뉴를 보여준다.
void doHire(Database& db); //고용
void doFire(Database& db); //해고
void doPromote(Database& db); //승진
void doDemote(Database& db); //강등
void doDisplayAll(Database& db); //모든 직원 조회
void doDisplayCurrent(Database& db); //재직 중인 직원 조회
void doDisplayFormer(Database& db); //퇴사 직원 조회
};
}
인터페이스 클래스 구현
displayMenu() 함수는 콘솔화면에 텍스트 메뉴를 출력하고 사용자로부터 값을 입력받습니다. 입력값은 int 타입의 숫자이며 0 ~ 6까지 값을 가집니다. 숫자의 범위를 벗어나거나 문자 입력 시 error 메시지를 출력합니다.
int Interface::displayMenu()
{
int selection = 0;
cout << endl;
cout << "직원 정보" << endl;
cout << "---------" << endl;
cout << "1) 고용" << endl;
cout << "2) 해고" << endl;
cout << "3) 승진" << endl;
cout << "4) 조회(전체)" << endl;
cout << "5) 조회(재직)" << endl;
cout << "6) 조회(퇴사)" << endl;
cout << "0) 종료" << endl;
cout << endl;
cout << "---> ";
cin >> selection;
if (cin.fail()) {
cin.clear();
cin.ignore(); //무한루프 방지를 위해 최근 입력받은 내용을 지운다.
cerr << "숫자가 아닙니다!" << endl;
return -1;
}
return selection;
}
doHire() 메서드는 사용자로 부터 신입직원의 이름을 입력받아 데이터 베이스에 그 직원 정보를 추가하도록 요청합니다.
void Interface::doHire(Database& db)
{
string firstName;
string lastName;
cout << "이름 : ";
cin >> firstName;
cout << "성 : ";
cin >> lastName;
db.addEmployee(firstName, lastName);
}
doFire()와 doPromote(), 그리고 doDemote()는 데이터 베이스의 getEmployee() 메서드를 사용하여 직원 정보를 변경합니다. getEmployee() 메서드 안에 throw 구문을 처리하기 위해 try ~ catch 문을 사용했습니다.
void Interface::doFire(Database& db)
{
int employeeNumber;
cout << "직원 번호 : ";
cin >> employeeNumber;
try {
Employee emp = db.getEmployee(employeeNumber);
emp.fire();
cout << "직원 " << employeeNumber << "삭제 됨." << endl;
}
catch (const logic_error& exception) {
cerr << "[error]직원 정보를 삭제할 수 없습니다!" << exception.what() << endl;
}
}
void Interface::doPromote(Database& db)
{
int employeeNumber;
int raiseAmount;
cout << "직원 번호 : ";
cin >> employeeNumber;
cout << "임금 증가액 : ";
cin >> raiseAmount;
try {
Employee& emp = db.getEmployee(employeeNumber);
emp.promote(raiseAmount);
}
catch(const logic_error& exception){
cerr << "[error]직원을 승진시킬 수 없습니다!" << exception.what() << endl;
}
}
void Interface::doDemote(Database& db)
{
int employeeNumber;
int demeritAmount;
cout << "직원 번호 : ";
cin >> employeeNumber;
cout << "임금 감소액 : ";
cin >> demeritAmount;
try {
Employee& emp = db.getEmployee(employeeNumber);
emp.demote(demeritAmount);
}
catch (const logic_error& exception) {
cerr << "[error]직원을 강등시킬 수 없습니다!" << exception.what() << endl;
}
}
display 함수들은 database의 display함수들 그대로 wrapping 했습니다.
void Interface::doDisplayAll(Database& db)
{
db.displayAll();
}
void Interface::doDisplayCurrent(Database& db)
{
db.displayCurrent();
}
void Interface::doDisplayFormer(Database& db)
{
db.displayFormer();
}
main() 함수
main() 함수는 Interface 객체를 이용하여 화면에 메뉴를 출력하고 선택한 동작을 수행하는 과정을 무한히 반복합니다.
#include "stdafx.h"
#include <iostream>
#include "Interface.h"
#include "Database.h"
using namespace Records;
using namespace std;
int main()
{
Database employeeDB;
Interface ui;
bool done = false;
while (!done) {
int selection = ui.displayMenu();
switch (selection) {
case 0:
done = true;
break;
case 1:
ui.doHire(employeeDB);
break;
case 2:
ui.doFire(employeeDB);
break;
case 3:
ui.doPromote(employeeDB);
break;
case 4:
ui.doDisplayAll(employeeDB);
break;
case 5:
ui.doDisplayCurrent(employeeDB);
break;
case 6:
ui.doDisplayFormer(employeeDB);
break;
default:
cout << "잘못된 입력입니다.(0 ~ 6 숫자를 입력)!" << endl;
break;
}
}
return 0;
}
다음은 실행결과의 일부를 보여줍니다.
직원 정보
---------
1) 고용
2) 해고
3) 승진
4) 조회(전체)
5) 조회(재직)
6) 조회(퇴사)
0) 종료
---> 1
이름 : 냥이
성 : 삼색
직원 정보
---------
1) 고용
2) 해고
3) 승진
4) 조회(전체)
5) 조회(재직)
6) 조회(퇴사)
0) 종료
---> 3
직원 번호 : 1
임금 증가액 : 1000000
직원 정보
---------
1) 고용
2) 해고
3) 승진
4) 조회(전체)
5) 조회(재직)
6) 조회(퇴사)
0) 종료
---> 4
사원: 삼색, 냥이
-----------------------------
재직 상태 : 재직 중
사원 번호: 1
급여(월): 4000000원
직원 정보
---------
1) 고용
2) 해고
3) 승진
4) 조회(전체)
5) 조회(재직)
6) 조회(퇴사)
0) 종료
--->
[참고]
1. 전문가를 위한 c++(개정4판) (저자 : 마크 그레고리 / 옮긴이 남기혁)
'Program Language > c++' 카테고리의 다른 글
C++ 기초(std::string 클래스) (7) | 2023.03.02 |
---|---|
C++ 기초(Raw String Literal) (13) | 2023.02.20 |
C++ 기초(직원 관리 시스템 - Database 클래스) (19) | 2023.02.09 |
C++ 기초(직원 관리 시스템 - 단위 테스트) (38) | 2023.02.07 |
C++ 기초(직원 관리 시스템 - Employee 클래스 구현) (18) | 2023.02.02 |
댓글