학습 결과: 소규모 도메인을 레코드와 컬렉션으로 모델링합니다. if, match, for가 각각 처리하는 조건 유형에 맞춰 제어 구문을 선택합니다.
선행 학습: 값과 함수 과정을 완료해야 합니다. 바인딩·타입 표기·매개변수·함수 반환값에 대한 이해가 필요합니다.
작업마다 일정한 모양 주기
data-control.tpz 파일을 생성하세요.
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")동일한 2단계 절차로 실행합니다.
topaz check data-control.tpz
topaz run data-control.tpz실행 결과는 다음과 같습니다.
Run first program: done
Build application: focused
remaining: 25 minutes세 가지 결정 따라가기
record는 이름이 붙은 필드의 집합으로 단일 도메인 값의 종류와 속성을 정의하는 명목 데이터 구문입니다. 개별 변수를 나열하거나 정해지지 않은 구조를 사용하는 대신, 도메인의 속성을 묶어 일정한 데이터 모양을 표현하려고 선택했습니다. 예제 코드의 record 학습과제 { 제목: string, 분: int, 완료: bool = false } 부분이 이 구문에 해당하며, 완료 필드의 기본값을 false로 설정했기 때문에 두 번째 생성자 호출인 학습과제 { 제목: "Build application", 분: 25 }에서는 이 필드를 생략할 수 있습니다.
Array는 동일한 타입의 요소를 순서대로 담아 관리하는 컬렉션 구문입니다. 키를 통한 빠른 조회나 중복 없는 집합 대신, 데이터 항목의 입력 순서를 보존하며 순차 접근을 수행해야 하므로 Array를 골랐습니다. 예제 코드에서 let 과제들: Array<학습과제> = [...] 및 대괄호 안에 두 레코드 항목을 담아 초기화한 부분이 이에 해당합니다.
record와 Array가 다루고자 하는 데이터의 모양을 정의하는 구문이라면, 뒤이어 등장하는 for·if·match는 그 데이터를 바탕으로 실행 방향을 결정하는 흐름의 제어 구문입니다. 성격이 다른 두 종류의 구문을 연결하여 데이터 구조화와 제어 로직을 함께 완성합니다.
for는 컬렉션에 담긴 요소들을 순서대로 하나씩 꺼내어 본문을 반복 실행하는 제어 구문입니다. 인덱스 변수를 다루는 수동 반복 대신, 배열 내부 항목을 빠짐없이 순차적으로 다루기 위해 간결한 요소를 다루는 반복 형태를 사용했습니다. 예제 코드의 for 과제 in 과제들 { ... } 부분이 이에 해당하며, 과제들 배열에 담긴 첫 항목부터 끝 항목까지 순서대로 꺼내어 내부 본문을 실행합니다.
if는 주어진 조건식의 참 또는 거짓 여부를 평가하여 실행 경로를 나누는 제어 구문입니다. 다중 범위를 비교하거나 복잡한 패턴을 일치시키는 대신, 단일 참·거짓 조건이나 조건을 만족할 때 결과를 조기 반환하기 위해 이 형태를 활용했습니다. 예제 코드에서는 속도 함수 내부의 if 과제.완료 { return "done" } 및 반복문 내부의 if !과제.완료 두 곳에 해당합니다.
match는 대상 값을 여러 패턴이나 범위 구간과 비교하여 해당 분기의 결과를 도출하는 제어 구문입니다. 단순한 참·거짓 판별을 넘어 과제.분과 같은 연속 구간을 기준으로 값을 분류할 때 if 문을 중첩하는 대신 범위 간 대응을 명확하게 드러내기 위해 선택했습니다. 예제 코드의 match 과제.분 { case 1..15 => "quick" case 16..30 => "focused" case _ => "deep" } 부분이 이에 해당합니다.
match 구문이 가능한 모든 경우를 빠짐없이 다루었는지 검사하는 동작은 이 언어의 주요한 특징입니다. 예제 코드의 case _ => "deep" 패턴은 앞선 범위를 벗어나는 모든 상황을 기호 _로 처리하여 어떤 값이 들어오더라도 분기가 누락되지 않도록 만듭니다. 모든 경계와 사례를 빠짐없이 다루면 실행 중 분기 누락으로 일어나는 예상치 못한 오류를 방지할 수 있어서 유용합니다.
선택: Array, Map, Set
본 학습 계획처럼 요소의 순서와 중복 허용이 의미를 갖는다면 Array를 사용하세요. 키를 통한 값 조회가 주요 동작이라면 Map이 적합합니다. 순서보다 요소의 유일성이 중요하다면 Set을 선택하는 것이 좋습니다. 현재 데이터 항목의 개수가 아니라 애플리케이션이 요구하는 동작을 기준으로 컬렉션을 결정하세요.
직접 해보기
배열의 세 번째 요소로 학습과제 { 제목: "Review output", 분: 5, 완료: true }를 추가하세요. 어떤 출력 줄이 새롭게 생성될까요? 남음 값은 변경될까요?
정답 보기
Review output: done 줄이 새로 출력됩니다. 추가한 작업은 이미 완료된 상태입니다. 따라서 if 본문이 실행되지 않으며 남음 값도 25 minutes 그대로 유지됩니다.
다음 단계로 넘어갈 준비
학습과제가 레코드인 이유·컬렉션 타입이 Array인 이유·순회 처리에 for를 사용하는 이유·조건 합산에 if를 쓰는 이유·범위 분류에 match를 선택하는 이유를 명확히 설명할 수 있다면 준비를 마친 것입니다.
문법 규칙만 별도로 확인하려면 패턴과 제어 흐름·레코드와 명목 데이터·컬렉션과 컴프리헨션 문서를 참조하세요. 이후 학습은 실패와 리소스 모듈로 이어가세요.