Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

튜플

튜플은 서로 다른 타입의 값들의 모음입니다. 튜플은 괄호 ()를 사용하여 생성되며, 각 튜플 자체는 (T1, T2, ...) 형태의 타입 시그니처를 가진 값입니다. 여기서 T1, T2는 튜플 멤버의 타입입니다. 튜플은 여러 값을 담을 수 있으므로 함수에서 여러 값을 반환하는 데 사용할 수 있습니다.

// 튜플은 함수의 인자와 반환값으로 사용될 수 있습니다.
fn reverse(pair: (i32, bool)) -> (bool, i32) {
    // `let`을 사용하여 튜플의 멤버를 변수에 바인딩할 수 있습니다.
    let (int_param, bool_param) = pair;

    (bool_param, int_param)
}

// 다음 구조체는 실습을 위한 것입니다.
#[derive(Debug)]
struct Matrix(f32, f32, f32, f32);

fn main() {
    // 여러 다른 타입을 가진 튜플입니다.
    let long_tuple = (1u8, 2u16, 3u32, 4u64,
                      -1i8, -2i16, -3i32, -4i64,
                      0.1f32, 0.2f64,
                      'a', true);

    // 튜플 인덱싱을 사용하여 튜플에서 값을 추출할 수 있습니다.
    println!("긴 튜플의 첫 번째 값: {}", long_tuple.0);
    println!("긴 튜플의 두 번째 값: {}", long_tuple.1);

    // 튜플은 튜플의 멤버가 될 수 있습니다.
    let tuple_of_tuples = ((1u8, 2u16, 2u32), (4u64, -1i8), -2i16);

    // 튜플은 출력 가능합니다.
    println!("튜플의 튜플: {:?}", tuple_of_tuples);

    // 하지만 긴 튜플(요소 12개 초과)은 출력할 수 없습니다.
    //let too_long_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
    //println!("Too long tuple: {:?}", too_long_tuple);
    // TODO ^ 위의 두 줄의 주석을 해제하여 컴파일 에러를 확인해 보세요

    let pair = (1, true);
    println!("페어는 {:?}입니다", pair);

    println!("반전된 페어는 {:?}입니다", reverse(pair));

    // 요소가 하나인 튜플을 만들려면, 괄호로 둘러싸인 리터럴과
    // 구분하기 위해 콤마가 필요합니다.
    println!("요소가 하나인 튜플: {:?}", (5u32,));
    println!("그냥 정수: {:?}", (5u32));

    // 튜플은 구조 분해(destructure)하여 바인딩을 생성할 수 있습니다.
    let tuple = (1, "안녕", 4.5, true);

    let (a, b, c, d) = tuple;
    println!("{:?}, {:?}, {:?}, {:?}", a, b, c, d);

    let matrix = Matrix(1.1, 1.2, 2.1, 2.2);
    println!("{:?}", matrix);
}

실습

  1. 요약: 위 예제의 Matrix 구조체에 fmt::Display 트레이트를 추가하여, 디버그 형식 {:?}에서 디스플레이 형식 {}로 출력을 전환했을 때 다음과 같은 출력이 나오도록 하세요:

    ( 1.1 1.2 )
    ( 2.1 2.2 )
    

    표시 출력에 대한 예제를 다시 참조하고 싶을 수도 있습니다.

  2. reverse 함수를 템플릿으로 사용하여 transpose 함수를 추가하세요. 이 함수는 행렬을 인자로 받아 두 요소가 바뀐 행렬을 반환합니다. 예를 들어:

    println!("행렬:\n{}", matrix);
    println!("전치(Transpose):\n{}", transpose(matrix));

    출력 결과:

    Matrix:
    ( 1.1 1.2 )
    ( 2.1 2.2 )
    Transpose:
    ( 1.1 2.1 )
    ( 1.2 2.2 )