All posts

Rust 초급 2편: 변수·자료형·문자열로 학습 기록 만들기

1편에서는 정해진 문장을 출력했습니다. 이번에는 이름과 공부 시간을 값으로 보관하고, 계산한 결과를 문장에 넣어 보겠습니다. 끝나면 자신의 하루 학습 기록을 출력하는 프로그램을 만들 수 있습니다.

숫자 블록과 문자열 실타래를 정리하는 주황색 게로 변수와 자료형을 표현한 일러스트

1편에서는 정해진 문장을 출력했습니다. 이번에는 이름과 공부 시간을 값으로 보관하고, 계산한 결과를 문장에 넣어 보겠습니다. 끝나면 자신의 하루 학습 기록을 출력하는 프로그램을 만들 수 있습니다.

준비와 목표

1편의 Rust 설치를 마친 상태에서 프로젝트를 새로 만듭니다. 이번 편의 예제들은 각각 src/main.rs 전체를 바꾸는 코드입니다.

cargo new study_values
cd study_values

목표는 let과 mut의 차이를 설명하고, 정수·실수·불리언·문자열을 구분하는 것입니다. 입력 기능과 소유권은 뒤에서 배우므로 이번에는 코드 안에 값을 직접 작성합니다.

이름을 붙여 값 보관하기

변수는 값에 붙인 이름입니다. 같은 값을 여러 곳에서 쓰거나 계산 결과를 보관할 때 사용합니다. 아래를 src/main.rs에 저장하고 cargo run으로 실행하세요.

fn main() {
    let learner = "민수";
    let morning: u32 = 25;
    let evening: u32 = 35;
    let total = morning + evening;
    let hours: f64 = f64::from(total) / 60.0;
    let reached_goal: bool = total >= 60;

    println!("학습자: {learner}");
    println!("총 학습: {total}분");
    println!("시간 환산: {hours:.1}시간");
    println!("목표 달성: {reached_goal}");
}

예상 출력입니다.

학습자: 민수
총 학습: 60분
시간 환산: 1.0시간
목표 달성: true

u32는 음수가 없는 32비트 정수입니다. 분 단위 학습 시간에 사용했습니다. f64는 부동소수점 수이고, bool은 true 또는 false를 담습니다. 문자열 리터럴인 "민수"의 타입은 &str입니다. & 기호는 5편에서 다시 설명합니다.

let total에는 타입을 적지 않았습니다. 컴파일러가 덧셈에 쓰인 값에서 u32로 추론할 수 있기 때문입니다. Rust가 타입을 추론한다고 해서 변수가 실행 중 아무 타입으로나 바뀌는 것은 아닙니다.

시간 환산에서는 f64::from(total)로 정수를 실수로 바꿨습니다. 정수끼리 나누면 소수 부분이 버려지므로 실수 계산을 의도한다는 표시가 필요합니다. {hours:.1}은 소수점 아래 한 자리까지 출력하라는 형식입니다.

바뀌는 값에는 mut

기본 let 변수에는 새 값을 다시 대입할 수 없습니다. 누적 시간이 늘어나는 경우처럼 변경이 필요한 값은 mut로 선언합니다. 다음도 독립된 전체 예제입니다.

fn main() {
    let mut minutes: u32 = 20;
    minutes += 15;
    println!("누적: {minutes}분");

    let minutes = "35분";
    println!("표시 문자열: {minutes}");
}
누적: 35분
표시 문자열: 35분

minutes += 15는 기존 값에 15를 더해 다시 저장합니다. 뒤의 let minutes는 다른 작업입니다. 같은 이름으로 새 바인딩을 만드는 섀도잉이며, 여기서는 숫자에서 문자열로 타입도 달라졌습니다. mut 변수의 타입을 바꾼 것이 아닙니다. 변수와 가변성 공식 설명

이름을 계속 재사용하면 읽는 사람이 헷갈릴 수 있습니다. 실제 학습 기록에는 totalminutes와 displaytext처럼 역할을 나눈 이름도 좋습니다.

&str과 String 맛보기

고정된 글자는 문자열 리터럴로 표현하고, 내용을 덧붙여 만들 문자열에는 String을 사용할 수 있습니다.

fn main() {
    let topic: &str = "Rust";
    let mut message = String::from(topic);
    message.push_str(" 공부 시작");
    println!("{message}");
}
Rust 공부 시작

String::from은 소유하는 문자열을 만들고, push_str은 뒤에 문자열을 붙입니다. 값을 바꾸므로 message에는 mut가 필요합니다. 지금은 두 타입을 사용할 자리를 익히고, 소유권 차이는 4~5편에서 확인하세요.

오류를 읽는 연습

두 번째 예제의 let mut minutes에서 mut만 지운 뒤 cargo check를 실행해 보세요. 다시 대입할 수 없다는 오류가 나옵니다. 계산식이 틀렸다기보다 선언한 변경 규칙과 실제 사용이 어긋난 것입니다. 다시 mut를 넣으면 해결됩니다.

또한 "25"와 25는 다른 타입입니다. 따옴표가 있는 값은 글자이므로 정수처럼 바로 더하지 않습니다. 사용자가 입력한 글자를 숫자로 바꾸는 parse는 8편에서 다룹니다.

연습과 해설

첫 예제에서 아침을 40분, 저녁을 50분으로 바꾸고 목표를 90분으로 바꿔 보세요. 출력은 총 90분, 1.5시간, 목표 달성 true여야 합니다.

해설: morning은 40, evening은 50으로 바꾸고 비교식을 total >= 90으로 수정합니다. 나머지 코드는 그대로 둡니다. 이렇게 입력 값만 바꿔도 계산 결과가 따라 바뀌는 것이 변수를 쓰는 첫 이유입니다.

추가로 저녁을 30분으로 바꾸면 총 70분이고 목표는 false가 됩니다. 경계인 90분뿐 아니라 목표보다 작은 경우도 확인하세요.

이번 편의 확인과 다음 단계

고정된 값은 let, 다시 대입할 값은 let mut로 선언했습니다. 타입을 적거나 추론하게 할 수 있으며 숫자와 문자열은 구분합니다. 다음 3편에서는 반복되는 계산을 함수로 빼고, 조건문과 반복문으로 여러 날의 기록을 처리합니다.

공식 참고: 자료형, 문자열.

실행 확인

이 글의 핵심 실습은 Rust 1.99.1, 2024 Edition의 Linux 환경에서 확인했습니다. 의도적으로 실패하는 예제는 설명한 오류가 발생하는지 구분해 검사했습니다. 운영체제별 오류 문구는 다를 수 있습니다.

Rust 초급 시리즈 전체 목차

  1. 설치와 Cargo로 첫 프로그램 만들기
  2. 변수·자료형·문자열로 학습 기록 만들기
  3. 함수·조건문·반복문으로 학습 기록 계산하기
  4. String으로 이해하는 소유권과 이동
  5. 참조와 빌림으로 문자열 읽고 수정하기
  6. 구조체와 메서드로 학습 할 일 만들기
  7. 열거형과 패턴 매칭으로 학습 상태 표현하기
  8. Option·Result로 빈 값과 오류 처리하기
  9. 벡터·해시맵·문자열로 학습 기록 모으기
  10. 모듈과 외부 크레이트로 코드 정리하기
  11. 테스트와 디버깅으로 목표 계산 검증하기
  12. 파일을 검색하는 CLI 프로젝트 완성하기

시리즈 모아보기

Discussion

No comments yet