[Rust] 데이터 타입
Updated:
개요
- 스칼라
- 하나의 값으로 표현되는 타입
- 정수형, 부동소수점 숫자, 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(); }
-
- 실행 결과
-
. . . ...
-