Menu
Coddy logo textTech

요약 - 직원 계층 구조

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

challenge icon

챌린지

쉬움

컴포지션(composition)이 어떻게 실제 조직 구조를 우아하게 모델링하는지 보여주는 회사의 직원 계층 시스템을 구축해 보겠습니다. 특수화된 역할이 자신만의 고유한 동작으로 확장할 수 있는 기본 직원 타입을 만들 것입니다.

코드는 세 개의 파일로 구성됩니다:

  • employee.go: ID, Name, BaseSalary (float64) 필드를 포함하는 Employee 구조체로 기초를 만듭니다. 다음 두 가지 메서드를 추가하세요:
    • Info() string: [ID] [Name] 형식을 반환합니다.
    • CalculateBonus() float64: 기본 급여의 10%를 반환합니다.
  • roles.go: Employee를 임베딩하는 두 가지 특수 직원 타입을 만듭니다:
    • Manager: TeamSize 필드 (int)를 가집니다. 매니저는 더 높은 보너스를 받습니다: 기본 급여의 20%에 팀원 한 명당 $100를 더합니다. 이를 구현하기 위해 CalculateBonus 메서드를 섀도잉(shadow)하세요.
    • Developer: Language 필드 (string)를 가집니다. 개발자는 표준 보너스를 유지하지만, Info 메서드를 섀도잉하여 프로그래밍 언어를 추가합니다: [ID] [Name] ([Language])
  • main.go: 입력에서 직원 상세 정보를 읽고, Manager 한 명과 Developer 한 명을 생성한 다음, 각 직원의 정보와 계산된 보너스를 표시합니다.

다음 입력이 제공됩니다:

  • 1행: 매니저 ID
  • 2행: 매니저 이름
  • 3행: 매니저 기본 급여 (float64)
  • 4행: 매니저 팀 규모 (integer)
  • 5행: 개발자 ID
  • 6행: 개발자 이름
  • 7행: 개발자 기본 급여 (float64)
  • 8행: 개발자 프로그래밍 언어

각 직원에 대해, 정보와 그 다음 줄에 보너스를 출력하세요. 보너스는 소수점 둘째 자리까지 형식을 맞춥니다.

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

M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00

매니저의 보너스 계산(80000의 20% + 5×100 = 16500)이 개발자의 표준 10% 보너스와 어떻게 다른지, 그리고 개발자가 자신의 정보 표시 방식을 어떻게 커스터마이징하는지 확인해 보세요. 두 타입 모두 여전히 임베딩된 Employee 필드에 접근할 수 있으며 필요할 때 원래 메서드를 호출할 수 있습니다.

직접 해보기

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: 컴포지션(composition) 사용 - Manager는 Employee를 임베드함

	// TODO: 읽어온 값들을 사용하여 Developer 생성하기
	// Hint: 컴포지션(composition) 사용 - Developer는 Employee를 임베드함

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

	// TODO: developer 정보와 보너스 출력 (보너스는 소수점 둘째 자리까지 형식화)
}

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