홈강좌Rust 입문·중급 47편 중 8편째
Rust 튜플 — 타입이 다른 값 몇 개를 하나로 묶는다
Rust 튜플은 타입이 다른 값 몇 개를 괄호로 묶은 값 하나다. .0·.1 처럼 번호로 꺼내고, let (a, b) = … 로 한 번에 나눠 담는다. 없는 번호를 쓰면 E0609 로 컴파일이 멈춘다.
01 괄호로 묶고 번호로 꺼낸다
서울의 날씨를 도시 이름(문자열)·기온(실수)·습도(정수) 셋으로 묶어 보자.
fn main() {
let seoul = ("Seoul", 23.5, 60);
println!("{}", seoul.0);
println!("{}", seoul.1);
println!("{}", seoul.2);
let (city, temp, humidity) = seoul;
println!("{city}: {temp} C, {humidity}%");
} Compiling weather v0.1.0 (~/projects/weather)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.17s
Running `target/debug/weather`
Seoul
23.5
60
Seoul: 23.5 C, 60%("Seoul", 23.5, 60)처럼 괄호 안에 쉼표로 늘어놓으면 튜플이다. 값마다 타입이 달라도 된다.- 꺼낼 때는
seoul.0처럼 점 뒤에 번호를 쓴다. 번호는 1 이 아니라 0 부터 센다. let (city, temp, humidity) = seoul;은 튜플을 풀어서 변수 셋에 차례로 담는다. 번호보다 이름이 읽기 쉬우니, 여러 번 쓸 값이면 이렇게 풀어 둔다.
튜플의 길이는 정해지면 바뀌지 않는다. 값을 더하거나 뺄 수 없다.
02 없는 번호를 쓰면 E0609
값이 셋인데 네 번째(.3)를 꺼내면 어떻게 될까.
fn main() {
let seoul = ("Seoul", 23.5, 60);
println!("{}", seoul.3);
} Compiling weather v0.1.0 (~/projects/weather)
error[E0609]: no field `3` on type `(&str, {float}, {integer})`
--> src/main.rs:3:26
|
3 | println!("{}", seoul.3);
| ^ unknown field
|
= note: available fields are: `0`, `1`, `2`
For more information about this error, try `rustc --explain E0609`.
error: could not compile `weather` (bin "weather") due to 1 previous error- 무엇 —
(&str, {float}, {integer})타입에는3이라는 칸(field)이 없다. 이 타입 이름이 곧 "문자열·실수·정수 세 칸짜리 튜플" 이라는 뜻이다. - 어디 — 3번째 줄
seoul.3의3. - 고치는 법 —
note:가 쓸 수 있는 번호를 알려 준다.0,1,2뿐이다.
튜플의 칸 수는 타입에 들어 있어서, 없는 칸은 실행하기 전에 컴파일러가 잡는다.
03 실습 — 내 도시 날씨로 바꿔 보기
tuple-basic 의 값을 사는 도시로 바꿔 돌려 보자. 그다음 튜플에 값을 하나 더 넣어(예: 풍속 3.2) 네 칸짜리로 만들고, let 으로 풀 때도 변수를 하나 더 둔다. 변수 수가 칸 수와 다르면 어떤 오류가 나는지도 확인해 보자. 2편의 세 군데로 읽으면 된다.
튜플은 함수가 값을 둘 이상 돌려줄 때 자주 쓴다(11편). 다음 편은 같은 타입의 값을 여러 개 담는 배열이다.
04 자주 묻는 질문
값이 하나뿐인 튜플도 있나?
있다. (5,) 처럼 쉼표를 꼭 붙인다. 쉼표가 없으면 (5) 는 그냥 괄호로 감싼 숫자 5 다. 값이 하나도 없는 () 도 있는데, 11편에서 "값 없음" 으로 다시 만난다.