hyunsu blog

홈강좌Rust 입문·중급 47편 중 9편째

Rust 배열 — 같은 타입 값을 정해진 개수만큼 담는다

목차 · 4
  1. 01대괄호로 담고 번호로 꺼낸다
  2. 02값을 바꾸려면 mut
  3. 03범위 밖 번호는 미리 막힌다
  4. 04실습 — 점수 배열 다루기

Rust 배열은 같은 타입의 값을 정해진 개수만큼 대괄호로 담는다. scores[0] 처럼 0 부터 센 번호로 꺼내고, len() 으로 길이를 본다. 범위 밖 번호는 컴파일러가 미리 막고, 실행 중에 알게 되면 패닉으로 멈춘다.

01 대괄호로 담고 번호로 꺼낸다

시험 점수 다섯 개를 배열에 담아 보자.

rust
fn main() {
    let scores = [72, 85, 90, 64, 88];

    println!("first: {}", scores[0]);
    println!("last: {}", scores[4]);
    println!("count: {}", scores.len());

    let zeros = [0; 3];
    println!("{zeros:?}");
}
text
   Compiling scores v0.1.0 (~/projects/scores)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.20s
     Running `target/debug/scores`
first: 72
last: 88
count: 5
[0, 0, 0]
  • [72, 85, 90, 64, 88] 처럼 대괄호 안에 늘어놓으면 배열이다. 튜플(8편)과 달리 모두 같은 타입이어야 한다.
  • scores[0] 이 첫 번째, scores[4] 가 다섯 번째다. 튜플처럼 0 부터 센다.
  • scores.len() 은 개수를 돌려준다. 점 뒤에 이름과 괄호를 붙여 부르는 것을 메서드라 하는데, 23편에서 직접 만든다.
  • [0; 3] 은 "0 을 3개" 라는 뜻이다. 같은 값으로 채운 배열을 만들 때 쓴다.

{zeros:?} 처럼 이름 뒤에 :? 를 붙이면 배열을 통째로 [0, 0, 0] 모양으로 찍는다. 그냥 {zeros} 로는 찍히지 않는다. :? 는 "개발자가 보는 모양으로 찍어라" 는 표시다.

배열의 길이는 타입에 들어 있다. 5개짜리 배열은 늘리거나 줄일 수 없다. 길이가 바뀌어야 하면 28편의 Vec 을 쓴다.

02 값을 바꾸려면 mut

배열도 변수라서, 안의 값을 바꾸려면 mut 를 붙인다(3편).

rust
fn main() {
    let mut scores = [72, 85, 90];
    scores[0] = 75;
    println!("{scores:?}");
}
text
   Compiling scores v0.1.0 (~/projects/scores)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.17s
     Running `target/debug/scores`
[75, 85, 90]

scores[0] = 75; 로 첫 번째 칸만 바꿨다. mut 를 빼면 3편과 같은 종류의 오류가 난다.

03 범위 밖 번호는 미리 막힌다

5개짜리 배열에서 6번째(scores[5])를 꺼내 보자.

rust
fn main() {
    let scores = [72, 85, 90, 64, 88];
    println!("{}", scores[5]);
}
text
error: this operation will panic at runtime
 --> src/main.rs:3:20
  |
3 |     println!("{}", scores[5]);
  |                    ^^^^^^^^^ index out of bounds: the length is 5 but the index is 5
  |
  = note: `#[deny(unconditional_panic)]` on by default
  1. 무엇 — 이 연산은 실행하면 패닉한다(will panic at runtime).
  2. 어디 — 3번째 줄 scores[5]. 길이가 5 인데 번호가 5 다. 0 부터 세니 마지막 번호는 4 다.
  3. 고치는 법 — help: 는 없다. 번호를 len() - 1 이하로 고친다.

번호가 코드에 숫자로 박혀 있으면 컴파일러가 미리 계산해서 막는다. 번호가 실행 중에 정해지면(계산한 값, 입력받은 값) 미리 알 수 없다. 그때는 실행 중에 index out of bounds 패닉으로 멈춘다. 다른 언어처럼 배열 밖의 엉뚱한 메모리를 읽는 일은 없다.

04 실습 — 점수 배열 다루기

array-basic 에 점수를 하나 더 넣어 여섯 개로 만들어 보자. count 가 6 이 되고, 마지막 점수를 꺼내려면 scores[5] 로 고쳐야 한다. scores[1] + scores[2] 처럼 칸끼리 더한 값도 찍어 본다. 점수가 수십 개면 번호를 하나씩 쓰기 어렵다. 배열을 처음부터 끝까지 도는 법은 14편의 for 에서 다룬다. 다음 편은 코드를 이름 붙인 묶음으로 나누는 함수다.