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

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

by 토담이아빠 2023. 1. 31.

직원 관리 시스템 - Employee 클래스 정의

 

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


직원 관리 시스템

 

회사 직원 정보를 관리하는 프로그램은 구조가 유연하고 기능이 편리해야 하기에 객체지향 설계를 따릅니다. 프로그램에서 제공하는 기능은 다음과 같습니다. 

 

  1. 직원 채용
  2. 직원 해고
  3. 직원 승진
  4. 직원 조회(과거, 현재)

 

이 프로그램은 크게 네 부분으로 이루어져 있습니다.

 

  1. Employee 클래스
  2. Database 클래스
  3. Interface 클래스
  4. 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)  (저자 : 마크 그레고리 / 옮긴이 남기혁)

댓글