본문 바로가기
Language/Rust

데이터 구조화

by y.j 2021. 10. 6.
728x90

문자열

러스트는 두가지 유형의 문자열로 구성되어 있다.
&str : 문자열 슬라이스 타입 ; 불변하며 고정된 크기를 갖는다.

let magician1 = "Merlin";
let greeting = "Hello, !";

&'static str: 문자열이 정적으로 할당되었음을 의미
프로그램이 끝날 때까지 존재(정적 수명 - static lifetime - )

let magician2: &'static str = "Gandalf";

동적 문자열 만드는 방법
&[..] : 리소스를 소모하지 않음
to_string() : 힙 메모리를 할당함

let mut str1 = String::new();
let mut str2 = String::with_capacity(25);
let mut str3 = magician1.to_string();
let sl1 = &str3;
let sl2 = &[..]

배열

정의

let aliens = ["Cherfer", "Fynock", "Shirack", "Zuxu"]
let zuxus = ["Zuxu"; 3]  // 배열 초기화 방법
let mut empty: [i32; 0] = []; // 빈배열

배열의 반복문

for ix in 0..aliens.len() 
for a in aliens.iter()
for a in &aliens

벡터

정의

let mut numbers: Vec<i32> = Vec::new();
let mut magic_numbers = vec![7i32, 42, 47, 45, 54];
let mut ids: Vec<i32> = Vec::with_capacity(25);     // 메모리 할당
let rgec: Vec<u32> = (0..7).collect();

반복문

let values = vec![1,2,3];
for n in values {
    println!("{}", n);
}

슬라이스

벡터나 배열의 일부만을 취하는 것

let slc = &magic_numbers[1..4]; // 마지막 4는 제외된다.
  • 제네릭이고 T 타입에 대해 &[T]타입을 갖는다.
  • 컴파일 타임에 크기를 알 수 없다.

문자열과 배열

Vec와 Vec(&str)을 잘 구별 할 필요가 있다.

let magician = "Merlin";
let mut chars: Vec<char> = magician.chars().collect();
chars.sort();
let v: Vec(&str) = "The wizard of 0z".split(' ').collect();
let v: Vec(&str) = "abc1def2ghi".split(|c.: char| c.is_numeric()).collect();

튜플

서로 다른 타입을 갖는 타입

let thor = ("Thor", true, 3500u32);
println!("{:?}", thor);

데이터 불러오기

println!("{} - {} - {}", thor.0, thor.1, thor.2);

튜플형으로 함수 return

fn increase_power(name: &str, power: u32) -> (&str, u32) {
  if power > 1000 {
      return (name, power * 3);
  }
  else {
      return (name, power *2 );
  }
}

let (god, strength) = increase_power(thor.0, thor.2); 

구조체

정의 : 구조체의 인스턴스는 캐멀케이스로 시작하여야 한다.

struct Player {
    nname: &'static str,
    health: i32,
    level: u8
}

let mur pl1 = Player{ nname: "Dzenan", health: 73, level: 2 };

let ps = &Player{ nname: "John", health: 95, level: 1 };
println!("{} == {}", ps.nname, (*ps).name);
fn main () {
    // 튜플 구조체
    struct Kilograms(u32);             // 오직 하나의 필드를 갖는 구조체 : 튜플 구조체
    struct Score(i32, u8);             // 정의하는 방법
    let score1 = Score(73, 2); 
    let Score(h, l) = score1; // 변수로 해체 하는 방법
    println!("Health {} - Level {}", h, l);
}

열거체

정의 : 내용물이 제한된 개수를 가질 때, 이중 오직 하나만 할당해야 한다.

enum Compass {
    North, South, East, West
}

let direction = Compass::West;

예제

use PlanetaryMonster::MarsMonster;

type species = &'static str;

enum PlanetaryMonster {
    VenusMonster(species, i32),
    MarsMonster(species, i32)
}

fn main () {
    let martian = MarsMonster("Chela", 42);
}

결과 : 무언가가 실행될 때마다 사용한다.

  • 성공할 경우 특정타입 T의 Ok값이 반환된다.
  • 오류가 발생할 경우 E의 Err값이 반환된다.
enum Result<T, E> {
    Ok(T),
    Err(E)
}

옵션 : 값의 존재 유뮤를 확인할 때 사용

  • 값이 존재하는 경우 Some이다.
  • 값이 없는 경우 None이다.
    enum Option<T> {
      Some(T), 
      None
    }
728x90

'Language > Rust' 카테고리의 다른 글

고차원 함수와 매개변수화를 통한 코드 일반화  (0) 2021.10.09
패턴매칭  (0) 2021.10.08
함수와 제어문  (0) 2021.10.06
변수  (0) 2021.10.04
Rust의 장점 및 특징  (0) 2021.10.04

댓글