학습 결과: 런타임에 출력되는 값을 검사기가 검증하는 타입과 연결합니다. 반복되는 계산 로직을 이름이 있는 함수로 정의합니다.
선행 학습: 첫 프로그램을 완료해야 합니다. topaz run 실행 전에 topaz check를 수행할 수 있어야 합니다.
정상 프로그램 확장하기
values-functions.tpz 파일을 생성하세요.
function 남은분(전체: int, 사용: int) -> int {
전체 - 사용
}
let 주제 = "Topaz basics"
let 전체: int = 45
let 사용 = 20
let mut 세션수 = 0
세션수 = 세션수 + 1
print("{주제}: {남은분(전체, 사용)} minutes left")
print("sessions: {세션수}")작성한 파일을 검사하고 실행하세요.
topaz check values-functions.tpz
topaz run values-functions.tpz실행 결과는 다음과 같습니다.
Topaz basics: 25 minutes left
sessions: 1결과에서 코드 쪽으로 읽기
첫 줄에는 남은분(45, 20)의 호출 결과가 포함됩니다. 함수 시그니처는 두 개의 int 매개변수에 이름을 부여하고 반환 타입 역시 int로 지정합니다. 매개변수에 적힌 : int와 반환 위치의 -> int 표기는 코드를 읽는 사람에게 함수의 입출력 규격을 명확하게 전달합니다. 함수를 호출하는 쪽에서는 본문 내부의 계산 로직을 들여다보지 않고도, int 타입 값 두 개를 넘겨주어야 하고 그 결과로 int 타입 값이 돌아온다는 점을 곧바로 이해할 수 있습니다.
마지막 표현식인 전체 - 사용이 함수의 반환값이 되므로 return을 명시하지 않아도 됩니다. 블록의 마지막 표현식이 곧 평가 결과가 되는 방식입니다. 제어 흐름 중간에서 명시적으로 조기 종료해야 할 때 return을 사용합니다. 선언한 반환 타입은 모든 종료 경로에서 준수해야 합니다. topaz check는 함수 내의 모든 종료 경로에서 반환되는 값이 -> int로 약속한 타입과 맞아떨어지는지 검증합니다.
주제와 사용은 초깃값만으로도 타입을 명확히 알 수 있어 타입 표기를 생략했습니다. 토파즈의 타입 추론 기능은 대입 연산자 오른쪽에 적힌 "Topaz basics" 문자열이나 20 정수 리터럴을 보고 해당 변수의 타입을 스스로 결정합니다. 따라서 초깃값이 명확한 지역 변수에는 타입 표기를 매번 적지 않아도 코드가 정돈되게 유지됩니다.
전체: int는 명시적인 타입 경계를 지정합니다. 초깃값 45로도 추론이 가능하지만, 변수 선언 시점에 : int를 명시함으로써 이 데이터가 프로그램에서 갖는 역할을 선명하게 드러냅니다. 코드 독자에게 중요한 의도나 경계를 전달해야 하는 자리에는 이처럼 직접 타입을 작성하는 편이 좋습니다. 주제, 전체, 사용 세 바인딩은 모두 불변입니다. 값을 참조하여 사용할 수는 있지만 다른 값으로 변경할 수는 없습니다.
세션수는 다릅니다. let mut는 재할당이 의도된 동작임을 명시합니다. 키워드 mut를 함께 적음으로써 이 바인딩이 나중에 다른 값으로 바뀔 것임을 검사기와 독자에게 알려줍니다. 이어지는 줄에서 값을 0에서 1로 변경합니다. 향후 값이 변경될 수 있다는 이유만으로 모든 바인딩을 가변으로 선언하지 마세요. 실제 상태 변화를 추적하는 바인딩에만 가변성을 부여하세요.
선택: 추론, 타입 표기, 가변성
지역 변수의 타입을 초깃값에서 명확히 알 수 있다면 일반적인 let을 사용하여 추론에 맡기세요. 불필요한 구문 반복을 줄이고 코드의 핵심 흐름에 집중할 수 있습니다.
코드 독자에게 중요한 경계를 전달해야 할 때 타입을 명시하세요. 변수의 역할이 도메인 관점에서 중요하거나 타입 정보를 드러내는 것이 읽는 이에게 유용한 경우에는 명시적 표기가 도움이 됩니다.
재할당이 도메인 모델의 일부인 경우에만 mut를 사용하세요. 기본적으로 불변 바인딩을 선택하고, 값이 누적되거나 달라지는 상태 변화를 다룰 때만 가변 표현을 도입하는 것이 좋습니다.
함수 시그니처는 항상 명시해야 합니다. 호출자가 매개변수와 반환값 계약에 의존하기 때문입니다. 매개변수의 : int와 반환값의 -> int는 함수 외부와 내부를 연결하는 공식 구획을 형성하며, 읽는 이에게 매개변수의 이름과 타입, 반환 타입을 명확히 전달합니다.
직접 해보기
전체를 60으로, 사용을 15로 변경하고 세션수는 그대로 유지하세요. 출력에서 어떤 부분이 달라질까요?
정답 보기
첫 줄은 Topaz basics: 45 minutes left로 변경됩니다. 둘째 줄은 sessions: 1 그대로 유지됩니다. 함수는 새로 전달된 인자를 받지만, 가변 카운터는 이와 별개이므로 여전히 한 번만 증가합니다. 전체 60과 사용 15가 남은분 함수로 들어가 60 - 15 계산 결과인 45를 반환하며, 세션수는 함수 호출과 독립된 가변 바인딩으로 남아 동일하게 1만 출력됩니다.
다음 단계로 넘어갈 준비
추론된 타입·명시적 타입·불변 바인딩·가변 바인딩·두 개의 매개변수·함수 반환값이 되는 표현식을 각각 설명할 수 있다면 준비가 끝난 것입니다.
정확한 구문은 타입과 함수와 제네릭 문서에서 확인하세요. 제네릭은 추후 참고할 내용이며 이 실습의 선행 조건은 아닙니다. 다음 단계인 데이터와 제어 학습으로 진행하세요.