1장 - 기초

Rust 놀이터

변수

  • 변수는 let 키워드를 사용하여 선언
  • Rust는 대부분의 경우 변수의 자료형을 추론할 수 있으며, 추론이 불가능한 경우에는 변수 선언에 자료형을 추가해도 됨
  • 동일한 이름의 변수에 여러 번 값을 할당할 수 있으며, 이를 변수 숨김(variable shadowing)이라고 함. 변수 숨김으로 자료형도 변경 가능
  • 변수 이름은 항상 snake_case 형식으로 작성
fn main() { // rust가 x의 자료형을 유추합니다 let x = 13; println!("{}", x); // 자료형을 명시적으로 지정할 수도 있습니다 let x: f64 = 3.14159; println!("{}", x); // 선언 후 나중에 초기화도 가능하지만, 보통 그렇게 하진 않습니다 let x; x = 0; println!("{}", x); }

변수의 값 변경하기

  • Rust에서는 변수의 변경 가능성에 대해 주의합니다.
  • 값은 변경 가능(mutable)과 변경 불가(immutable) 두 가지로 구분됩니다.
  • 변경 가능한 값은 mut 키워드로 표시됩니다.
fn main() { let mut x = 42; println!("{}", x); x = 13; println!("{}", x); }

기본 자료형

  • bool - 참/거짓
  • u8 u16 u32 u64 u128 - unsigned interger 자료형
  • i8 i16 i32 i64 i128 - signed interger 자료형
  • usize isize - 메모리에 있는 값들의 인덱스와 크기
  • f32 f64 - 부동 소수점
  • (value1, value2, ...) - 튜플(tuple)
  • [value1, value2, ...] - 배열(array)
  • str - 런타임에 길이가 정해지는 텍스트
텍스트는 다른 언어보다 복잡함 → Rust가 메모리 문제에 신경쓰기 때문
숫자형 자료형들은 숫자 뒤에 자료형 이름을 붙여 명시적으로 지정 가능 (ex> 13u322u8)
fn main() { let x = 12; // 기본적으로 i32 let a = 12u8; // 값 12, 자료형 u8 let b = 4.3; // 기본적으로 f64 let c = 4.3f32; // 값 3.4, 자료형 f32 let bv = true; let t = (13, false); // 튜플 let sentence = "hello world!"; println!( "{} {} {} {} {} {} {} {}", x, a, b, c, bv, t.0, t.1, sentence ); }

기본 자료형 변환

  • 숫자형 자료형을 쓸 때 명시적으로 써야 함
    • u8 을 u32 에 쓰면 Error!
  • as 키워드를 사용해 숫자형 자료형 변환
fn main() { let a = 13u8; let b = 7u32; let c = a as u32 + b; // let c = a + b; <- Error! println!("{}", c); let t = true; println!("{}", t as u8); }

상수

  • SCREAMING_SNAKE_CASE - 상수의 이름 Naming Convention
  • 변수와 달리, 상수는 반드시 명시적으로 자료형을 지정
  • 상수는 컴파일 타임에 텍스트 지정자를 직접 값으로 대체
const PI: f32 = 3.14159; fn main() { println!( "아무 재료 없이 애플 {}를 만들려면, 먼저 우주를 만들어야 한다.", PI ); }

배열

  • 배열의 자료형은 [T;N]로 표현
    • T : 자료형
    • N : 컴파일 타임에 주어지는 고정된 길이
  • [x] 연산자 → usize 형의 인덱스 (0부터 시작)
fn main() { let nums: [i32; 3] = [1, 2, 3]; println!("{:?}", nums); println!("{}", nums[1]); }

함수

  • fn (함수명)(파라메터1: 자료형, 파라메터2: 자료형, ...) -> 리턴값 자료형 {}
  • snake_case - 함수 이름 Naming Convention
fn add(x: i32, y: i32) -> i32 { return x + y; } fn main() { println!("{}", add(42, 13)); }

여러개의 리턴 값

  • 튜플(tuple)을 리턴함으로써 여러 개의 값을 리턴 가능
fn swap(x: i32, y: i32) -> (i32, i32) { return (y, x); } fn main() { // 리턴 값의 튜플을 리턴 let result = swap(123, 321); println!("{} {}", result.0, result.1); // 튜플을 두 변수명으로 분해 let (a, b) = swap(result.0, result.1); println!("{} {}", a, b); }

아무것도 리턴하지 않기

  • 함수에 리턴형을 지정하지 않은 경우 빈 튜플을 리턴unit 이라고도 함
  • 빈 튜플은 ()로 표현
fn make_nothing() -> () { return (); } // 리턴 자료형은 ()로 암시 fn make_nothing2() { // 리턴할 것이 지정되지 않으면 이 함수는 ()를 리턴함 } fn main() { let a = make_nothing(); let b = make_nothing2(); // 아무 것도 없는 것은 출력하기 힘들기 때문에 // a와 b의 디버그 문자열을 출력한다 println!("The value of a: {:?}", a); println!("The value of b: {:?}", b); }

The Rust Programming Language 링크