토파즈 배우기

값과 함수

학습 계획에 타입 추론과 표기, 불변·가변 바인딩, 매개변수, 검사되는 함수 결과를 더합니다.

학습 결과: 실행할 때 보이는 값을 검사기가 확인하는 타입과 연결하고, 반복 계산 하나를 이름 있는 함수로 만듭니다.

선행 학습: 첫 프로그램을 마치고 topaz run 전에 topaz check를 실행할 수 있어야 합니다.

정상 프로그램 확장하기

values-functions.tpz를 만드세요.

TOPAZ
function minutesLeft(total: int, spent: int) -> int {
    total - spent
}

let topic = "Topaz basics"
let total: int = 45
let spent = 20
let mut sessions = 0
sessions = sessions + 1

print("{topic}: {minutesLeft(total, spent)} minutes left")
print("sessions: {sessions}")

확장한 파일을 검사하고 실행합니다.

BASH
topaz check values-functions.tpz
topaz run values-functions.tpz

결과는 다음과 같습니다.

출력
Topaz basics: 25 minutes left
sessions: 1

결과에서 코드 쪽으로 읽기

첫 줄에는 minutesLeft(45, 20)의 결과가 들어 있습니다. 함수 시그니처는 int 매개변수 두 개의 이름을 정하고 int 결과를 약속합니다. 마지막 식인 total - spent가 별도의 return 없이 결과가 됩니다. 제어 흐름 중간에서 일찍 끝내는 편이 더 분명할 때는 return을 사용하며, 선언한 결과 타입은 어느 종료 경로에서든 지켜야 합니다.

topicspent는 초깃값만 보아도 타입이 분명하므로 타입을 적지 않았습니다. total: int는 중요한 경계를 명시합니다. 세 이름은 모두 불변이어서 값을 사용할 수는 있지만 다른 값으로 바꿀 수는 없습니다.

sessions는 다릅니다. let mut는 재할당이 의도적임을 드러내며, 다음 줄에서 값을 0에서 1로 바꿉니다. 언젠가 바뀔지도 모른다는 이유로 모든 값을 가변으로 만들지 말고, 실제로 변화하는 상태를 추적하는 바인딩에만 가변성을 주세요.

선택: 추론, 타입 표기, 가변성

지역 값의 타입이 초깃값에서 명확하다면 평범한 let과 추론을 우선하세요. 중요한 경계를 독자에게 보여 줘야 할 때 타입을 적으세요. 이후 재할당이 모델의 일부일 때만 mut를 붙입니다. 함수 시그니처는 호출자가 매개변수와 결과 계약에 의존하므로 명시해야 합니다.

직접 해보기

total60으로, spent15로 바꾸고 sessions는 그대로 두세요. 출력에서 무엇이 달라질까요?

정답 보기

첫 줄은 Topaz basics: 45 minutes left로 바뀌고, 둘째 줄은 sessions: 1 그대로입니다. 함수에는 새 인수가 전달되지만, 별도의 가변 카운터는 여전히 한 번만 증가합니다.

다음 단계로 넘어갈 준비

추론한 타입, 직접 적은 타입, 불변 바인딩, 가변 바인딩, 두 매개변수, 함수 결과가 되는 식을 각각 설명할 수 있다면 준비되었습니다.

정확한 형식은 타입함수와 제네릭에서 확인하세요. 제네릭은 이후의 참고 자료이며 이 실습의 선행 조건이 아닙니다. 데이터와 제어로 계속하세요.