간단한 숫자 검증기
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 67번째.
챌린지
쉬움인터페이스가 동작 계약을 정의하는 방식과 사용자 정의 에러가 유효성 검사 실패 시 의미 있는 피드백을 제공하는 방식을 보여주는 숫자 유효성 검사 시스템을 만드세요. 이 챌린지는 인터페이스를 생성하고, 이를 사용자 정의 타입으로 구현하며, 유효성 검사 에러를 적절하게 처리하는 능력을 테스트합니다.
두 개의 입력을 받게 됩니다:
- 쉼표로 구분된 유효성 검사 대상 숫자들을 포함하는 문자열 (예:
"45,150,25,200,75") "min:max"형식의 유효성 검사 범위를 포함하는 문자열 (예:"1:100")
당신의 과제는 다음과 같습니다:
- 단일 메서드
Validate() error를 가진Validator인터페이스를 정의합니다. Value(int)와Message(string)라는 두 개의 필드를 가진ValidationError구조체라는 사용자 정의 에러 타입을 생성합니다.ValidationError에 대해"Validation failed: [message] (value: [value])"형식의 메시지를 반환하는Error() string메서드를 구현합니다.Number(int),Min(int),Max(int)라는 세 개의 필드를 가진NumberValidator구조체를 생성합니다.- 다음과 같이 동작하는
NumberValidator의Validate() error메서드를 구현합니다:- 숫자가 유효 범위 내에 있으면(경계값 포함)
nil을 반환합니다. - 숫자가 최솟값보다 작으면
"number below minimum range"메시지와 함께ValidationError를 반환합니다. - 숫자가 최댓값보다 크면
"number above maximum range"메시지와 함께ValidationError를 반환합니다.
- 숫자가 유효 범위 내에 있으면(경계값 포함)
- 첫 번째 입력을 쉼표로 분리하여 개별 숫자 문자열을 얻도록 파싱합니다.
- 두 번째 입력을 콜론으로 분리하여 최솟값과 최댓값을 추출하도록 파싱합니다.
strconv패키지를 사용하여 모든 문자열 값을 정수로 변환합니다.- 유효성 검사 헤더를 표시합니다:
"=== NUMBER VALIDATION SYSTEM ===" - 유효성 검사 매개변수를 표시합니다:
"Validating numbers in range [min] to [max]" - 각 숫자에 대해:
- 숫자와 범위 값을 사용하여
NumberValidator인스턴스를 생성합니다. - 검사기(validator)에서
Validate()메서드를 호출합니다. - 유효성 검사를 통과하면(에러가
nil인 경우),"✓ [number] is valid"를 표시합니다. - 유효성 검사에 실패하면(에러가
nil이 아닌 경우),"✗ [error_message]"를 표시합니다.
- 숫자와 범위 값을 사용하여
- 유효성 검사 요약을 표시합니다:
"=== VALIDATION SUMMARY ===""Total numbers checked: [total_count]""Valid numbers: [valid_count]""Invalid numbers: [invalid_count]"
- 완료 메시지를 표시합니다:
"Number validation completed successfully"
입력 문자열을 분리하기 위해 strings 패키지를, 문자열을 정수로 변환하기 위해 strconv 패키지를, 그리고 형식화된 출력을 위해 fmt 패키지를 사용하세요. 이 챌린지는 인터페이스를 사용하여 유연한 유효성 검사 시스템을 구축하는 동시에 사용자 정의 에러 타입을 통해 상세한 에러 정보를 제공하는 방법을 보여줍니다.
직접 해보기
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// 입력 읽기
var numbersInput string
var rangeInput string
fmt.Scanln(&numbersInput)
fmt.Scanln(&rangeInput)
// 입력 파싱
numberStrings := strings.Split(numbersInput, ",")
rangeParts := strings.Split(rangeInput, ":")
// 범위 값을 정수로 변환
min, _ := strconv.Atoi(rangeParts[0])
max, _ := strconv.Atoi(rangeParts[1])
// TODO: 아래에 코드를 작성하세요
// 1. Validator 인터페이스 정의
// 2. ValidationError 구조체 생성 및 Error() 메서드 구현
// 3. NumberValidator 구조체 생성 및 Validate() 메서드 구현
// 4. 각 숫자를 처리하고 유효성 검사 수행
// 5. 결과 및 요약 표시
// 유효성 검사 헤더 표시
fmt.Println("=== NUMBER VALIDATION SYSTEM ===")
fmt.Printf("Validating numbers in range %d to %d\n", min, max)
// 여기서 각 숫자 처리
// 유효성 검사 요약 표시
fmt.Println("=== VALIDATION SUMMARY ===")
// 여기에 요약 출력 추가
fmt.Println("Number validation completed successfully")
}