본문 바로가기
Program Language/c++

C++ 기초(직원 관리 시스템 - Database 클래스)

by 토담이아빠 2023. 2. 9.

Database 클래스

 

직원 관리 시스템에서 직원의 정보는 별도의 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++ 기초(직원 관리 시스템 - 단위 테스트)

 

C++ 기초(직원 관리 시스템 - 단위 테스트)

클래스 단위로 프로그램을 작성할 때 각각의 클래스마다 테스트 코드도 함께 작성하면 좋습니다. 이번 포스팅에서는 Employee 클래스에 대한 간단한 테스트 코드를 작성하는 방법과 좀 더 체계적

todamfather.tistory.com


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 클래스 정의)

 

c++ 기초(직원 관리 시스템 - Employee 클래스 정의)

지금까지 정리한 내용을 바탕으로 만들어 보는 첫 프로그램입니다. 학습 시 참고하고 있는 책에 나오는 예제로 간단한 직원 관리 프로그램입니다. 직원 관리 시스템 회사 직원 정보를 관리하는

todamfather.tistory.com

2023.02.02 - [프로그래밍/c++] - C++ 기초(직원 관리 시스템 - Employee 클래스 구현)

 

C++ 기초(직원 관리 시스템 - Employee 클래스 구현)

이번 포스팅에서는 Employee 클래스의 정의에 이어 구현 부분을 정리했습니다.(정의 부분은 아래 링크를 참고하세요) [참고 : Employee 정의] 2023.01.31 - [프로그래밍/c++] - c++ 기초(직원 관리 시스템 - Em

todamfather.tistory.com

 

댓글