Database 클래스는 표준 라이브러리에서 제공하는 std::vrctor 클래스를 이용하여 employee 객체를 저장한다.
1. Database.h
새로 채용한 직원에 대한 직원 번호는 데이터베이스에서 자동으로 할당한다.
#pragma once
#include <iostream>
#include <vector>
#include "Employee.h"
namespace Records {
const int kFirstEmployeeNumber = 1000;
이를 위해 직원 번호의 시작값을 상수로 정의한다.
이 데이터는 성과 이름을 입력하는 것만으로 신입직원에 대한 정보를 쉽게 추가하는 기능을 제공한다.
class Database
{
public:
Employee& addEmployee(const std::string& firstName,
const std::string& lastName);
Employee& getEmployee(int employeeNumber);
Employee& getEmployee(const std::string& firstName,
const std::string& lastName);
편의를 위해 이 메서드는 신입직원 객체에 대한 레퍼런스를 리턴한다.
다른 코드에서도 getEmployee() 메서드를 호출해서 직원 객체에 대한 레퍼런스를 구할 수 있다.
이 데이터베이스는 모든 직원에 대한 중앙 저장소이기 때문에
전체 직원 정보, 현재 재직 중인 직원 정보, 퇴사한 직원 정보를 출력하는 메서드를 제공한다.
void displayAll() const;
void displayCurrent() const;
void displayFormer() const;
mEmployees는 Employee 객체를 가지고 있다.
private:
std::vector<Employee> mEmployees;
int mNextEmployeeNumber = kFirstEmployeeNumber;
};
}
mNextEmployeeNumber 데이터 멤버는 신입직원에 할당된 직원 번호를 기록하며,
kFirstEmployeeNumber 상수로 초기화한다.
2. Database.h
addEmployee() 메서드는 새로운 Employee 객체를 생성하고, 정보를 채우고 이를 vector에 추가한다.
mNextEmployeeNumber 데이터 멤버는 한 번 사용하면 값을 하나 증가시키는데,
그래야 다음 직원이 새 번호를 받을 수 있기 때문이다.
#include <iostream>
#include <stdexcept>
#include "Database.h"
using namespace std;
namespace Records {
Employee& Database::addEmployee(const string& firstName,
const string& lastName)
{
Employee theEmployee(firstName, lastName);
theEmployee.setEmployeeNumber(mNextEmployeeNumber++);
theEmployee.hire();
mEmployees.push_back(theEmployee);
return mEmployees[mEmployees.size() - 1];
}
여기서 getEmployee()의 한 가지 버전만 보여준다.
두 버전 모두 작동 방식은 비슷하다.
Employee& Database::getEmployee(int employeeNumber)
{
for (auto& employee : mEmployees) {
if (employee.getEmployeeNumber() == employeeNumber) {
return employee;
}
}
throw logic_error("No employee found.");
}
둘다 범위 기반 for 문을 사용해서 mEmployees에 있는 모든 직원에 대해 루프를 돌면서 메서드에 전달된 정보와 일치하는 Employee가 있는지 확인한다. 이 과정에서 일치하는 직원이 없으면 익셉션을 발생시킨다.
display 메서드들에서 사용하는 알고리즘은 모두 비슷하다.
void Database::displayAll() const
{
for (const auto& employee : mEmployees) {
employee.display();
}
}
void Database::displayCurrent() const
{
for (const auto& employee : mEmployees) {
if (employee.isHired())
employee.display();
}
}
모든 직원에 대해 루프를 돌면서 일정한 조건에 만족하는 직원의 정보를 콘솔에 출력한다.
displayFormer()는 displayCurrent()와 비슷하다.
3. DatabaseTest.cpp
지금까지 정의한 데이터베이스의 기본 기능을 테스트하는 코드는 다음과 같다.
#include <iostream>
#include "Database.h"
using namespace std;
using namespace Records;
int main()
{
Database myDB;
Employee& emp1 = myDB.addEmployee("Greg", "Wallis");
emp1.fire();
Employee& emp2 = myDB.addEmployee("Marc", "White");
emp2.setSalary(100000);
Employee& emp3 = myDB.addEmployee("John", "Doe");
emp3.setSalary(10000);
emp3.promote();
cout << "all employees: " << endl << endl;
myDB.displayAll();
cout << endl << "curent employees: " << endl << endl;
myDB.displayCurrent();
cout << endl << "former employees: " << endl << endl;
myDB.displayFormer();
}
결과
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
[C++ 2.1.1] 동적 스트링(C 스타일 스트링), strlen, strcpy, strcat (0) | 2022.08.19 |
---|---|
[C++ 1.6.4] 사용자 인터페이스 (0) | 2022.08.19 |
[C++ 1.6.2] Employee 클래스 (0) | 2022.08.18 |
[C++ 1.6.1] C++ 프로그램 만들기(직원 관리 시스템) (0) | 2022.08.18 |
[C++ 1.5.1] 표준 라이브러리 (0) | 2022.08.18 |