Scalar Types에 대해서는 아래 글에서 살펴봤는데, 이번에는 상수와 복합 타입(Compound Types) 튜플과 배열을 살펴보겠습니다. 상수는 변하지 않는 값이며, 튜플은 다양한 타입의 값을 하나의 그룹으로 묶은 것이고, 배열은 동일한 타입의 값을 고정된 크기로 저장합니다.
🔷 상수 (Constants)
상수는 프로그램 전체에서 변하지 않는 값을 나타냅니다.
const MAX_POINTS: u32 = 100_000;
fn main() {
println!("최대 점수: {}", MAX_POINTS);
}
- 변수는 let 키워드를 사용하는데, 상수는 const 키워드를 사용하며 함수 외부/내부 모두 선언 가능
- 타입을 반드시 명시해야 하며(추론 적용되지 않음), 대문자+언더스코어로 표기하는 것이 관례입니다.
- 위 코드 중 100_000에서 _는 천 단위 구분 기호인 ,를 대체하는 기호입니다.

- const는 컴파일 타임에 값이 결정됨
참고: let로 선언한 변수는 mut로 변경 가능하지만, const는 절대 변경되지 않습니다.
fn main() {
const MAX_POINTS: u32 = 100_000;
MAX_POINTS += 10; // 상수는 변경할 수 없음, 이 줄은 오류를 발생시킴
println!("최대 점수: {}", MAX_POINTS);
}
MAX_POINTS를 변경하려고 하면 값을 할당할 수 없다는 에러가 발생합니다.

🔷 튜플 (Tuples)
튜플은 다양한 타입의 값을 하나의 그룹으로 묶습니다.
fn main() {
let person: (&str, u32) = ("Alice", 30);
let (name, age) = person;
println!("이름: {}, 나이: {}", name, age);
println!("튜플 직접 접근: {}", person.0);
}
- 괄호 안에 콤마로 구분되는 값들의 목록을 작성하여 튜플을 만듭니다.
- 고정된 길이와 순서를 가지며, 서로 다른 타입 허용
위 예에서는 &str, 다시 말해 스트링 슬라이스와 u32 정수 타입이 섞여 있습니다.
타입을 입력하지 않으면 추론되는데, 정수는 i32가 기본 타입이므로 i32로 추론됩니다. - . 문법으로 인덱스로 튜플의 요소에 접근 가능
위 예에서 person.0은 첫번째 값인 이름을 가리키고, .1을 하면 나이를 가리키게 됩니다.
튜플의 구조해체(destructuring)
튜플의 속성인 그룹을 해체하여 각각의 값을 개별 변수에 할당하는 것을 말합니다.
위 예에서 let (name, age) = person; 란 구문을 사용했는데,
person이란 튜플의 첫번째 요소는 name에, 두번째 요소는 age 변수에 할당하는 것입니다.
다시 말해 튜플은 구조해체 또는 .인덱스를 이용해 요소에 접근할 수 있습니다.
🔷 배열 (Arrays)
배열은 동일한 타입의 값을 고정된 크기로 저장합니다.
fn main() {
let scores: [i32; 3] = [90, 85, 78];
println!("첫 번째 점수: {}", scores[0]);
for score in scores.iter() {
println!("점수: {}", score);
}
}
- 대괄호 안에 값들을 콤마로 구분하여 나열해서 배열을 만듭니다.
- [i32; 3]와 같이 타입 뒤에 ;(:이 아님)을 붙이고 숫자를 쓰면, i32 타입 3개의 배열 의미
- let scores = [30; 10]; 이라고 입력하면 scores 배열에 정수 30을 10개 입력한 것이 됩니다.
- scores[0]처럼 대괄호안에 인덱스를 입력하여 배열의 요소에 접근 가능
- for와 .iter()를 이용해서 반복 가능
배열(Array)과 벡터(vector)
배열이 유용할 때는 항상 고정된 크기의 요소를 갖는데 비해서 벡터 타입은 유사 집합체로 표준 라이브러리에서 제공되며 크기를 확장 또는 축소가 가능합니다. 배열이나 벡터 중에 뭘 선택해야 할지 확실하지 않은 상황이라면 벡터를 사용하라고 합니다.
유효하지 않은 배열 요소에 대한 접근
아래에서 a배열의 가장 큰 인덱스가 4인데, 10으로 지정하고 cargo run을 하면
fn main() {
let a = [1, 2, 3, 4, 5];
let element = a[10];
println!("The value of element is: {}", element);
}
아래와 같이 길이가 5인데, 인덱스가 10이라는 경계를 벗어난 인덱스 에러가 발행합니다.

🧠 요약
항목 | 설명 |
---|---|
const | 변경 불가능한 상수, 타입 명시 필수 |
튜플 | 다양한 타입을 그룹화, 순서 중요 |
배열 | 동일한 타입, 고정된 크기, 인덱스로 접근 |