2 분 소요

개요

  • 스칼라
    • 하나의 값으로 표현되는 타입
      • 정수형, 부동소수점 숫자, boolean, 문자
  • 컴파운드
    • 같은 타입 혹은 다른 타입의 다양한 값들을 하나의 타입으로 표현
      • 배열, 튜풀
  • 컬렉션
  • 슬라이스
    • 컬렉션 전체가 아닌 컬렉션의 연속된 일련의 요소들을 참조
    • 참조형이므로 소유권을 갖지 않음
    • 스트링 리터럴은 스트링 슬라이스(str)
  • 타입 별칭(type alias)
    • 존재하는 타입에게 다른 이름을 부여
    • type 키워드를 사용
  • !
    • 빈 타입(empty type) 혹은 부정 타입(never type)
    • 발산 함수(diverging function)(반환하지 않는 함수)임을 명시
    • break 없는 loop 등
  • 동적인 크기의 타입(DST - Dynamically Sized Type) 혹은 크기 없는 타입(unsized type)
    • 런타임에서만 크기를 알 수 있는 값을 이용하는 코드를 작성할 수 있게 해줌
    • &T 혹은 Box 혹은 Rc 이용
  • Sized 트레잇
    • 크기가 컴파일 타임에 알려진 모든 것들에 대해 자동으로 구현
    • 암묵적으로 모든 제네릭 함수들에게 Sized를 바운드로 추가
    • fn test<T>(t: T) { -> fn test<T: Sized>(t: T) {
    • ?Sized 트레잇 바운드
      • Sized 트레잇 바운드의 반대 개념
      • fn test<T: ?Sized>(t: &T) {
      • T가 Sized 일수도 있고 아닐 수도 있다는 의미
      • Sized가 아닐수도 있으므로 포인터 필요


예제

  • 코드

        fn main() {
            {
                let i: i8 = 0;
                let u: u8 = 0;

                let i: i16 = 0;
                let u: u16 = 0;

                let i: i32 = 0;
                let u: u32 = 0;

                let i: i64 = 0;
                let u: u64 = 0;

                let i: isize = 0;
                let u: usize = 0;

                let f: f32 = 1.0;
                let f: f64 = 1.0;

                let b: bool = true;
                let b: bool = false;

                let c: char = 'a';
            }

            {
                let a = [1, 2, 3, 4, 5];
                println!("1 : {}, {}", a[0], a[1]);

                let tuple: (i32, f64, char) = (1, 1.0, 'a');
                println!("2 : {}, {}, {}", tuple.0, tuple.1, tuple.2);
                let (i, f, c) = tuple;
                println!("3 : {}, {}, {}", i, f, c);
            }

            {
                let s1 = String::from("aaa");
                println!("4 : {}", s1);

                let mut s2 = String::from("aaa");
                s2.push_str(", bbb");
                println!("5 : {}", s2);
            }

            {
                let s = String::from("abcdefg");

                let slice = &s[..];
                println!("7 : {}", slice);
                println!("8 : {}", &s[0..]);
                println!("9 : {}", &s[..s.len()]);
                println!("10 : {}", &s[0..s.len()]);
                println!("11 : {}", &s[0..2]);
                println!("12 : {}", &s[..2]);
                println!("13 : {}", &s[1..3]);

                let a = [1, 2, 3, 4, 5];
                let slice = &a[1..3];
                println!("14 : {}", slice[0]);
            }

            {
                let s: &str = "abcdefg";
                println!("14 : {}", s);
            }
        }
  • 실행 결과

        1 : 1, 2
        2 : 1, 1, a
        3 : 1, 1, a
        4 : aaa
        5 : aaa, bbb
        7 : abcdefg
        8 : abcdefg
        9 : abcdefg
        10 : abcdefg
        11 : ab
        12 : ab
        13 : bc
        14 : 2
        15 : abcdefg


예제 - 타입 별칭(type alias)

  • 코드

        type Type1 = i32;

        fn main() {
            let i1: Type1 = 1;
            let i2: i32 = 2;

            println!("{}, {}, {}", i1, i2, i1 + i2);
        }
  • 실행 결과

        1, 2, 3


예제 - !

  • 코드

        fn func() -> ! {
            loop {
                println!(".");
            }
        }

        fn main() {
            func();
        }
  • 실행 결과

.
.
.
...