토파즈 배우기

값과 함수

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

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

선행 학습: 첫 프로그램을 마쳐야 합니다. 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 그대로입니다. 함수는 새 인수를 받습니다. 가변 카운터는 그와 별개라서 여전히 한 번만 늘어납니다.

다음 단계로 넘어갈 준비

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

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