[Chapter 8-1] Rust 벡터(vector)

hwwwa·2021년 11월 14일
1

🦀 Rust

목록 보기
20/25

새 벡터 만들기

비어있는 벡터 만들기

let v: Vec<i32> = Vec::new();

벡터에 어떠한 값도 집어넣지 않았기 때문에 저장하고자하는 요소의 타입을 명시해주어야 합니다.

초기값을 가지는 벡터 만들기

Rust는 vec! 매크로를 제공합니다. vec!은 초기값들을 저장하고있는 새로운 Vec 을 생성합니다.

let v = vec![1, 2, 3];

벡터 갱신: push

let mut v = Vec::new();

v.push(5);
v.push(6);
v.push(7);
v.push(8);

벡터 드롭

struct 와 마찬가지로 Vec 또한 스코프 밖으로 벗어날 때 해제됩니다

{
    let v = vec![1, 2, 3, 4];

    // somthing...

} // <- v가 스코프 밖으로 벗어났고, 여기서 해제됩니다

백터가 드롭될 때 내용물 또한 전부 드롭됩니다. 벡터가 가지고 있는 정수들이 모두 제거됩니다.

벡터 요소 읽기

벡터 내에 저장된 값을 참조하는 방법에는 인덱스 문법 사용과 get 메소드 사용이 있습니다.

let v = vec![1, 2, 3, 4, 5];

let third: &i32 = &v[2];
let third: Option<&i32> = v.get(2);

벡터 요소를 참조하는 두가지 방법을 제공하는 이유는 벡터가 가지고 있지 않은 인덱스값을 사용하고자 했을 때 프로그램이 어떻게 동작할 것인지 선택할 수 있도록 하기 위함입니다.

let v = vec![1, 2, 3, 4, 5];

let does_not_exist = &v[100];
let does_not_exist = v.get(100);

위 코드 실행 시, [] 메소드는 존재하지 않는 요소를 참조하기 때문에 panic! 을 일으킵니다. 프로그램이 벡터의 끝을 넘어서는 요소에 접근하는 시도를 하면 프로그램이 죽게끔 의도하는 경우에 가장 좋습니다.

get 메소드는 패닉없이 None 이 반환됩니다. 일반적인 환경에서 벡터 범위 밖의 요소에 접근하는 것이 종종 발생한다면 해당 방법이 좋습니다.

유효하지 않은 참조자

같은 스코프 내에서 가변 참조자와 불변 참조자를 함께 가질 수 없음을 기억해야합니다. 아래의 코드와 같은 상황은 에러가 발생합니다.

let mut v = vec![1, 2, 3, 4, 5];

let first = &v[0];

v.push(6);
error[E0502]: cannot borrow `v` as mutable because it is also 
borrowed asimmutable
  |
4 | let first = &v[0];
  |              - immutable borrow occurs here
5 |
6 | v.push(6);
  | ^ mutable borrow occurs here
7 | }
  | - immutable borrow ends here

벡터 내의 값들에 대한 반복처리

let v = vec![100, 32, 57];
for i in &v {
    println!("{}", i);
}
let mut v = vec![100, 32, 57];
for i in &mut v {
    *i += 50;
}

열거형을 사용해 여러 타입 저장하기

벡터는 같은 타입을 가진 값들만 저장할 수 있지만, 다른 타입의 값들에 대한 리스트를 저장해야할 때가 있습니다. 열거형의 variant는 같은 열거형 타입 내에 정의가 되므로 열거형을 사용해 벡터 내에 여러 타입을 저장할 수 있습니다.

enum SpreadsheetCell {
    Int(i32),
    Float(f64),
    Text(String),
}

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

Rust가 컴파일 타임에 벡터 내에 저장될 타입을 알아야하는 이유는 각 요소를 저장하기 위해 필요한 힙 메모리를 알기 위함입니다.

0개의 댓글