Rust, 쉽게 하자!

Rust 57

[Rust] cargo fmt 그리고 cargo clippy

cargo fmt 그리고 cargo clippy 유용한 cargo tool 두 가지를 소개합니다. fmt는 cargo가 제공하는 Rust용 코드 formatter입니다. 코드를 예쁘게 정렬시킵니다. clippy는 우리가 작성한 코드의 오류를 잡아주기도 하고 불필요한 코드를 알려 주기도 합니다. 오류 없고 깨끗한 코드를 작성하기 위해 꼭 필요한 도구입니다. 두 가지 모두 처음 사용할 때 cargo로 추가 설치를 해주어야 합니다. - fmt 추가 cargo component add fmt - clippy 추가 cargo componrnt add clippy 이제 사용법을 알아봅시다. f먼저 cargo mt입니다. fn main() { let a=10;letb=20; let c = a*b; println!("..

Rust 중급 2022.11.08

[Rust] 코드 실행 랩타임 측정하기

코드 실행 랩타임 측정하기 Rust의 standard library인 time을 활용해서 코드 실행 시간을 측정하는 방법을 소개합니다. 코드 보겠습니다. use std::time::Instant; // 팩토리얼을 구하는 함수 fn factorial(n: u128) -> u128 { match n { 0 => 0, 1 => 1, _ => factorial(n - 1) * n } } fn main() { let n = 25; let now = Instant::now(); // 현재 시각 let result = factorial(n); let lap = now.elapsed().as_nanos(); // 랩타임 측정 println!("factorial({})={}, lap : {} ns", n, result,..

Rust 중급 2022.11.02

[Rust] macros - declarative macros

macros - declarative macros Rust를 처음 사용할 때 대부분 println!()을 접하게 됩니다. println!()은 C의 ptintf() 함수처럼 사용할 수 있지만 함수가 아닙니다. 매크로 (macros)입니다. Vet! 도 매크로입니다. 매크로는 이름 뒤에 ‘!’가 붙어서 함수와 구분됩니다. 매크로는 컴파일러가 컴파일할 때 프로그래머가 의도한 코드를 생성하게 합니다. Metaprogramming의 일종입니다. Rust의 매크로는 크게 두 종류가 있습니다. Declarative macros와 procedural macros. 이 글에서는 declarative macros만 다루고 procedural macros는 다음 기회에 소개하겠습니다. 다음 코드를 보면서 declarati..

Rust 중급 2022.10.30

[Rust] Arc, Mutex (스레드의 데이터 공유)

5. Arc, Mutex. (스레드의 데이터 공유) 스레드 사이에 데이터를 교환하는 방법은 크게 두 가지가 있습니다. 앞 장에서 본 Message passing과 이번 장에서 볼 데이터 공유입니다. Message passing은 채널을 통해서 데이터를 진짜 주고받는 방식입니다. 반면에 데이터 공유 방식은 데이터를 주고 받는 대신 메모리의 데이터를 공유해서 스레드 사이의 통신을 달성하는 방법입니다. Rust는 스레드 사이의 데이터 공유를 달성하기 위해 Arc와 Mutex를 사용합니다. Arc와 Mutex는 스마트 포인터입니다. 이미 공부했던 스마트 포인터, Rc, Cell, RefCell 등은 하나의 스레드에 자리 잡고 있습니다. 다른 스레드의 스마트 포이터와 그 데이터를 사용할 수는 없습니다. Arc는 ..

Rust 입문 2022.10.28

[Rust] Message passing ( channel로 다른 스레드의 값 사용 하기 )

4. Message passing ( channel로 다른 스레드의 값 사용 하기 ) 앞 장에서는 main 스레드의 값(데이터)을 새로 만든 스레드에서 사용하는 방법을 살펴봤습니다. 여기서는 다른 스레드의 값을 사용하는 방법을 살펴보겠습니다. Rust는 스레드 사이의 데이터 교환을 위해 통신 채널을 사용합니다. 채널은 송신자와 수신자를 가지고 있습니다. 스레드 사이의 데이터 교환을 위해 먼저 채널의 송신자와 수신자를 생성하고 이것을 스레드에서 사용합니다. 이런 방법을 message passing이라고 합니다. 코드에서 살펴보겠습니다. 새로운 스레드에서 데이터를 보내고 main 스레드에서 데이터를 받고 있습니다. use std::sync::mpsc::channel; use std::thread; use s..

Rust 입문 2022.10.27

[Rust] 스레드에서 외부값 사용하기

3. 스레드에서 외부 값 사용하기 스레드는 서로 독립적으로 실행되기 때문에 만약 다른 스레드의 값을 사용하려면 특별한 방법이 필요합니다. 스레드를 하나 만들고 스레드 외부인 main 스레드에 값을 만들어 새로 만든 스레드에서 그 값을 사용하는 코드를 작성하고 실행해 보겠습니다. use std::thread; fn main() { let x = “hello".to_string(); // 1 thread::spawn(|| { println!("thread1: {}", x); // 2 }).join().expect("fail!"); } // 출력 ...에러 6 | thread::spawn(|| { | ^^ may outlive borrowed value `x` 7 | println!("thread1: {}",..

Rust 입문 2022.10.26

[Rust] 스레드 생성하기

2. 스레드 생성하기 먼저 스레드의 관점에서 main 함수를 살펴보겠습니다. fn main(){ println!("hello!"); } Rust는 main 함수에서 프로그램이 시작되고 끝납니다. main 함수를 실행하는 일도 하나의 스레드입니다. main 함수의 실행이 끝나고 스레드가 종료되면 프로그램이 종료됩니다. 이 점이 main 스레드의 특별한 점입니다. main 스레드 위에서 다른 스레드가 만들어져서 실행되면 그 스레드는 main 스레드의 자식 스레드가 됩니다. 자식 스레드가 끝나지 않아도 main 스레드가 끝나면 프로그램은 종료됩니다. 결과적으로 자식 스레드는 제대로 실행되지 않거나 실행될 기회를 잡지 못할 수도 있습니다. 스레드를 만들어서 과연 그런지 시험해 보겠습니다. 새로운 스레드를 만들 ..

Rust 입문 2022.10.25

[Rust] 동시성

1. 동시성 동시성은 한 번에 여러 가지 일을 한다는 의미입니다. 동시성은 병렬성과 구분해야 합니다. 《Rust 프로그래밍 언어(The Rust Programming Language)》에서는 동시성과 병렬성을 엄격하게 구분하지 않고 두리뭉실하게 받아들여 달라고 전제 한 뒤 설명을 이어 갑니다. 하지만 여기서는 우선 동시성과 병렬성을 개념적으로 구분 하고, 설명은 동시성을 스레드를 사용해 구현하는 것에만 초점을 맞추고자 합니다. 병렬성과 동시성을 구분하겠습니다. 일의 시작에서 끝까지의 타임라인이 있다고 가정 하겠습니다. 병렬 프로그래밍은 여러 가지의 일을 서로 간섭받지 않고 실제로 동시에 진행합니다. 하지만 동시성 프로그래밍은 여러 가지 일이 타임라인을 서로 나누어 사용합니다. 어떤 일을 찔끔하다가 멈추고..

Rust 입문 2022.10.24

[Rust] RefCell 그리고 Arc, Mutex

6. RefCell 앞 장에서 봤듯이, Cell에는 값을 넣었다 뺐다 할 수 있습니다. 그런데 만약 값의 크기가 아주 크다면 부담이 될 수 있습니다. 그래서 넣었다 빼서 사용하지 않고 참조를 통해 값을 빌려 와서 사용할 수 있도록 한 것이 RefCell입니다. 코드를 통해 알아보겠습니다. use std::borrow::Borrow; use std::cell::{BorrowError, Cell, Ref, RefCell}; fn main(){ let r = RefCell::new(10); // 1 println!("{:?}", r); let r1 = r.replace(100); // 2 println!("{:?} {:?}", r, r1); println!("{}", r.into_inner()); // 3 l..

Rust 입문 2022.10.23

[Rust] Cell

5. Cell Cell 타입은 mut 키워드를 사용하지 않아도 저장한 값을 변경할 수 있습니다. Cell 타입은 마치 물건 하나만 넣을 수 있는 상자와 같습니다. 이미 들어 있는 값을 꺼내서 사용하고 다른 값을 넣어 줄 수도 있고, 이미 들어 있는 값을 그냥 지우고 다른 값을 넣어 줄 수도 있습니다. 코드를 보면서 확인 해 보겠습니다. use std::cell::Cell; fn main(){ let c = Cell::new(10); // 1 println!("{:?}", c); let c1 = c.replace(5); // 2 println!("{}", c1); println!("{:?}", c); c.set(100); // 3 println!("{:?}", c); println!("{}", c.get(..

Rust 입문 2022.10.22
반응형