튜플 타입
튜플 타입
여러 개의 타입을 순서대로 묶어 하나의 타입으로 만들고 싶을 때가 있어요. Rust에서는 그럴 때 튜플 타입(tuple type) 을 사용해요. 튜플은 서로 다른 타입을 원하는 만큼 나열해서 만들 수 있는 구조적 타입의 한 종류랍니다.
본문
튜플 타입은 다른 타입들의 이질적인 목록(heterogeneous list) 을 담기 위한 구조적 타입(structural type) 계열이에요. 문법은 괄호로 감싸고 쉼표로 구분한 타입 목록이에요.
TupleType ->
( )
| ( ( Type , )+ Type? )
여기서 주의할 점이 하나 있어요. 1-ary 튜플(원소가 하나인 튜플)은 괄호로 감싼 타입 (Type)과 구분하기 위해 타입 뒤에 반드시 쉼표를 붙여야 해요. 그래서 (i32,)처럼 써야 (i32)와 다르게 취급되지요.
튜플 타입이 갖는 필드의 개수는 목록의 타입 개수와 같아요. 이 개수가 바로 튜플의 항수(arity) 가 돼요. 필드가 n개면 n-ary 튜플이라고 불러요. 예를 들어 필드가 2개면 2-ary 튜플이에요.
필드 이름은 목록에서의 위치를 나타내는 증가하는 숫자로 붙어요. 첫 번째 필드는 0, 두 번째는 1, 이런 식으로 이어져요. 각 필드의 타입은 튜플 타입 목록의 같은 위치에 있는 타입이에요.
편의상, 그리고 역사적인 이유로 필드가 없는 튜플 타입 ()를 unit(유닛) 또는 unit 타입이라고 부르는 경우가 많아요. 이 타입의 유일한 값도 unit 또는 unit 값이라고 불러요.
몇 가지 튜플 타입 예시를 볼게요.
() // unit
(i32,) // 1-ary 튜플
(f64, f64)
(String, i32)
(i32, String) // 위 (String, i32)와는 다른 타입
(i32, f64, Vec<String>, Option<bool>)
이 타입의 값은 튜플 표현식(tuple expression) 으로 만들어요. 그리고 여러 표현식이 결과로 의미 있는 값이 없을 때는 unit 값을 만들어내기도 해요. 튜플의 필드에는 튜플 인덱스 표현식이나 패턴 매칭으로 접근할 수 있어요.
한 가지 더 알아둘 점은, 튜플은 구조적 타입이라 내부 타입이 같으면 항상 서로 동등하다고 취급돼요. 튜플의 명목적(nominal) 버전이 필요하다면 튜플 구조체(tuple struct) 를 쓰면 돼요.
더 알아보기 (Learn more)
- Rust Reference - Struct expressions — 튜플 구조체와의 차이를 이해할 때 도움이 돼요.
- Rust Reference - Types