요약 - 직원 계층 구조
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 40번째.
챌린지
쉬움실제 조직 구조를 composition으로 우아하게 모델링하는 방법을 보여 주는 회사의 employee 계층 시스템을 만들어 봅시다. 특수 역할이 고유한 동작을 추가할 수 있는 base employee type을 만들게 됩니다.
코드를 세 개의 파일로 구성합니다:
employee.go:ID,Name,BaseSalary(float64) fields를 포함하는Employeestruct로 기반을 만듭니다. 다음 두 method를 추가합니다:Info() string:[ID] [Name]을 반환합니다.CalculateBonus() float64: base salary의 10%를 반환합니다.
roles.go:Employee를 embedded하는 두 가지 특수 employee type을 만듭니다:Manager:TeamSizefield (int)를 가지며, manager는 더 높은 bonus를 받습니다. 즉, base salary의 20%에 team member당 $100을 더합니다. 이를 구현하도록CalculateBonusmethod를 shadow합니다.Developer:Languagefield (string)를 가지며, 표준 bonus는 유지하지만Infomethod를 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.00Manager의 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자리로 형식 지정)
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러