Menu
Coddy logo textTech

요약 - 직원 계층 구조

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 55번째.

challenge icon

챌린지

쉬움

이제 이 장에서 배운 모든 상속 개념을 하나로 결합하는 완전한 직원 계층 구조 시스템을 만들어 보겠습니다. 공통 속성을 공유하지만 특화된 동작을 갖는 다양한 직원 유형으로 회사 구조를 만들게 됩니다.

코드를 네 개의 파일로 구성합니다:

  • Employee.h: 모든 직원 유형이 상속받을 base Employee 클래스를 define합니다. 모든 직원은 이름, ID, base 급여를 가집니다. 다음을 포함합니다:
    • 이름(std::string), id(int), baseSalary(double)를 위한 protected member
    • 세 값을 모두 초기화하는 constructor
    • 다음을 출력하는 virtual displayInfo() 메서드: Employee: <name> (ID: <id>)
    • base 급여를 반환하는 virtual calculateSalary() 메서드
    • virtual destructor
  • Manager.h: Employee를 public 상속하는 Manager 클래스를 define합니다. Manager는 팀 규모에 따라 bonus를 받습니다:
    • private int teamSize member
    • 이름, id, base 급여, 팀 규모를 받는 constructor: 적절한 방식으로 base constructor를 chain합니다
    • 다음을 출력하도록 displayInfo()를 override합니다: Manager: <name> (ID: <id>) - Team of <teamSize>
    • 각 팀 member에 대해 500을 base 급여에 더한 값을 반환하도록 calculateSalary()를 override합니다
  • Developer.h: Employee를 public 상속하는 Developer 클래스를 define합니다. Developer는 전문 language와 skill bonus를 받습니다:
    • private std::string language member
    • 이름, id, base 급여, programming language를 받는 constructor
    • 다음을 출력하도록 displayInfo()를 override합니다: Developer: <name> (ID: <id>) - <language>
    • base 급여에 1000 skill bonus를 더한 값을 반환하도록 calculateSalary()를 override합니다
  • main.cpp: 여섯 개의 inputs를 읽습니다(각각 별도의 줄에 입력):
    1. Manager 이름
    2. Manager ID
    3. Manager base 급여
    4. Developer 이름
    5. Developer ID
    6. Developer base 급여

    팀 규모가 4인 Manager와 "C++"를 전문으로 하는 Developer를 Create합니다. 두 객체에 대한 포인터를 Employee* 포인터의 array에 저장합니다. array를 Loop하여 각 employee에 대해 displayInfo()를 호출하고 다음 형식으로 calculated salary를 출력합니다:

    <displayInfo output>
    Salary: $<calculated salary>

    employee 사이에 blank line을 출력합니다. 모든 employee를 출력한 after, dynamically allocated 객체를 올바르게 delete합니다.

예를 들어 inputs가 Sarah, 101, 5000, Mike, 102, 4500인 경우:

Manager: Sarah (ID: 101) - Team of 4
Salary: $7000

Developer: Mike (ID: 102) - C++
Salary: $5500

이 challenge는 실제 동작하는 polymorphism을 보여 줍니다. base class 포인터를 통해 virtual 메서드를 호출하면 올바른 derived class 구현이 호출됩니다. override keyword를 사용하고, 올바른 cleanup을 위해 base class에 virtual destructor를 include해야 한다는 점을 기억하세요.

직접 해보기

#include <iostream>
#include <string>
#include "Employee.h"
#include "Manager.h"
#include "Developer.h"

using namespace std;

int main() {
    // Manager 입력 읽기
    string managerName;
    int managerId;
    double managerSalary;
    
    getline(cin, managerName);
    cin >> managerId;
    cin >> managerSalary;
    cin.ignore();
    
    // Developer 입력 읽기
    string developerName;
    int developerId;
    double developerSalary;
    
    getline(cin, developerName);
    cin >> developerId;
    cin >> developerSalary;
    
    // TODO: 팀 크기가 4인 Manager 생성
    // TODO: "C++"를 전문으로 하는 Developer 생성
    
    // TODO: 두 직원을 저장할 Employee* 포인터 배열 생성
    
    // TODO: 배열을 순회하며 각 직원에 대해:
    //   - displayInfo() 호출
    //   - 출력: Salary: $<계산된 급여>
    //   - 직원 사이에 빈 줄 출력 (마지막 직원 뒤에는 출력하지 않음)
    
    // TODO: 동적으로 할당된 객체 삭제
    
    return 0;
}

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러