강좌02-주석과 변수 타입

3 분 소요

1. 주석

주석달기는 javascript의 주석과 같습니다.

// 한줄 주석
/*
여러줄 주석
*/
/// 문서화에 사용할 주석

Rust에서는 여러줄이라도 한줄 주석으로 만들 것을 추천하며,
문서화에 필요한 주석은 /// 을 사용 합니다.

2. 전역 변수

전역 변수는 static을 사용하며 변수명은 대문자로 작성해야 합니다.

static MAX: i32 = 100;

문자열은 &str 형을 사용하는데

static NAME: &str = "GLOBAL VALUE";

문자형 전역 변수의 lifetime 유지를 위해 &’static str 형을 사용하여야 합니다.
이는 lifetime 때문인데 ‘static 형은 가장 긴 lifetime을 가지므로 적합하다 볼 수 있습니다.

&str 형을 그대로 사용하여도 됩니다. 전역 변수로 선언하면 가장 긴 lifetime을 갖게 됩니다.

위의 변수를 선언하여 이를 출력하면 정상적으로 출력됨을 볼 수 있습니다.

static NAME: &str = "GLOBAL VALUE";

fn main() {
    println!("{}", NAME);
}

//결과
GLOBAL VALUE

3. 상수

상수는 const를 사용하며 변수명은 대문자로 작성합니다.

const PI: i32 = 3.14;

fn main() {
  println!("{}", PI);
}

//결과
3.14

Rust에 내장된 상수를 use를 통해 사용할 수도 있습니다.
예를 들어 내장된 PI 상수를 사용하려면 std::f32::consts를 use 해야합니다.

use std::f32::consts;

fn main() {
  println!("{}", consts::PI);
}

//결과
3.1415927

4. 값

  • 진수

    16진수: 0x (0x46 = 70)
    8진수: 0o (0o106 = 70)
    2진수: 0b (0b1000110)

  • 언더스코어 (_)

    가독성을 위해 숫자 사이에 _를 넣을 수 있습니다.
    예: 1_000_000

  • 정수

    i8, i16, i32, i64 : default i32

  • 실수

    f8, f16, f32, f64: default f64

** 실수 변수는 반드시 소수점을 포함해야 합니다.

  • boolean
let t = true;
let f: bool = false; // with explicit type annotation
  • char
    let c = 'z';
    let z = 'ℤ';
    let heart_eyed_cat = '😻';

싱글 따옴표를 사용하며 문자 하나만 선언하면 char 형으로 인식합니다.

  • Tuple
    let tup: (i32,i32, i16) = (500, 6.4, 1);
    let (x, y, z) = tup;
    println!("All Values: {} {} {}", tup.0, tup.1, tup.2);
    println!("The value of y is: {}", y);

여러 값을 묶어서 선언할 수 있습니다. 타입스크립트의 방식과 유사합니다.
tup에서 직접 값을 가져오려면 tup.0, tup.1, tup.2 로 각각 가져올 수 있습니다.

  • Array
    let a = [1, 2, 3, 4, 5];
    let b: [i32; 5] = [1, 2, 3, 4, 5]; // i32형 5개 선언 정의
    let c = [3; 5]; // 3값을 5개. 즉, [3,3,3,3,3]과 동일
    println!("{}", a[0]);

5. 타입 체크

  • 변수의 복사

문자열의 경우 javascript와 같이 변수명을 직접 적용해도 되나, 숫자형이나 기타 다른 형의 경우 &로 가져와야 합니다.

fn main() {
  let a = "A";
  let b = a;

  let c = 10;
  let d = &c;
  println!("{} {}", b, d);
}
  • string 합치기

Rust에서는 string을 합칠 때 + 를 사용할 수 없습니다.

fn main() {
    let a1 = "Kim";
    let a2 = "Lee";
    let _a3 = a1 + a2;
 }
 
 //결과
  |
4 | let a3 = a1 + a2;
  |               ^^^^^^^^^^^^^^^^^ `+` can't be used to concatenate two `&str` strings

한쪽 변수를 to_string() 형태로 변경하면 가능합니다.

fn main() {
    let a1 = "Kim";
    let a2 = "Lee";
    let a3 = a1.to_string() + a2;
    println!("{}", a3);
 }

또는 format!을 활용할 수도 있습니다. 사용법은 println!과 같습니다.

fn main() {
    let a1 = "Kim";
    let a2 = "Lee";
    let _a3 = format!("{}{}", a1, a2);
 }
  • 다른 형은 서로 복제할 수 없습니다.

javascript와는 달리 형을 강하게 따지므로 형이 다르면 값을 복사할 수 없습니다.
이는 형의 범위나 메모리 할당의 크기와 관계 없습니다.

fn main() {
 let num: i32 = 10;
 let mut mutable_num: u32 = 0;
 mutable_num = num; // error !
}

//결과
  |
4 |  mutable_num = num; // error !
  |                ^^^ expected u32, found i32

as를 활용하면 유사한 형 (int, float 등)은 서로 인식이 가능합니다.
그러나, 유사하지 않은 형 (int, &str)은 여전히 인식 불가합니다.

// 유사한 형 변환 (i32 -> u32)

fn main() {
 let num: i32 = 10;
 let mut mutable_num: u32 = 0;

 mutable_num = num as u32;

 println!("{}", mutable_num);
}

// 결과
  |
3 |  let mut mutable_num: u32 = 0;
  |          ^^^^^^^^^^^
  |
  = note: #[warn(unused_assignments)] on by default
  = help: maybe it is overwritten before being read?
  
10

유사항 형을 as로 강제로 복사했더니 결과값은 나오지만 형 변환에 따른 경고 메시지가 나옵니다.

// 유사하지 않은 형 변환 (i32 -> &str)

fn main() {
 let num: i32 = 10;
 let mut mutable_num: &str = "";

 mutable_num = num as &str;

 println!("{}", mutable_num);
}

//결과
  |
5 |  mutable_num = num as &str;
  |                ^^^^^^^^^^^
  |
  = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait

유사하지 않은 경우 에러가 발생하고 진행되지 않습니다.

  • Custom 형 정의

기본형을 활용한 Custom 형을 정의하여 이를 활용할 수 있습니다.

type Custom = i64;

fn main() {
 let run: Custom = 100;
}

댓글남기기