지금까지 정리한 내용을 바탕으로 만들어 보는 첫 프로그램입니다. 학습 시 참고하고 있는 책에 나오는 예제로 간단한 직원 관리 프로그램입니다.
직원 관리 시스템
회사 직원 정보를 관리하는 프로그램은 구조가 유연하고 기능이 편리해야 하기에 객체지향 설계를 따릅니다. 프로그램에서 제공하는 기능은 다음과 같습니다.
- 직원 채용
- 직원 해고
- 직원 승진
- 직원 조회(과거, 현재)
이 프로그램은 크게 네 부분으로 이루어져 있습니다.
- Employee 클래스
- Database 클래스
- Interface 클래스
- Client code
이 프로그램에서 클래스 정의는 전부 헤더(.h)파일에 정의하고 구현 코드는 (.cpp)에 작성했습니다. 그리고 혹시 모를 이름의 중복을 피하기 위해 "Record"라는 네임스페이스(namespace)를 만들어 그 안에 포함시켰습니다.
Employee 클래스 정의
이 프로그램의 주요 기능인 채용, 해고, 승진, 조회기능을 갖고 있는 클래스입니다. 다음 코드는 Employee클래스의 전체 정의입니다.
#pragma once
#include <string>
using namespace std;
namespace Records
{
const int kDefaultStartingSalary = 3000000; //신입사원 초기 급여
class Employee
{
public:
Employee() = default; //기본생성자
Employee(const string& firstName, const string& lastName); //생성자
void promote(int raiseAmount = 1000000); //승진 시
void demote(int demeritAmount = 500000); //강등 시
void hire(); //직원 채용
void fire(); //직원 해고
void display() const; //직원 정보 출력
//게터와 세터
void setFirstName(const string& firstName);
const string& getFirstName() const;
void setLastName(const string& lastName);
const string& getLastName() const;
void setEmployeeNumber(int employeeNumber);
int getEmployeeNumber() const;
void setSalary(int newSalary);
int getSalary() const;
bool isHired() const;
private:
string m_sFirstName; //이름
string m_sLastName; //성
int m_nEmployeeNumber; //사원번호
int m_nSalary; //급여
bool m_bHired; //고용상태
};
}
신입사원 초기급여는 자주 변경되는 값이 아니기에 const로 클래스 외부에 정의했습니다.
const int kDefaultStartingSalary = 3000000;
클래스 내부에서는 기본 생성자 부분을 default로 정의하고, 성과 이름을 인수로 받는 생성자를 추가로 정의했습니다. 소멸자는 현재는 별다른 할 일이 없기 때문에 생략했습니다.
Employee() = default; //기본생성자
Employee(const string& firstName, const string& lastName); //생성자
직원 관리에 필요한 주요 기능인 승진, 강등, 채용, 해고 및 정보 출력 기능을 정의했습니다. promote()와 demote()는 이 메서드를 호출할 때 매개변수값을 빠뜨리면 자동으로 기본값을 사용하게 했습니다.
void promote(int raiseAmount = 1000000); //승진 시
void demote(int demeritAmount = 500000); //강등 시
void hire(); //직원 채용
void fire(); //직원 해고
void display() const; //직원 정보 출력
데이터 멤버는 외부에서 직접 수정할 수 없게 private로 선언했습니다. 이 값들은 게터와 세터를 통해서만 외부에서 접근할 수 있습니다.
private:
string m_sFirstName; //이름
string m_sLastName; //성
int m_nEmployeeNumber; //사원번호
int m_nSalary; //급여
bool m_bHired; //고용상태
세터함수 구현 시 배열이나 객체를 매개변수로 넘겨줄 때 복사가 일어나지 않도록 const 참조로 넘겨줍니다. string은 문자의 배열이므로 참조 형태로 넘겨주는 게 좋습니다. 그래서 string에 대한 세터함수는 매개변수에 const 참조를 사용했습니다.
void setFirstName(const string& firstName);
string에 대한 게터함수 또한 복사가 일어나지 않도록 참조형태로 리턴합니다. 그냥 참조 형태로 리턴하면 외부에서 값 변경이 가능하므로 const 참조형태로 리턴합니다. 추가적으로 멤버 변수가 변하지 않도록 함수 뒤에 const를 붙여 좀 더 안전성을 높였습니다.
const string& getFirstName() const;
일반 값 형식에 대한 게터 세터 구현은 참조가 아니어도 상관없습니다. 다만 게터 함수 구현 시에는 string에 대한 게터함수 구현과 마찬가지로 함수뒤에 const를 붙여서 멤버 변수 값이 변경되지 않도록 합니다.
void setEmployeeNumber(int employeeNumber);
int getEmployeeNumber() const;
void setSalary(int newSalary);
int getSalary() const;
bool isHired() const;
[참고]
1. 전문가를 위한 c++(개정4판) (저자 : 마크 그레고리 / 옮긴이 남기혁)
'Program Language > c++' 카테고리의 다른 글
C++ 기초(직원 관리 시스템 - 단위 테스트) (38) | 2023.02.07 |
---|---|
C++ 기초(직원 관리 시스템 - Employee 클래스 구현) (18) | 2023.02.02 |
C++ 기초(유니폼 초기화) (16) | 2023.01.27 |
c++ 기초(클래스 정의) (9) | 2023.01.25 |
c++ 기초(타입 추론 : auto & decltype) (5) | 2023.01.19 |
댓글