Learning Rust #2

TAEJUN KIM·2021년 8월 31일
0

Rust

목록 보기
2/4
post-thumbnail

Variable and Mutability

  • rust에서 변수들은 기본적으로 immutable 이다.
  • 이렇게 해놓은 이유는 간단히 말하면 안정성과 동시성에서 이점을 주기 때문이다.
  • 이러면 constant(상수)와 개념이 헷갈릴 수 있지만 상수와 immutable variable은 다른 개념이다.
  • rust에서 상수는 let대신 const를 통해 생성하고 코딩 컨벤션으론 모두대문자를 사용하고 단어사이에는 언더바 (_) 를 넣는다
const MAX_POINTS : u32 = 100_000;

또한 타입을 명시해야 하고 (위 예제는 unsigned int 32) 가독성을 위해 숫자 사이에도 언더바를 넣을 수 있다. ( 천단위를 콤마로 끊는걸생각해보면 쉽다)

  • 변수 선언시 let 문을 사용한다.
let x = 3;
x = 4; // (X) compile error 
  • 값을 변경시킬 수 있게 하려면 mutable을 나타내주는 mut을 사용한다.
let mut x =3;
x= 4 //(O) x is mutable 

Shaodwing

  • rust에는 shadowing 이라는 개념이 있다. Shadow는 그림자이다. 그림자는 빛을 사물이 가리기때문에 생기는 것이다. 이를 생각하며 아래 코드를 보자.
let x = 4;
let x = x+1; // 5
let x = x*2; // 10

위에 선언된 x가 아래쪽에 선언된 x에 의해 가려지고 있다.
마지막줄까지 실행된 후 x의 값은 10이다.
쉐도잉은 이전에 선언한 변수의 내용이 다음에 재정의된 변수로 가려지는 것을 의미한다.

  • shadowing과 mut variable의 한가지 큰 차이는 타입을 변경시킬 수 있냐 차이이다.
//SHADOWING (O) 
let space = " "; // String 타입 
let space = space.len();   // u32 타입 

//mut variable (X)
let mut space = " ";
space = space.len();  // space의 타입이 변경되었으므로 compile error 

rust data types

  • 크게 scalar type 과 compound type으로 나눈다.

  • rust에서 정의되는 모든 값은 특정한 data type을 가지고 있다.

  • rust는 compile time에 data type이 모두 정해져야한다. 이를 statically typed language라고 한다. python 같은 스크립트 언어는 타입을 런타임에 정하니까 dynamically typed language로 생각하면 되겠다.

  • 근데 let x = 32; 처럼 그냥 쓰는 이유는 컴파일러가 값을 통해 타입추론을 하기 때문에 명시하지 않아도 되는 것이다.

아래 예제는 parse함수를 통해 "42"를 u32로 바꾸는 예제이다."42" parse()함수를 통해 다양한 타입으로 변환 될 수 있다. 따라서 어떤 타입으로 변환할건지 명시를 꼭 해주어야한다. 왜냐면 안그러면 컴파일러가 헷갈려서 오류를 발생시킨다.

let guess : u32 = "42".parse().expect("Not a Number");
  • 위의 예시처럼 다양한 타입으로 추론이 되는 경우 , 어떤 타입으로 쓸건지 꼭 명시해주어야 한다.

scalar type

  • scalar type 은 rust에서 단일 값(single value)를 나타낸다.

  • rust는 4가지 primary scalar type 이 있다. (integers/floating-point numbers/Booleans/Characters)

integer type

LengthSignedUnsigned
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize
  • 부호있는 정수는 2의 보수를 사용하여 데이터를 저장한다.

  • arch는 컴퓨터 architecture 에 따른 비트수라서 32비트 컴퓨터 사용하면 32bit 이고 64bit 컴퓨터 사용하면 64bit이다.

Number literalsExample
Decimal98_222
Hex0xff
Octal0o77
Binary0b1111_0000
Byte (u8 only)b'A'
  • 57u8 처럼 u8이라는 타입 지정자를 사용하거나, 10_000(10000) 같은 visual separator를 사용할 수 있다.

  • 기본적으로는 i32 = int 32bit 를 사용하는걸 권장한다. 가장빠름

Floating-Point Types

  • floating-point types를위해 지원하는것 f32, f64. default type은 f64이다.

-자세한건 부동소수점 방식인 IEEE 754를참고하자.

Boolean Type

  • true / false 로 이루어진 값이다.

  • 1 byte 의 크기를 가진다. =8bit, int가 32 or 64 bit를 가지는것에 비해 대조적으로 작다.

fn main(){
    let t = true; // bool true
    let f : bool = false; //bool false , : bool 이라고 타입을 명시

Character Type

  • character literal 은 single quote로 둘러 싸인다. ' '

  • String literal 은 double quote로 둘러 싸인다. " "

  • rust는 char type에 4byte를 할당한다.

  • rust의 character는 Unicode값을 나타낸다. ASCII 보다 더 넓은 값을 표현 가능하다.

Compound Type

  • Compound Type(복합 타입) 이라는 말 그대로 여러개의 값을 하나의 타입으로 그룹화 해놓은 것을 의미한다.

  • Rust에는 2개의 primitive compund type을 제공한다.

  • 이는 튜플 (Tuple) 과 어레이(Array) 이다.

Tuple Type

  • 튜플은 여러개의 값을 하나의 타입으로 묶는것이다.

  • 이렇게만 말하면 무슨소린지 모르겠지만 예를들어

1, 'C', "bluebird" 라는 각각 u32, char, String 타입의 자료가 있다고 해보자. 그렇다면 튜플은 이를 ( )안에 묶은

(1, 'C', "bluebir") 로 표현할 수 있다.

러스트는 정적 타입 언어이다. 따라서 튜플로 묶는다면 어떤 타입을 모아 묶어놓은 튜플인지 명시해주어야 한다. 아래코드를 보면

fn main(){
    let tup : (i32, f64, u8) = (500, 6.4, 1);
}

과 같은데 tup 이라는 튜플이 i32(int 32bit), f64(float 64bits), u8(unsigned int 8bit) 로 이루어진 튜플임을 명시해주고 있다.

  • 이렇게 묶인 튜플 내부의 값을 가져오려면 다음과 같이 하면 된다.
fn main(){
    let tup = (500, 6.4, 1);
    let (x,y,z) = tup;
    println!("y : {}" , y);
}

(500, 6.4, 1) 인 튜플의 값을 각각 x ,y ,z 로 이루어진 튜플에 대응시키고 그 값을 꺼내왔다.
또다른 방법으로는 .(period) 를 사용해서 인덱싱해 꺼내오는 것이다.

fn main() {
    let x: (i32, f64, u8) = (500, 6.4, 1);

    let five_hundred = x.0;

    let six_point_four = x.1;

    let one = x.2;
}

Array Type

  • 스택보다 힙에 데이터를 할당하고 싶을떄 유용하다.

  • 고정된 길이의 요소를 가짐을 보장하고 싶을떄, 가변길이는 vector

let months = ["January", "February", "March", "April", "May", "June", "July",
              "August", "September", "October", "November", "December"];

예를들어 1년이 12개의 달로 이루어짐을 알고있고 이는 불변함으로 위와같이 배열에 저장할 수 있다.

  • 배열의 타입을 명시하는 방법은 아래와 같다
    let a : [i32; 5] = [1, 2, 3, 4, 5];

[i32; 5]
i32형 5개를 저장하는걸 나타낸다.

profile
前) 컴퓨터 공학과 학생 現)취준 백수

0개의 댓글