요약 - 직원 계층 구조
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 40번째.
챌린지
쉬움컴포지션(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 정보와 보너스 출력 (보너스는 소수점 둘째 자리까지 형식화)
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서