Menu
Coddy logo textTech

요약 - 직원 계층 구조

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 40번째.

challenge icon

챌린지

쉬움

실제 조직 구조를 composition으로 우아하게 모델링하는 방법을 보여 주는 회사의 employee 계층 시스템을 만들어 봅시다. 특수 역할이 고유한 동작을 추가할 수 있는 base employee type을 만들게 됩니다.

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

  • employee.go: ID, Name, BaseSalary (float64) fields를 포함하는 Employee struct로 기반을 만듭니다. 다음 두 method를 추가합니다:
    • Info() string: [ID] [Name]을 반환합니다.
    • CalculateBonus() float64: base salary의 10%를 반환합니다.
  • roles.go: Employee를 embedded하는 두 가지 특수 employee type을 만듭니다:
    • Manager: TeamSize field (int)를 가지며, manager는 더 높은 bonus를 받습니다. 즉, base salary의 20%에 team member당 $100을 더합니다. 이를 구현하도록 CalculateBonus method를 shadow합니다.
    • Developer: Language field (string)를 가지며, 표준 bonus는 유지하지만 Info method를 shadow하여 programming language를 추가합니다: [ID] [Name] ([Language])
  • main.go: input에서 employee details를 읽고, Manager 하나와 Developer 하나를 만든 다음 각 employee의 info와 계산된 bonus를 표시합니다.

다음 input이 제공됩니다:

  • 1번째 줄: Manager ID
  • 2번째 줄: Manager name
  • 3번째 줄: Manager base salary (float64)
  • 4번째 줄: Manager team size (정수)
  • 5번째 줄: Developer ID
  • 6번째 줄: Developer name
  • 7번째 줄: Developer base salary (float64)
  • 8번째 줄: Developer programming language

각 employee에 대해 info를 출력하고, 다음 줄에 bonus를 출력합니다. bonus는 소수점 이하 두 자리로 형식 지정합니다.

예를 들어 M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000, Go가 주어지면 출력은 다음과 같아야 합니다:

M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00

Manager의 bonus calculation(20% of 80000 + 5×100 = 16500)이 Developer의 표준 10% bonus와 어떻게 다른지 확인해 보세요. 한편 Developer는 info가 표시되는 방식을 사용자 지정합니다. 두 type 모두 embedded된 Employee fields에 access할 수 있으며, 필요할 때 original method를 호출할 수 있습니다.

직접 해보기

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Manager 세부 정보 읽기
	managerID, _ := reader.ReadString('\n')
	managerID = strings.TrimSpace(managerID)

	managerName, _ := reader.ReadString('\n')
	managerName = strings.TrimSpace(managerName)

	managerSalaryStr, _ := reader.ReadString('\n')
	managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)

	teamSizeStr, _ := reader.ReadString('\n')
	teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))

	// Developer 세부 정보 읽기
	devID, _ := reader.ReadString('\n')
	devID = strings.TrimSpace(devID)

	devName, _ := reader.ReadString('\n')
	devName = strings.TrimSpace(devName)

	devSalaryStr, _ := reader.ReadString('\n')
	devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)

	devLanguage, _ := reader.ReadString('\n')
	devLanguage = strings.TrimSpace(devLanguage)

	// TODO: 읽은 값을 사용하여 Manager 생성
	// Hint: 구성 사용 - Manager가 Employee를 임베드함

	// TODO: 읽은 값을 사용하여 Developer 생성
	// Hint: 구성 사용 - Developer가 Employee를 임베드함

	// TODO: manager 정보와 보너스 출력 (보너스는 소수점 2자리로 형식 지정)
	// 형식 지정을 위해 "%.2f"와 함께 fmt.Printf 사용

	// TODO: developer 정보와 보너스 출력 (보너스는 소수점 2자리로 형식 지정)
}

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

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