Rust 입문

[Rust] Vec

바로크냥 2022. 10. 19. 22:40

3. Vec

Vec 타입은 배열처럼 여러 원소를 저장할 수 있습니다. 물론 저장되는 원소들의 데이터 타입은 같아야 합니다. 여기까지는 배열과 동일합니다. 하지만 Vec 타입은 String처럼 길이를 변화시킬 수 있습니다. 왜냐하면 Vec 타입의 원소는 배열의 원소와 달리 heap에 저장되기 때문입니다.

앞에서 String의 길이를 변화시켜 보았습니다.

let mut s = String::from("welcome");
s.push_str(" to Rust");

Vec도 이와 같이 길이를 변화 시킬 수 있습니다.

let mut vec1 = vec![1,2,3,4];      // 1
 println!("{}", vec1.len());        // 2
 vec1.push(5);                      // 3
 println!("{}", vec1.len());

// 출력
4
5

// 1: Vec 타입을 만들 때는 vec! 매크로를 사용해서 간단히 만들 수 있습니다.

// 2: len() 메소드는 문자열이나 배열, vec 등의 길이를 계산해 줍니다.

// 3: vec1.push(5)는 원소 5를 vec의 제일 뒤에 추가합니다.

// 출력: vec1의 길이가 변했습니다. 

Vec 타입을 만드는 또 다른 방법이 있습니다. String을 타입 메서드를 사용해서 새로 만들 때와 비슷합니다.

new 메소드를 사용해서 새로운 객체를 만드는 것은 Rust 사용자들이 관습처럼 사용하는 코딩 스타일입니다.

  let mut vec2 = Vec::new();  // 1 비어 있는 Vec 생성
    let mut string1 = String::new();  

    vec2.push(1);                // 2
    string1.push_str("hello");

  // 1: 비어 있는 Vec 타입 변수를 만들었습니다.

// 2: 빈 vec2에 첫 요소를 push 메서드를 통해 넣으면 저장되는 요소의 데이터 타입이 추론에 의해 결정됩니다.

이후에 추가되는 원소들은 이 첫 번째 원소의 데이터 타입과 같아야 합니다.

 

Vec 타입 변수의 원소에 개별적으로 접근하려면 배열처럼 인덱스를 사용합니다.

   let mut vec3 = vec![1,2,3,4,5];
    println!("{} {}", vec3[2], vec3[4]);
    
// 출력
3 5

 

또 베열처럼 for ~ in 문으로 순회할 수도 있습니다.

 for i in vec3{
     print!("{}, ", i);
 }

// 출력
1, 2, 3, 4, 5,

 

이 밖에 유용한 몇 가지 메서드를 소개합니다.

   let mut vec3 = vec![1,2,3,4,5];
    let p = vec3.pop();
   println!("{}", p.unwrap());
   
    vec3.remove(2);
    println!("{:?}", vec3);
    
    let mut vec4 = vec![10,11,12];
    vec3.append(&mut vec4);
    println!("{:?}", vec3);

    vec3.insert(3, 100);
    println!("{:?}", vec3);

// 출력
5
[1, 2, 4]
[1, 2, 4, 10, 11, 12]
[1, 2, 4, 100, 10, 11, 12]

 

pop : 가장 마지막 요소를 반환하고 지웁니다.

remove: 해당 인덱스의 요소를 지웁니다.

append: 다른 Vec을 제일 뒤에 덧붙입니다.

파라미터가 &mut Vec 타입인 것에 주의하십시오.

insert: 지정한 인덱스에 주어진 값을 추가합니다.

 

 
 
 
 
반응형