이번 포스팅에서는 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판) (저자 : 마크 그레고리 / 옮긴이 남기혁)
'Program Language > c++' 카테고리의 다른 글
C++ 기초(직원 관리 시스템 - Database 클래스) (19) | 2023.02.09 |
---|---|
C++ 기초(직원 관리 시스템 - 단위 테스트) (38) | 2023.02.07 |
c++ 기초(직원 관리 시스템 - Employee 클래스 정의) (12) | 2023.01.31 |
C++ 기초(유니폼 초기화) (16) | 2023.01.27 |
c++ 기초(클래스 정의) (9) | 2023.01.25 |
댓글