홈강좌Rust 입문·중급 47편 중 9편째
Rust 배열 — 같은 타입 값을 정해진 개수만큼 담는다
Rust 배열은 같은 타입의 값을 정해진 개수만큼 대괄호로 담는다. scores[0] 처럼 0 부터 센 번호로 꺼내고, len() 으로 길이를 본다. 범위 밖 번호는 컴파일러가 미리 막고, 실행 중에 알게 되면 패닉으로 멈춘다.
01 대괄호로 담고 번호로 꺼낸다
시험 점수 다섯 개를 배열에 담아 보자.
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:?}");
} 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편).
fn main() {
let mut scores = [72, 85, 90];
scores[0] = 75;
println!("{scores:?}");
} 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])를 꺼내 보자.
fn main() {
let scores = [72, 85, 90, 64, 88];
println!("{}", scores[5]);
}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- 무엇 — 이 연산은 실행하면 패닉한다(will panic at runtime).
- 어디 — 3번째 줄
scores[5]. 길이가 5 인데 번호가 5 다. 0 부터 세니 마지막 번호는 4 다. - 고치는 법 —
help:는 없다. 번호를len() - 1이하로 고친다.
번호가 코드에 숫자로 박혀 있으면 컴파일러가 미리 계산해서 막는다. 번호가 실행 중에 정해지면(계산한 값, 입력받은 값) 미리 알 수 없다. 그때는 실행 중에 index out of bounds 패닉으로 멈춘다. 다른 언어처럼 배열 밖의 엉뚱한 메모리를 읽는 일은 없다.
04 실습 — 점수 배열 다루기
array-basic 에 점수를 하나 더 넣어 여섯 개로 만들어 보자. count 가 6 이 되고, 마지막 점수를 꺼내려면 scores[5] 로 고쳐야 한다. scores[1] + scores[2] 처럼 칸끼리 더한 값도 찍어 본다. 점수가 수십 개면 번호를 하나씩 쓰기 어렵다. 배열을 처음부터 끝까지 도는 법은 14편의 for 에서 다룬다. 다음 편은 코드를 이름 붙인 묶음으로 나누는 함수다.