토파즈 배우기

데이터와 제어

학습 과제를 레코드와 배열에 저장하고, if와 match로 분류하며, 남은 시간을 더합니다.

여러 학습 과제를 저장하고, 각 과제의 상태와 남은 시간을 출력해 보세요. 완료 여부의 기본값을 찾고 if와 match가 출력을 고르는 과정을 따라갑니다.

먼저 값과 함수를 마치세요. 함수의 매개변수와 반환값, let mut로 선언한 누적 값을 다시 사용합니다.

과제 저장하고 나열하기

작업 폴더에 아래 코드를 data-control.tpz로 저장하세요.

TOPAZ
record 학습과제 {
    제목: string,
    분: int,
    완료: bool = false,
}

function 속도(과제: 학습과제) -> string {
    if 과제.완료 {
        return "done"
    }
    match 과제.분 {
        case 1..15 => "quick"
        case 16..30 => "focused"
        case _ => "deep"
    }
}

let 과제들: Array<학습과제> = [
    학습과제 { 제목: "Run first program", 분: 10, 완료: true },
    학습과제 { 제목: "Build application", 분: 25 },
]
let mut 남음 = 0
for 과제 in 과제들 {
    if !과제.완료 {
        남음 = 남음 + 과제.분
    }
    print("{과제.제목}: {속도(과제)}")
}
print("remaining: {남음} minutes")

같은 폴더에서 파일을 검사하고 실행하세요.

BASH
topaz check data-control.tpz
topaz run data-control.tpz

검사는 종료 코드 0으로 성공합니다. 프로그램은 배열 순서대로 과제를 출력한 뒤 남은 시간을 출력합니다.

출력
Run first program: done
Build application: focused
remaining: 25 minutes

필드와 기본값 찾기

학습과제는 제목, 소요 시간, 완료 여부를 하나의 레코드로 묶습니다. 이렇게 이름을 붙인 각 항목을 필드라고 합니다. 이 선언은 학습과제라는 별도 타입을 만듭니다.

완료의 기본값은 false입니다. 두 번째 과제는 이 필드를 생략했으므로 아직 끝나지 않은 과제입니다. 첫 번째 과제는 완료: true를 적었으므로 완료 상태입니다.

Array<학습과제>는 두 과제를 순서대로 저장합니다. 각 요소의 타입은 학습과제입니다. for는 배열 순서대로 반복하며 현재 요소를 과제라는 이름으로 사용합니다.

if와 match에서 출력까지 따라가기

반복문 안의 if !과제.완료는 끝나지 않은 과제의 시간을 남음에 더합니다. !는 참과 거짓을 뒤집습니다. 첫 번째 과제의 시간은 더하지 않고 두 번째 과제의 25분을 더합니다.

속도 안의 if 과제.완료는 첫 번째 과제에 대해 "done"을 반환합니다. 이 return으로 함수가 끝나므로 match까지 가지 않습니다. 두 번째 과제는 match에 도달해 소요 시간을 각 경우와 차례로 비교합니다.

끝나지 않은 과제의 소요 시간일치하는 경우반환할 문자열
1분부터 15분까지case 1..15"quick"
16분부터 30분까지case 16..30"focused"
그 밖의 정수case _"deep"

두 번째 과제는 25분이므로 속도가 "focused"를 반환합니다. 선택한 경우의 값이 match 표현식과 함수의 결과가 됩니다.

_ 패턴은 앞의 경우와 일치하지 않은 값을 처리합니다. 여기서는 0과 음수도 받아들입니다. 그런 입력에도 결과가 나오도록 이 경우를 유지하세요. 다음 실습에서는 과제를 만들기 전에 그런 시간을 거절합니다.

출력이 다르면 각 과제의 완료 여부와 소요 시간을 확인하세요. 완료한 과제는 소요 시간에 관계없이 done을 출력하고 합계에 시간을 더하지 않습니다.

컬렉션 고르기

프로그램에 필요한 동작컬렉션
순서를 유지하고 중복을 허용해 저장Array
키로 값을 조회Map
중복 없이 서로 다른 요소를 저장Set

직접 해보기

배열의 세 번째 요소로 학습과제 { 제목: "Review output", 분: 5, 완료: true }를 추가하세요. 새 출력 줄과 남은 시간을 예상한 뒤 파일을 검사하고 실행하세요.

정답 보기

Review output: done 줄이 추가됩니다. 정수 남음은 25이므로 마지막 줄은 여전히 remaining: 25 minutes입니다. 추가한 과제는 완료 상태여서 반복문이 시간을 더하지 않고, 속도는 match 전에 반환합니다.

다음 실습으로 이어가기

기본값 false를 찾고 두 과제가 서로 다른 문자열을 출력하는 이유를 설명할 수 있으면 다음으로 넘어가세요. 완료한 과제의 시간을 합계에서 제외하는 if도 찾아보세요.

실패와 리소스에서 잘못된 소요 시간을 처리해 보세요. 세부 규칙은 레코드와 명목 데이터, 패턴과 제어 흐름, 컬렉션과 컴프리헨션에서 찾을 수 있습니다.