[Rust] Vec
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: 지정한 인덱스에 주어진 값을 추가합니다.