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

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

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

Employee 클래스 구현


이번 포스팅에서는 Employee 클래스의 정의에 이어 구현 부분을 정리했습니다.(정의 부분은 아래 링크를 참고하세요)


[참고 : Employee 정의]
2023.01.31 - [프로그래밍/c++] - c++ 기초(직원 관리 시스템 - Employee 클래스 정의)

 

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

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

todamfather.tistory.com

 

Employee 클래스 구현


맨 처음 생성자 부분부터 살펴보겠습니다. 초기화 부분은 생성자 이니셜라이저를 사용하였습니다.
(생성자 이니셜라이저 부분은 [클래스 정의] 포스팅의 "생성자와 소멸자"부분을 참고하시기 바랍니다.)


[참고]
2023.01.25 - [프로그래밍/c++] - c++ 기초(클래스 정의)

 

c++ 기초(클래스 정의)

C++ 이 C구분되는 중요한 특징이 바로 객체지향 언어라는 점입니다. 객체지향 프로그래밍(Object-Oriented Programming)은 C와 같은 절차형 프로그래밍에 비해 코드 작성이 좀 더 독특합니다. 코드 표현에

todamfather.tistory.com


맨 처음 성과 이름을 매개변수로 받아 해당 멤버변수를 초기화합니다. 그리고 직원 번호는 -1로, 급여는 초기급여값으로 지정했으며, 채용되지 않은 상태(false)로 설정했습니다.


Employee::Employee(const string& firstName, const string& lastName)
    : m_sFirstName(firstName)
    , m_sLastName(lastName)
    , m_nEmployeeNumber(-1)
    , m_nSalary(kDefaultStartingSalary)
    , m_bHired(false)
{
}

promote()와 demote()는 단순히 인수로 전달받은 값을 각각의 의미에 맞게 setSalary()에 넘겨주기만 합니다. 정의 시 매개변수에 default값을 할당해 주었던 부분은 구현 시에는 사라집니다. 이런 방식은 선언(정의)하는 코드에만 지정할 수 있습니다.


[선언 부분]
void promote(int raiseAmount = 1000000); //승진 시
void demote(int demeritAmount = 500000); //강등 시

[구현 부분]
void promote(int raiseAmount) //1000000을 할당하는 부분이 사라짐
{
	setSalary(getSalary() + raiseAmount); //현재의 월급을 불러와서 raiseAmount만큼 더한다
}

void promote(int demeritAmount) //500000을 할당하는 부분이 사라짐
{
	setSalary(getSalary() - demeritAmount); //현재의 월급을 불러와서 demeritAmount만큼 뺀다
}

hire()와 fire()는 고용 상태를 결정하는 메서드입니다. 고용 시 m_hired는 true값이 되고, 해고 시에는 false로 바뀝니다.


void Employee::hire()
{
    m_bHired = true;                // 직원 고용 : 고용된 상태로 바뀐다
}

void Employee::fire()              
{
    m_bHired = false;               // 직원이 해고 : 해고된 상태로 바뀐다
}

display() 메서드는 현재 직원에 대한 정보를 콘솔 화면에 출력합니다. 동일 클래스 내에서 멤버 함수는 멤버 변수에 직접 접근할 수 있습니다. 예를 들어 m_nSalary값을 불러올 때 getSalary() 메서드를 쓰지 않고 m_nSalary를 써도 됩니다. 하지만 이에 대한 게터/세터가 정의 되어 있으면 같은 클래스 안이라도 이를 활용하는 것이 스타일 측면에서 바람직합니다.


void Employee::display() const
{
    cout << "사원: " << getLastName() << ", " << getFirstName() << endl;
    cout << "-----------------------------" << endl;
    cout << "재직 상태 : " << (isHired() ? "재직 중" : "퇴 사") << endl;
    cout << "사원 번호: " << getEmployeeNumber() << endl;
    cout << "급여(월): " << getSalary() << "원" << endl;
    cout << endl;
}

나머지 게터/세터의 구현에 대한 언급은 생략하겠습니다. 이에 대한 확인은 아래 전체코드를 참고하세요.


#include "stdafx.h"
#include <iostream>
#include "Employee.h"


namespace Records
{
	Employee::Employee(const string& firstName, const string& lastName)
		: m_sFirstName(firstName)
		, m_sLastName(lastName)
		, m_nEmployeeNumber(-1)
		, m_nSalary(kDefaultStartingSalary)
		, m_bHired(false)
	{
	}

	void Employee::promote(int raiseAmount)
	{
		setSalary(getSalary() + raiseAmount); //현재의 월급을 불러와서 raiseAmount만큼 더한다
	}

	void Employee::demote(int demeritAmount)
	{
		setSalary(getSalary() - demeritAmount); //현재의 월급을 불러와서 demeritAmount만큼 뺀다
	}

	void Employee::hire()
	{
		m_bHired = true;                // 직원 고용 : 고용된 상태로 바뀐다
	}

	void Employee::fire()              
	{
		m_bHired = false;               // 직원이 해고 : 해고된 상태로 바뀐다
	}

	void Employee::display() const
	{
		cout << "사원: " << getLastName() << ", " << getFirstName() << endl;
		cout << "-----------------------------" << endl;
		cout << "재직 상태 : " << (isHired() ? "재직 중" : "퇴 사") << endl;
		cout << "사원 번호: " << getEmployeeNumber() << endl;
		cout << "급여(월): " << getSalary() << "원" << endl;
		cout << endl;
	}

	void Employee::setFirstName(const string& firstName)
	{
		m_sFirstName = firstName;
	}
	const string& Employee::getFirstName() const
	{
		return m_sFirstName;
	}

	void Employee::setLastName(const string& lastName)
	{
		m_sLastName = lastName;
	}

	const string& Employee::getLastName() const
	{
		return m_sLastName;
	}

	void Employee::setEmployeeNumber(int employeeNumber)
	{
		m_nEmployeeNumber = employeeNumber;
	}
	int Employee::getEmployeeNumber() const
	{
		return m_nEmployeeNumber;
	}

	void Employee::setSalary(int newSalary)
	{
		m_nSalary = newSalary;
	}
	int Employee::getSalary() const
	{
		return m_nSalary;
	}

	bool Employee::isHired() const
	{
		return m_bHired;
	}

}

클래스 정의 부분이 namespace Records {...} 안에서 작성되었기 때문에 구현 부분도 반드시 동일한 네임스페이스 안에서 작성되어야 합니다. 네임스페스 부분은 아래 링크를 참조하세요


[참고 : 네임스페이스]
2022.12.22 - [프로그래밍/c++] - c++ 기초(namespace)

 

c++ 기초(namespace)

이글은 "전문가를 위한 c++(개정4판)"을 학습한 내용을 직접 실습해보며 정리한 Review용 글입니다. 네임스페이스(namespace)는 코드에서 동일이름이 서로 충돌하는 문제를 해결하기 위해 나온 개념입

todamfather.tistory.com


[참고]
1. 전문가를 위한 c++(개정4) (저자 : 마크 그레고리 / 옮긴이 남기혁)

댓글