C.W.K.
Stream
Lesson 01 of 06 · published

Vec — 자라는 배열

~10 min · collections, vec, heap

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

Collections 트랙은 배운 모든 것 — 소유권, 빌림, 제네릭, trait — 이 매일 쓰는 자료구조에서 본전을 뽑는 곳이야. 제일 흔한 것부터 시작해: Vec<T>, 자라는 배열.

자라는 힙 할당 시퀀스

Vec<T> 는 한 타입 T 의 값을 몇 개든 들고, push 하면 자라. 컴파일 타임 고정 길이의 배열 [T; N] 과 달리, 벡터는 힙에 살고 런타임에 자라. Rust 에서 '뭔가의 리스트가 필요해' 의 기본 타입이야.

push, 인덱스, 순회

추가는 push, 인덱싱은 [i] (범위 초과 panic) 나 get(i) (Option 반환, panic 없음), 순회는 for x in &v. 소유권 규칙이 적용돼: &v 순회는 빌리고, &mut v 는 가변으로 빌리고, v 는 소비해. borrow checker 가 순회 중 벡터에 push 하게 안 둬 — iterator-invalidation 버그, 제거됨.

인덱스가 범위 밖일 수 있으면 [] 보다 get(). v[i]i 가 너무 크면 panic; v.get(i)Option<&T> 를 반환해서 빠진 경우를 안전하게 다뤄. 범위를 이미 증명했으면 인덱싱; 인덱스가 외부에서 오면 get.

vec! 과 용량

vec![1, 2, 3] 매크로가 인라인으로 하나 지어. 내부적으로 Vec 은 길이랑 용량을 가져; 용량 너머로 push 하면 더 큰 버퍼로 재할당해 (amortized O(1)). 크기를 미리 알면 Vec::with_capacity(n) 이 미리 할당하고 재성장을 건너뛰어.

Code

push, 안전한 get(), 순회·rust
fn main() {
    let mut scores = vec![90, 85, 100];
    scores.push(70);              // 런타임에 자람

    // 안전한 접근: get() 은 Option 반환, panic 없음
    if let Some(first) = scores.get(0) {
        println!("first: {first}");
    }
    println!("missing: {:?}", scores.get(99)); // None

    // 참조로 순회 (빌리고, 소비 안 함)
    let total: i32 = scores.iter().sum();
    println!("total: {total}");
}

External links

Exercise

Vec<i32> 를 짓고, 값 여러 개를 push 하고, 한 인덱스는 [] 로 다른 (범위 밖) 인덱스는 .get() 으로 접근해. [] 는 나쁜 인덱스에 panic 하고 .get()None 을 반환하는 걸 봐. 그다음 .iter() 로 순회하며 값을 합산해. borrow checker 는 왜 for x in &v 루프 안에서 push 를 막아?
Hint
push 가 벡터 버퍼를 재할당해서 루프가 든 참조를 무효화할 수 있어. borrow checker 가 컴파일 타임에 거부해 — 전형적인 iterator-invalidation 크래시, 불가능하게 만들어진.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.