관리 메뉴

평행우주 : world 1

[Rust] 러스트 데이터 타입 : scalar, Compound, 문자열 본문

텃밭 1 : BlockChain/Rust

[Rust] 러스트 데이터 타입 : scalar, Compound, 문자열

parallelworlds 2022. 4. 8. 21:07

 

 

Rust 데이타 타입

Statically Type Language

프로그램 상의 모든 데이터 타입을 컴파일 시점에 결정한다

컴파일 시점에, 각 타입에 위배되는 코드가 있을 경우 에러가 발생한다

let으로 선언된 변수의 경우, 데이터 타입이 결정되지 않은 경우 러스트 컴파일러가 추론 결정한다

 

 

 


스칼라 타입(Scalar Type)

하나의 값을 갖는 타입

정수형, 부동소수점형, 불린형, 문자형이 있다

 

정수형 

fn main() {
    let a: i32 = 1_000_000; // 10진수, 백만 | 가독성을 높이기 위해 _사용 가능
    let a = 0xff;    // 16진수
    let a = 0o15;    // 8진수
    let a =  0b1111_1111; // 2진수
    let a: u8 = b'A';   // 바이트 (앞에 b를 붙임)
}

i8, u16, i32, u64, i128, usize 와 같이 정수를 포함하는 타입

부호가 있을 경우 : i

부호가 없는 경우 : u

 

 

 

부동소수점형

let a: f32  = 3.14;   // f32
let b = 3.14;         // f64

f32, f64 존재

부동소수점 타입을 지정하지 않는 소수값은 컴파일러가 디폴트로 f64를 지정

 

 

불린형

let a: bool = false;

 

 

문자형

let a: char = 'A';    // U+0041

char 키워드를 사용

4바이트 크기

U+0000 ~ U+D7FF와 U+E000 ~ U+10FFFF 범위의 유니코드 스칼라 값을 가질 수 있다.

이러한 유니코드 문자가 아닌, 1 바이트의 값을 표현하기 위해서는 u8 타입을 사용

 

 

 


복합 타입(Compound Type)

여러개의 값들로 구성된 타입

배열(Array)과 튜플(Tuple)

 

 

배열(Array)

let arr: [i32; 3] = [1, 2, 3];   // 3개의 정수배열 
 
println!("{}", arr[0]);   // 배열 첫번째 요소 출력
 
println!("{:?}", arr);    // 배열전체를 출력

동일한 데이타 타입을 갖는 요소들의 집합

고정된 길이를 갖는다

러스트에서 배열은 스택에 할당된다

배열값을 지정할 때, [1; 100] 과 같이 세미콜론을 사용하면, 이는 [1, 1, ..., 1] 와 같이 1을 100개 지정하는 것

 

 

튜플(Tuple)

let dat: (i32, char, bool) = (1, 'A', true);
let usr = ("Tom", 'B');

여러 데이타 타입의 값들을 하나로 묶은 것

괄호를 사용하고 각 타입이나 값들을 콤마로 분리

튜플이 한번 정의되면, 새로운 요소를 추가하거나 기존 요소를 삭제할 수 없다

 

let dat: (i32, char, bool) = (1, 'A', true);
let a = dat.0; //1
let b: char = dat.1; //A
let c: bool = dat.2; //true
let dat: (i32, char, bool) = (1, 'A', true);
let (a, b, c) = dat; //Destructuring : 튜플 전체를 읽어 여러 변수들에 나누어 할당

 

 

 


문자열 타입

일반적으로 &str 타입과 String 타입을 사용

 

 

 

&str

fn main() {
    let s = "hello";    // let s: &'static str = "hello"; 와 동일
    println!("{}", s);
}

//변수 s는 &'static str 타입으로 문자열 리터럴 "hello" 에 대한 레퍼런스(reference)

문자열을 표현하는 Primitive 문자열 타입

str 타입은 항상 레퍼런스이기 때문에, 실제 코드에서는 &str 와 같이 사용

문자열 리터럴은 코드 바이너리에 직접 저장

프로그램의 실행기간 동안 계속 존재하여 'static 이라는 키워드 추가

&str의 &는 레퍼런스를 의미

 

문자열 리터럴을 변수에 할당할 때 사용 (&'static str 타입)

다른 변수가 소유한(owned) 문자열의 일부를 슬라이스하여(&str 타입) 가져올 때 사용

 

 

 

//변수 s가 소유한(own) 문자열의 일부 범위를 문자열 슬라이스하여 변수 sub에 넣는 예제
fn main() {
    let s = "hello";  
    let sub: &str = &s[1..4]; //&s[1..4] 는 요소1 부터 요소3까지의 범위 즉 "ell" 을 가리킨다
    println!("{}", sub);    // "ell" 출력
}

범위(range)를 지정할 때 [시작..마지막] 와 같이 표현하는 마지막위치는 실제 마지막위치의 다음 인덱스를 넣는다

 

 

 

fn main() {
    let s: &'static str = "hello";  
 
    // &str 타입을 String 타입으로 변환
    let x: String = s.to_owned();
 
    println!("{}", x);
}

&str 타입을 String 타입으로 변환하기 위해서는 to_owned() 함수 사용

 

+)

to_string()은 임의의 타입을 String 타입으로 변환

to_string()은 많은 메모리를 사용하므로 &str 타입에서는 to_owned() 함수를 사용하는 것이 좋다

 

 

 

String

fn main() {
    let s = String::from("hello");  
    // String::from() > 문자열 리터럴을 String 타입으로 
    // let s: String = "hello".to_owned(); // 동일
 
    println!("{}", s);
}

Heap 메모리 상에 문자열을 저장

문자열 메모리에 새 문자들을 추가하거나 수정할 수 있다

 

 

fn main() {
    let mut s = String::new();   // 새로운 empty string 생성
    // 빈 문자열이므로 문자를 추가하기 위해 변수를 mut로 만들어준다
    s.push('H');           // 문자 추가
    s.push('i');           // 문자 추가
    s.push_str(" Tom");  // 문자열 추가
     
    println!("{}", s);  // "Hi Tom" 출력
}
fn main() {
//String::replace() 함수를 사용 > 문자열의 일부를 다른 문자들로 치환
    let mut s = String::from("Hello Bill");
    s = s.replace("Hello", "Hi");
     
    println!("{}", s); // "Hi Bill" 출력
}

 

 

 

 

 

'텃밭 1 : BlockChain > Rust' 카테고리의 다른 글

[Rust] 러스트 변수(variable) 특성  (0) 2022.04.08
[Rust] 러스트 Cargo 사용법  (0) 2022.04.08
Comments