Menu
Coddy logo textTech

요약 - 안전한 나눗셈

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 44번째.

challenge icon

챌린지

쉬움

여러 개의 사용자 정의 에러 타입과 적절한 에러 처리를 구현하여 안전한 나눗셈을 수행하는 포괄적인 수학 계산기를 구축하세요. 이 챌린지는 사용자 정의 에러 타입, 에러 래핑(error wrapping), 그리고 에러 체크를 결합하여 다양한 수학 연산 실패를 우아하게 처리하는 견고한 시스템을 만드는 것을 목표로 합니다.

두 개의 입력을 받게 됩니다:

  • "operation,num1,num2,precision" 형식의 연산 세부 정보를 포함하는 문자열 (예: "divide,10,0,2")
  • "calculator_name,mode" 형식의 계산기 설정을 포함하는 문자열 (예: "ScientificCalc,strict")

수행해야 할 작업은 다음과 같습니다:

  1. 두 개의 사용자 정의 에러 타입을 생성하세요:
    • Dividend (float64)와 Divisor (float64) 필드를 가진 DivisionError 구조체
    • Field (string)와 Value (float64) 필드를 가진 ValidationError 구조체
  2. DivisionError에 대해 "division error: cannot divide [dividend] by [divisor]"를 반환하는 Error() string 메서드를 구현하세요.
  3. ValidationError에 대해 "validation error: invalid [field] value [value]"를 반환하는 Error() string 메서드를 구현하세요.
  4. 첫 번째 입력을 쉼표로 분리하여 operation, num1, num2, precision을 파싱하세요.
  5. 두 번째 입력을 쉼표로 분리하여 calculator name과 mode를 파싱하세요.
  6. 문자열 숫자를 float64로, precision을 int로 변환하세요.
  7. 두 개의 float64 매개변수를 받고 (float64, error)를 반환하는 safeDivide 함수를 만드세요:
    • divisor가 0이면, 0과 dividend 및 divisor 값을 포함한 DivisionError를 반환합니다.
    • dividend가 음수이고 mode가 "strict"이면, 0과 field "dividend" 및 dividend 값을 포함한 ValidationError를 반환합니다.
    • divisor가 음수이고 mode가 "strict"이면, 0과 field "divisor" 및 divisor 값을 포함한 ValidationError를 반환합니다.
    • 그렇지 않으면, 나눗셈 결과와 nil을 반환합니다.
  8. safeDivide 결과를 래핑하는 performCalculation 함수를 만드세요:
    • safeDivide가 에러를 반환하면, "calculation failed in [calculator_name]: %w"로 래핑합니다.
    • 성공하면, 결과와 nil을 반환합니다.
  9. performCalculation을 호출하고 결과를 처리하세요:
    • 에러가 없으면: "Calculation successful: [result_formatted_to_precision_decimal_places]"를 출력합니다.
    • 에러가 있으면: "Calculation failed: [error_message]"를 출력합니다.
  10. 래핑된 에러에서 특정 에러 타입을 확인하기 위해 errors.As를 사용하세요:
    • "Checking for division error: [true/false]"를 출력합니다.
    • "Checking for validation error: [true/false]"를 출력합니다.
  11. DivisionError가 발견되면 세부 정보를 출력하세요:
    • "Division Error Details:"
    • "Dividend: [dividend]"
    • "Divisor: [divisor]"
  12. ValidationError가 발견되면 세부 정보를 출력하세요:
    • "Validation Error Details:"
    • "Field: [field]"
    • "Value: [value]"
  13. 최종 요약을 표시하세요:
    • "Calculator Summary:"
    • "Name: [calculator_name]"
    • "Mode: [mode]"
    • "Operation: [operation]"
    • "Input: [num1] [operation_symbol] [num2]" (여기서 operation_symbol은 나눗셈의 경우 "/"입니다)
    • "Precision: [precision] decimal places"
    • "Status: [Success/Failed]"

입력 문자열을 쉼표로 분리하기 위해 strings 패키지를, 문자열을 숫자로 변환하기 위해 strconv 패키지를, errors.As를 위해 errors 패키지를, 그리고 에러 래핑 및 포맷팅을 위해 fmt 패키지를 사용하세요. 이 챌린지는 사용자 정의 에러 타입, 에러 래핑, 그리고 적절한 에러 체크가 어떻게 함께 작동하여 다양한 유형의 실패에 대한 상세 정보를 제공하는 견고한 에러 처리 시스템을 만드는지 보여줍니다.

직접 해보기

package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// 입력 읽기
	var operationInput string
	var settingsInput string
	fmt.Scanln(&operationInput)
	fmt.Scanln(&settingsInput)
	
	// 연산 입력 파싱 (operation,num1,num2,precision)
	operationParts := strings.Split(operationInput, ",")
	operation := operationParts[0]
	num1, _ := strconv.ParseFloat(operationParts[1], 64)
	num2, _ := strconv.ParseFloat(operationParts[2], 64)
	precision, _ := strconv.Atoi(operationParts[3])
	
	// 설정 입력 파싱 (calculator_name,mode)
	settingsParts := strings.Split(settingsInput, ",")
	calculatorName := settingsParts[0]
	mode := settingsParts[1]
	
	// TODO: 아래에 코드를 작성하세요
	// 1. Error() 메서드를 포함한 DivisionError 및 ValidationError 구조체 생성
	// 2. safeDivide 함수 구현
	// 3. performCalculation 함수 구현
	// 4. performCalculation 호출 및 결과 처리
	// 5. errors.As를 사용하여 특정 오류 유형 확인
	// 6. 오류가 발견되면 오류 세부 정보 출력
	// 7. 최종 요약 표시
	
}

로직 & 흐름의 모든 레슨