C.W.K.
Stream
Lesson 05 of 06 · published

함수 & 제어 흐름

~12 min · foundations, functions, control-flow, expressions

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

Rust 함수는 단순한데, 새내기를 넘어뜨리는 아이디어 하나가 있어: Rust 는 표현식 기반 언어야. 거의 모든 게 값을 만들고, 너는 그걸 계속 기대게 돼.

함수 정의

fn add(a: i32, b: i32) -> i32 { a + b }. 파라미터 타입은 항상 필수야 — Rust 는 함수 경계를 넘어 추측하는 법이 없어. 반환 타입은 -> 뒤에 와. return 키워드도 없고 a + b 에 세미콜론도 없는 거 봐: 블록의 마지막 표현식이 블록의 값이야.

문 vs 표현식

문(statement) 은 뭔가를 해 (let x = 5;); 표현식은 값으로 평가돼 (5 + 5, 함수 호출, if, 심지어 { } 블록까지). 세미콜론을 붙이면 표현식이 문으로 바뀌고 그 값이 버려져. 그 세미콜론 하나가 값을 반환하느냐 () — 빈 'unit' 타입 — 를 반환하느냐의 차이야.

값을 반환하는 제어 흐름

if 가 표현식이라서 let n = if cond { 1 } else { 2 }; 가 돼. loopbreak value 로 값을 반환할 수 있고. 그리고 일꾼은 for x in collection 이야 — Rust 의 for 는 항상 이터레이터를 돌지 수동 인덱스를 안 써서, off-by-one 버그를 근원에서 없애.

빠진 세미콜론은 보통 의도된 거야. 함수가 값을 반환해야 하면 마지막 줄에 세미콜론이 없어. 실수로 하나 붙이면 반환 타입 자리에서 () 를 찾았다는 타입 에러가 떠 — 첫 주의 전형적인 혼란이야.

왜 인덱싱 대신 for-in 이냐

수동 인덱스 루프가 버퍼 오버런이랑 off-by-one 에러가 번식하는 자리야. Rust 의 for item in &items 는 각 원소를 직접 건네주고, 이터레이터가 언제 멈출지 알고, 틀릴 인덱스 자체가 없어.

Code

도처에 표현식·rust
fn add(a: i32, b: i32) -> i32 {
    a + b           // 세미콜론 없음: 이게 곧 반환값
}

fn main() {
    let big = if add(2, 3) > 4 { "yes" } else { "no" }; // if 는 표현식

    // loop 는 `break value` 로 값을 반환할 수 있어
    let mut n = 0;
    let doubled = loop {
        n += 1;
        if n == 5 { break n * 2; }
    };

    // for 는 항상 이터레이터를 돈다 — 수동 인덱스 없음
    for i in 1..=3 {
        println!("{i}");
    }
    println!("{big} {doubled}");
}

External links

Exercise

더 큰 값을 반환하는 fn max(a: i32, b: i32) -> i32return 키워드 없이 if 표현식만으로 써봐. 그다음 마지막 표현식에 세미콜론을 붙여보고 컴파일러 에러를 읽어.
Hint
세미콜론을 붙이면 함수가 () 를 반환하게 돼서 선언한 -> i32 랑 안 맞아. 그 에러가 표현식 기반 언어를 이해하는 열쇠야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.