ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Rust] collection(1)-vector
    rust 2023. 2. 6. 18:03
    반응형

    앞서 3장에서 rust의 기본 데이터 타입에 대해서 살펴봤다. 돌아보면 스칼라타입과 컴파운드타입이 있었고 스칼라 타입에는 integer, float, boolean, char 타입이 있었고 컴파운드타입에는 tuple, array 타입이 있었다.

     

    위의 타입들과 컬렉션의 다른점은 프로그램이 런타임중에 늘어나거나 줄어들수 있는 데이터이기 때문에 데이터가 스택이 아닌 힙에 저장이 되게 된다. 컬렉션의 종류로는 vertor, string, hash map 3가지가 있으며 하나씩 정리해보자

     

    Vector

    array와 유사하게 동일타입의 여러값을 단일 데이터 구조안에 저장하는 타입이다 그러나 벡터는 길이가 런타임중에 변경 될수 있다라는 차이가 있다. 아래예시와 같이 표준라이브러리를 이용해서 생성하는 방법과 러스트의 매크로 함수를 사용해서 생성하는 2가지의 방법이 있다.

    let v: Vec<i32> = Vec::new();
    let v = vec![1, 2, 3];

     

    vector의 push 메서드를 통해 요소를 추가할수 있으나 변수를 mut 키워드를 통해 가변적으로 만들어 줘야한다.

    vector 에 요소에 접근하는 방법은 index를 통해서 접근하는 방법과 get 메서드를 통해서 접근하는 두가지 방법이 있다.

    let v = vec![1, 2, 3, 4, 5];
    
    let third: &i32 = &v[2];
    let third: Option<&i32> = v.get(2);

    get 메서드를 사용하게 될경우 반환값은 Option type 이며 panic 발생하지 않도록 요소가 존재하지 않는 경우를 처리해줄수 있다.

    이때 ownership reference rule 중에 가변참조자는 단독으로 사용되어야하며 불변참조자와 같이할수 없는 룰이 있는데 그부분을 주의해야한다.

    let mut v = vec![1, 2, 3, 4, 5];
    
    let first = &v[0]; // - immutable borrow occurs here
    
    v.push(6); // - mutable borrow occurs here

    위와 같은 예시인 데 &v[0] = 불변참조자가 이미 스코프 내에 존재하기 때문에 v.push 에서 가변참조자를 만들어 낼수 없어 에러가 난다.

    이는 힙의 위치가 크기의 변경에 의해 부족하다면 변경될수 있기때문에 다른 레퍼런스의 참조값이 비어있는 힙을 가리킬 위험이 있기때문에 위와 같은 룰로 상황을 막아준다.

     

    vec 는 하나의 타입의 데이터만 들어갈수 있는데 enum을 사용하면 다양한 타입을 사용할수도 있다.

    enum SpreadsheetCell {
        Int(i32),
        Float(f64),
        Text(String),
    }
    
    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Text(String::from("blue")),
        SpreadsheetCell::Float(10.12),
    ];

    'rust' 카테고리의 다른 글

    [Rust] 7. 모듈시스템에 대하여  (0) 2023.02.05
    [Rust] 6. enum과 match에 대하여  (0) 2023.02.02
    [Defi] 디파이 시작해보기(1)  (0) 2023.02.01
    [Rust] 5. struct에 대하여  (0) 2023.01.31
    [Rust] 4.ownership(3). slice  (0) 2023.01.28
Designed by Tistory.