직원 관리 시스템에서 직원의 정보는 별도의 database에 저장하여 관리하면 편리합니다. 이번 포스팅에서는 database 클래스를 정의하고 구현하는 방법에 대해서 정리했습니다.
Database 클래스 정의
설계하려는 Database 클래스는 Employee 객체를 저장합니다. 이를 위해 std::vector 클래스를 자료형으로 사용하는 멤버변수를 선언했으며. database에 직원 정보를 저장하고 조회하기 위한 메서드들을 정의했습니다. 이에 대한 예제는 아래와 같습니다.
#pragma once
#include <iostream>
#include <vector>
#include "Employee.h"
using namespace std;
namespace Records
{
const int kFirstEmployeeNumber = 1;
class Database
{
public:
//직원 정보 저장 및 불러오기
Employee& addEmployee(const string& firstName, const string& lastName);
Employee& getEmployee(int employeeNumber);
Employee& getEmployee(const string& firstName, const string& lastName);
//화면 display 함수
void displayAll() const;
void displayCurrent() const;
void displayFormer() const;
private:
vector<Employee> m_vecEmployees; //직원 정보 저장 버퍼
int m_nNextEmployeeNumber = kFirstEmployeeNumber; //Next 직원 번호 : 저장 후 자동으로 카운팅 됨
};
}
Database 클래스 구현
addEmployee() 메서드는 새로운 Employee 객체를 생성하고, vector에 저장합니다. 그리고 새 직원의 번호를 받기 위해 m_nNextEmployeeNumber 멤버 변수의 값을 하나 증가시킵니다.
Employee& Database::addEmployee(const string& firstName, const string& lastName)
{
Employee theEmployee(firstName, lastName);
theEmployee.setEmployeeNumber(m_nNextEmployeeNumber++);
theEmployee.hire();
m_vecEmployees.push_back(theEmployee);
return m_vecEmployees[m_vecEmployees.size() - 1];
}
getEmployee() 함수는 2개의 오버로딩 함수로 구현했습니다. 각각은 직원 번호 또는 성과 이름으로 해당 직원의 정보를 불러올 수 있습니다. 만약 해당 직원이 없을 경우 예외가 발생됩니다.
Employee& Database::getEmployee(int employeeNumber)
{
for (auto& employee : m_vecEmployees) {
if (employee.getEmployeeNumber() == employeeNumber) {
return employee;
}
}
throw logic_error("No employee found"); // 일치하는 직원이 없으면 exception 발생
}
Employee& Database::getEmployee(const string& firstName, const string& lastName)
{
for (auto& employee : m_vecEmployees) {
if (employee.getFirstName() == firstName && employee.getLastName() == lastName) {
return employee;
}
}
throw logic_error("No employee found"); // 일치하는 직원이 없으면 exception 발생
}
화면 display 함수들은 모든 직원에 대해 루프를 돌면서 일정한 조건을 만족하는 직원의 정보를 콘솔 화면에 출력합니다.
void Database::displayAll() const // 전/현직 모두 출력
{
for (const auto& employee : m_vecEmployees) {
employee.display();
}
}
void Database::displayCurrent() const // 현재 직원 출력
{
for (const auto& employee : m_vecEmployees) {
if (employee.isHired())
employee.display();
}
}
void Database::displayFormer() const // 전 직원 출력
{
for (const auto& employee : m_vecEmployees) {
if (!employee.isHired())
employee.display();
}
}
Database 클래스 테스트
Database 클래스에 대한 테스트는 간단히 구현했습니다. 단위테스트 프레임 워크를 사용하려고 했으나 이런 간단한 테스트에는 불편한 점이 몇몇 있어서 생략했습니다.
※ 단위테스트를 하는 방법은 아래 링크를 참고하세요.
[참고]
2023.02.07 - [프로그래밍/c++] - C++ 기초(직원 관리 시스템 - 단위 테스트)
Database에 대한 테스트 코드는 아래와 같습니다. 동물 직원을 등록하고 조회하는 코드입니다.
include "stdafx.h"
#include <iostream>
#include "Database.h"
using namespace std;
using namespace Records;
int main()
{
Database myDB;
Employee& emp1 = myDB.addEmployee("냥이", "삼색");
emp1.fire();
Employee& emp2 = myDB.addEmployee("불곰", "회색");
emp2.setSalary(3000000);
Employee& emp3 = myDB.addEmployee("다람쥐", "줄무늬");
emp3.setSalary(2500000);
emp3.promote();
cout << "[모든 직원 조회] " << endl << endl;
myDB.displayAll();
cout << "[현재 직원 조회] " << endl << endl;
myDB.displayCurrent();
cout << "[퇴사 직원 조회] " << endl << endl;
myDB.displayFormer();
}
결과
[모든 직원 조회]
사원: 삼색, 냥이
-----------------------------
재직 상태 : 퇴 사
사원 번호: 1
급여(월): 3000000원
사원: 회색, 불곰
-----------------------------
재직 상태 : 재직 중
사원 번호: 2
급여(월): 3000000원
사원: 줄무늬, 다람쥐
-----------------------------
재직 상태 : 재직 중
사원 번호: 3
급여(월): 3500000원
[현재 직원 조회]
사원: 회색, 불곰
-----------------------------
재직 상태 : 재직 중
사원 번호: 2
급여(월): 3000000원
사원: 줄무늬, 다람쥐
-----------------------------
재직 상태 : 재직 중
사원 번호: 3
급여(월): 3500000원
[퇴사 직원 조회]
사원: 삼색, 냥이
-----------------------------
재직 상태 : 퇴 사
사원 번호: 1
급여(월): 3000000원
[참고]
1. 전문가를 위한 c++(개정4판) (저자 : 마크 그레고리 / 옮긴이 남기혁)
[참고 포스팅]
2023.01.31 - [프로그래밍/c++] - c++ 기초(직원 관리 시스템 - Employee 클래스 정의)
2023.02.02 - [프로그래밍/c++] - C++ 기초(직원 관리 시스템 - Employee 클래스 구현)
'Program Language > c++' 카테고리의 다른 글
C++ 기초(Raw String Literal) (13) | 2023.02.20 |
---|---|
C++ 기초(직원 관리 시스템 - 사용자 인터페이스) (10) | 2023.02.13 |
C++ 기초(직원 관리 시스템 - 단위 테스트) (38) | 2023.02.07 |
C++ 기초(직원 관리 시스템 - Employee 클래스 구현) (18) | 2023.02.02 |
c++ 기초(직원 관리 시스템 - Employee 클래스 정의) (12) | 2023.01.31 |
댓글