Rust 초급 3편: 함수·조건문·반복문으로 학습 기록 계산하기
변수 하나로 하루를 표현했다면 이제 여러 날을 처리해 봅시다. 이번에는 세 번의 학습 시간을 합산하고, 하루 목표를 달성했는지 판단하는 프로그램을 만듭니다. 함수는 계산의 이름을 붙이고, 제어 흐름은 어떤 계산을 언제 할지 정합니다.

변수 하나로 하루를 표현했다면 이제 여러 날을 처리해 봅시다. 이번에는 세 번의 학습 시간을 합산하고, 하루 목표를 달성했는지 판단하는 프로그램을 만듭니다. 함수는 계산의 이름을 붙이고, 제어 흐름은 어떤 계산을 언제 할지 정합니다.
준비와 목표
2편의 변수·정수·bool을 알고 있으면 됩니다. 새 프로젝트를 만들고 아래 핵심 실습을 src/main.rs에 저장하세요.
cargo new study_flow
cd study_flow목표는 인자와 반환값이 있는 함수를 작성하고, if와 for를 이용해 기록을 계산하는 것입니다.
핵심 실습: 세 번의 공부를 합산하기
fn total_minutes(first: u32, second: u32, third: u32) -> u32 {
first + second + third
}
fn goal_message(minutes: u32) -> &'static str {
if minutes >= 60 {
"오늘 목표 달성"
} else {
"조금 더 공부해 봅시다"
}
}
fn main() {
let total = total_minutes(20, 25, 30);
println!("총 {total}분: {}", goal_message(total));
let mut sum = 0;
for day in 1..=3 {
sum += day * 10;
println!("{day}일차 누적: {sum}분");
}
}실행합니다.
cargo run총 75분: 오늘 목표 달성
1일차 누적: 10분
2일차 누적: 30분
3일차 누적: 60분첫 함수는 u32 값 세 개를 받아 합계를 돌려줍니다. -> u32가 반환 타입입니다. 마지막 first + second + third 뒤에 세미콜론이 없다는 점을 확인하세요. 이 식의 값이 함수 결과가 됩니다. 함수 공식 설명
두 번째 함수의 &'static str은 프로그램 실행 내내 유효한 문자열 참조입니다. 이번에는 고정된 문구 두 개 중 하나를 반환하기 위해 사용했습니다. 라이프타임 문법 전체를 외울 필요는 없습니다.
println! 안의 빈 {}에는 뒤에 전달한 goal_message(total)의 결과가 들어갑니다. 이름을 쓴 {total}과 빈 자리 {}를 함께 사용할 수 있습니다.
if는 값을 만들 수도 있습니다
goal_message는 if의 양쪽 분기에서 모두 문자열을 만듭니다. 조건에 따라 실행할 코드를 고르는 동시에 반환할 값도 정한 셈입니다. 양쪽 분기가 같은 타입이어야 하는 이유가 여기 있습니다.
조건에는 bool이 필요합니다. if minutes처럼 숫자를 직접 조건으로 쓰지 않고, minutes >= 60처럼 비교를 작성하세요. 목표 시간이 정확히 60일 때도 성공에 포함하려고 >=를 사용했습니다.
for의 범위 살펴보기
1..=3은 1, 2, 3을 순서대로 만듭니다. 끝에 있는 3도 포함합니다. 반면 1..3은 1, 2까지만 만듭니다. 반복 횟수가 예상과 다르면 범위의 등호부터 확인하세요.
이번 예제는 1일차 10분, 2일차 20분, 3일차 30분을 더합니다. sum은 반복문 밖에 있어 이전 반복의 값을 유지합니다. for 안에 let mut sum = 0을 선언하면 매번 초기화되어 누적값이 달라집니다.
반복 횟수가 아니라 어떤 조건이 유지되는 동안 실행하려면 while을 쓸 수 있습니다. 다음은 독립된 전체 예제입니다.
fn main() {
let mut remaining = 3;
while remaining > 0 {
println!("남은 연습: {remaining}개");
remaining -= 1;
}
println!("완료");
}남은 연습: 3개
남은 연습: 2개
남은 연습: 1개
완료조건을 바꾸는 remaining -= 1을 빠뜨리면 이 예제는 끝나지 않습니다. 종료 조건을 읽을 수 있게 작성하는 것이 반복문에서 중요합니다. 무조건 반복하는 loop와 중단하는 break도 있지만, 이번 학습 기록에는 for가 더 간단합니다. 제어 흐름 공식 설명
자주 만나는 오류
total_minutes의 마지막 식에 세미콜론을 붙여 cargo check를 실행해 보세요. 반환할 숫자가 사라져 선언된 반환 타입과 맞지 않게 됩니다. 표현식의 마지막 값을 반환하려면 세미콜론을 제거합니다. 명시적으로 return first + second + third;라고 적을 수도 있습니다.
if의 한쪽에서 숫자 1, 다른 쪽에서 문자열 "완료"를 반환해도 타입 불일치가 발생합니다. 하나의 함수가 돌려주는 값의 형식을 먼저 정하고 분기들을 맞추세요.
연습과 해설
goalmessage의 목표를 90분으로 바꾸고 totalminutes(30, 30, 30)을 호출해 보세요. 결과는 목표 달성입니다. 이어 마지막 인자를 29로 바꾸면 미달 문구가 나와야 합니다.
해설: 조건은 minutes >= 90입니다. 90과 89를 함께 실행하면 경계를 제대로 작성했는지 확인할 수 있습니다. for 실습은 범위를 1..=4로 바꾸면 마지막 누적값이 100분이 됩니다.
다음 편
함수는 값을 전달받습니다. 숫자는 별다른 문제 없이 여러 번 사용했지만 String을 함수로 넘기면 상황이 달라질 수 있습니다. 4편에서는 Rust의 소유권과 이동을 직접 실험합니다.
실행 확인
이 글의 핵심 실습은 Rust 1.99.1, 2024 Edition의 Linux 환경에서 확인했습니다. 의도적으로 실패하는 예제는 설명한 오류가 발생하는지 구분해 검사했습니다. 운영체제별 오류 문구는 다를 수 있습니다.



Discussion
No comments yet