트랙
/
F#
F#
/
연습 문제
/
비밀번호 검사기
비밀번호 검사기

비밀번호 검사기

학습 연습 문제

소개

Result 타입을 사용하면 함수가 다음 정보를 모두 담은 하나의 값을 반환할 수 있어요:

  • 연산이 성공했는지 실패했는지
  • 성공했다면, 연산의 결과 값
  • 실패했다면, 실패한 이유

사용법

Result 타입은 두 가지 타입을 담는 제네릭 타입이에요:

  • 연산이 성공했을 때의 결과 값 타입
  • 실패했을 때의 오류 타입

Result 타입은 다음과 같은 경우를 가질 수 있는 [구별된 공용체][discriminated-union]이기도 해요:

  • Ok <value>: 성공한 결과를 나타내요
  • Error <reason>: 실패를 나타내요

다음 함수는 Result 값을 만드는 방법을 보여줘요:

let validateName (name: string) : Result<string, string> = 
    match name with
    | null -> Error "Name not found."
    | "" -> Error "Name is empty."
    | _ -> Ok name

이 예제에서 Ok 값은 문자열(주어진 이름)이고, Error 값도 문자열(오류의 원인을 사람이 읽을 수 있는 형태로 나타낸 것)이에요.

Result 값의 내용 읽기

다음 타입 정의와 함수 시그니처를 살펴봐요:

type FileOpenError = 
| NotFound
| AccessDenied
| FileLocked

let openFile (filename: string) : Result<int, FileOpenError> =

openFile 함수를 호출하는 코드는 다음 예제처럼 패턴 매칭을 사용해 성공과 실패 경우를 처리할 수 있어요:

match openFile(filename) with
| Ok handle -> doSomethingWithFile(handle)
| Error NotFound -> printfn $"Error: file {filename} was not found."
| Error AccessDenied -> printfn $"Error: you do not have permission to open the file {filename}."
| Error FileLocked -> printfn $"Error: file {filename} is already in use."

지침

이번 과제는 비밀번호 검사기를 만드는 거예요. 비밀번호 검사기는 사용자가 제안한 비밀번호가, 해당 리소스에 대한 접근을 관리하는 조직이 정한 일련의 요구 사항을 충족하는지 검증해요.

이 연습 문제에서 비밀번호 요구 사항은 다음과 같아요.

  • 12자 이상이어야 해요
  • 대문자가 적어도 하나 있어야 해요
  • 소문자가 적어도 하나 있어야 해요
  • 숫자가 적어도 하나 있어야 해요
  • !@#$%^&* 집합에 속하는 기호가 적어도 하나 있어야 해요

풀이에서는 Result를 사용해 성공 또는 실패 상태를 담아야 해요. 성공한 경우, Result는 검증된 비밀번호를 문자열로 담아야 해요. 실패한 경우, Result는 위반한 규칙을 담아야 해요.

Note

이 연습 문제의 비밀번호 검사기는 아주 단순해요. 규칙이 하나 위반된 경우에만 그 사실을 알려줘요. 다음 연습 문제에서는 여러 규칙이 동시에 위반된 경우도 알려줄 수 있는, 좀 더 현실적인 비밀번호 검사기를 살펴봐요.

1. checkPassword 함수 구현하기

checkPassword 함수는 주어진 비밀번호가 앞에서 설명한 규칙을 충족하는지 검사해요. 실패하면, 결과 값 안에 PasswordRule 값 중 하나를 담아서 어떤 규칙을 위반했는지 알려줘요.

checkPassword "abcdefghij5#"
// => Error MissingUppercaseLetter

2. ``getStatusMessage` 함수 구현하기

getStatusMessage 함수는 checkPassword가 반환한 결과의 의미를 사람이 읽을 수 있는 메시지로 담은 문자열을 반환해요.

getStatusMessage (Error MissingDigit)
// => "Error: does not have at least one digit"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
F# Exercism

비밀번호 검사기 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 F# 트랙을 개념 18개연습 문제 148개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.