본문 바로가기

Rust

(25)
Rust. 컴파일 [1. 개요] Rust code 컴파일 방법에 대해서 정리하도록 한다. [2. rustc] rustc 는 러스트 소스코드에 대한 컴파일러 이다. 소스코드에 대해서 라이브러리 뿐만 아니라 실행파일 까지 컴파일이 가능하다. 보통은 rustc 를 직접 사용하여 컴파일 하지 않고, cargo 등을 이용해서 간접적으로 사용하게 된다. [3. 예제 - 1] hello world 출력
Rust. 에러 처리 [1. 개념] Rust 에서 에러는 크게 두가지 타입이 존재 복구 가능한 에러 복구 불가능한 에러 Rust 는 예외처리 기능이 없다. (try ~ catch 같은) 대신 복구 가능한 에러를 위한 Result 값과, 복구 불가능한 에러 발생 시 실행을 멈추는 panic! 매크로가 존재
Rust. 컬렉션 [1. 개요] 러스트 표준 라이브러리에 포함된 컬렉션이라 불리는 데이터 구조가 있다. 이 들은 내장된 배열 및 튜플과 달리 heap 에 저장된다. 즉, 데이터 양이 컴파일 타임에 결정되지 않아도 된다. 아래와 같은 타입이 있다. 1. Vector 2. String 3. HashMap [2. 벡터, (Vec)] 벡터를 생성하는 여러가지 방법 1. let v: Vec = Vec::new(); => vector 에 저장 할 타입에 대한 명시가 필요하다. 2. let v = vec![1, 2, 3]; => vec! 매크로를 사용하여 생성하는 방법 => i32 타입을 추론 할 수 있으므로, 타입 명시가 필수가 아니다. push 메소드 => vector 에 새로운 element 를 추가한다. => mut vecto..
Rust 전역 변수 참조 https://testkernelv2.tistory.com/299
Rust mod, pub, use [1. 개요] 러스트는 조직화된 방식으로 코드의 재사용을 할 수 있게 해주는 모듈 시스템을 갖추고 있다. keyword mod => 새로운 모듈을 선언한다. => 모듈 내의 코드는 이 선언 바로 뒤에 중괄호로 묶여서 따라오거나, 다른 파일에 놓을 수 있다. pub => 기본적으로 rust 는 함수, 타입, 상수, 모듈은 private 이다. => 이 키워드는 어떤 아이템을 외부에 노출 시킬 수 있게 한다. use => 모듈이나 모듈 내 정의 들을 스코프 안으로 가져온다. [2. mod 와 파일시스템] Library crate => 외부 프로젝트에서 의존성으로 추가 할 수 있는 프로젝트 cargo new communicator --lib 아래와 같은 파일시스템이 생성된다. communicator\ src ..
Rust io 성능에 대한 고찰 [1. 개요] 알고리즘 문제 풀이 시, 간혹 각 언어 별 I/O 성능을 향상해야만 풀리는 문제가 간혹 있다. C/C++ 에서는 보통 scanf(), printf() 를 사용하면 되고, Go 에서는 bufio 패키지를 사용한다. 여기서는 위와 같이 Rust 코드 작성 시 입출력 성능 향상을 위한 방법을 정리한다. [2. println! 매크로] println!() output stream lock으로 인해 다소 느리다. 그래서 아래와 같은 방법이 있다고 한다. 표준 출력에 대해 미리 lock 을 걸어두고 출력하거나, String 을 먼저 만든 뒤, print!() 를 통해 한번에 출력하는 방식 [3. 방법] 표준 입력에 대한 언급은 따로 없고, 가급적 Go 와 비슷한 패턴으로 코드를 작성하고자 아래와 같은..
Rust 열거형과 패턴 매칭 [1. 개요] 열거형은 하나의 타입이 가질 수 있는 값들을 열거 함으로써 타입을 정의할 수 있도록 한다. Option 이라는 열거형의 존재 (boost::optional 처럼 사용?) 열거형 값에 따른 분기를 위해 match 표현식과 , if let 구문 [2. 열거형 정의] enum IpAddr { V4(String), // 타입을 명시할 수 있다. V6(String), } enum Message { Quit, Move { x: i32, y: i32 }, // 익명 구조체 Write(String), // 문자열 ChangeColor(i32, i32, i32), // 튜플 } fn main() { let home = IpAddr::V4(String::from("127.0.0.1")); let loopba..
Rust 구조체 [1. 개요] 연관된 여러 값들을 묶어서 의미있는 데이터 단위로 정의한다. 연관함수 정의 방법을 정리한다. [2. 구조체 정의 및 생성] struct User { sign_in_count: u64, active: bool, } fn main() { let user1 = User { active: true, sign_in_count: 1, }; let user2 = user1; println!("{}", user2.sign_in_count); println!("{}", user1.sign_in_count); // 구조체 user1 은 Copy trait 을 구현하지 않아서 // 소유권이 이동하여, 컴파일에러가 발생한다. } 구조체는 mut 를 통해 멤버 변경이 가능하나, 특정 필드만 변경할 수 있도록 허용..
슬라이스 [1. 개요] 슬라이스는 소유권을 갖지 않는 데이터 타입이다. 컬렉션의 연속된 일련의 요소들을 참조 할 수 있게 한다. String::as_bytes().iter().enumerate() => (index, &item) [2. string slice] 범위는 다음과 같다. [start, end) let s = String::from("hello world"); let hello = &s[0..5]; let world = &s[6..11]; 아래와 같이 slice 범위를 정할 수 있다. [start..end] [..end] [start..] [..] fn first_word(s: &String) -> &str { let bytes = s.as_bytes(); for (i, &item) in bytes.it..
참조자와 빌림 [1. 개요] 값의 소유권을 넘기는 대신 개체애 대한 참조자를 사용하는 방법 변수 타입 앞에 & 을 표기한다. let s1 = String::from("hello"); let len = calculate_length(&s1); // s1 의 값을 참조하지만, 소유하지는 않는다. 주의 할 점은 참조자의 실 소유권이 사용 중 소멸되지 않아야 한다. 함수의 파라미터로 참조자를 만든 것을 빌림 이라고 한다. 참조자 역시 기본적으로 불변한다. [2. 가변 참조자] fn main() { let mut s = String::from("hello"); change(&mut s); } fn change(some_string: &mut String) { // &String -> &mut String some_string...