본문 바로가기

Rust

(12)
[Rust] 실제 코드로 확인해보는 Monomorphization 안녕하세요.오늘은 Rust의 Monomorphization에 대해 알아보겠습니다.서론Rust의 Generic은 어떻게 런타임 비용 없이 동작하는가? Generic의 설명을 들었을 때 이런 의문이 들었습니다.Java 처럼 Type Erasure를 사용하는 건지?C++ template 처럼 코드가 복제되는 건지?이 질문을 따라가다 보면 만나게 되는 개념이 Monomorphization 입니다. 이번 글에서는 다음 내용을 다룹니다.Monomorphization이 무엇인지해당 동작이 Rust 컴파일러 파이프라인에서 어디서 수행되는지MIR / LLVM IR을 직접 열어 해당 동작을 확인하는 방법dyn trait과 비교하여 장단점Monomorphization 이란?Generic 코드를 실제 사용된 타입 별로 컴파일..
[Rust] 패턴 바인딩 (Pattern Binding) 안녕하세요.오늘은 Rust의 패턴 바인딩 (Pattern Binding) 에 대해 알아보겠습니다.서론Rust를 공부하다가 다음과 같은 코드를 봤습니다.fn main() { let x = Some(5); let y = 15; match x { Some(y) if y == 5 => println!("A, inner y: {}", y), _ => println!("B"), } println!("x, y: {}, {}", x.unwrap(), y);} 처음에는 바깥의 y(=15) 와 비교한다고 생각했지만,실제 출력은 다음과 같았습니다.A, inner y: 5x, y: 5, 15 예상과 달랐습니다.이를 계기로 Rust의 패턴 바인딩 (Pattern Binding..
[Rust] Generic Lifetime 안녕하세요.오늘은 Rust의 Generic Lifetime에 대해 알아보도록 하겠습니다.서론Rust에서는 Lifetime 개념이 중요합니다Rust의 메모리 안정성을 지탱하는 매우 중요한 개념이라 생각합니다 이번 글에서는 다음 내용을 중심으로 정리해보겠습니다Lifetime은 왜 필요한가?Generic Lifetime은 언제 사용되는가?함수와 구조체에서 어떻게 사용하는가?Lifetime Elision은 무엇인가?'static은 무엇인가?흔히 하는 오해는 무엇인가?Lifetime왜 필요한가?Rust에서 가장 중요한 개념 중 하나는 소유권(Ownership) 입니다.그리고 소유권과 함께 따라오는 개념이 바로 Borrowing(참조) 입니다.fn main() { let s = String::from("hel..
[Rust] unwrap 이해하기 안녕하세요오늘은 Rust의 unwrap 에 대해 알아보도록 하겠습니다서론최근 회사에서 Rust로 작성된 프로젝트를 분석할 일이 있었습니다.코드를 보다 보니 unwrap()이 생각보다 많이 사용되고 있었습니다.let user = find_user(id).unwrap(); unwrap()을 이렇게 자주 사용해도 괜찮을지 궁금증이 생겼습니다. 이번 글에서는 unwrap()의 동작 방식과 특징,그리고 사용할 때 주의해야할 점을 정리해보겠습니다.동작unwrap()의 동작은 단순합니다let x = value.unwrap();Some(value) → value 반환None → 프로그램 종료 (panic!) Rust의 Option는 이렇게 정의됩니다pub enum Option { Some(T), None,}..
[Rust] 동시성 안녕하세요오늘은 Rust의 동시성에 대해 알아보도록 하겠습니다Rust 동시성Rust는 안전하고 빠르며, 데이터 레이스가 없는 동시성을 목표로 설계된 언어입니다 동시성과 관련한 기능이 다양하게 있으며, 대표적인 것과 많이 쓰이는 것을 알아보겠습니다thread::spawnRust 표준 라이브러리인 thread::spawn는 스레드 기반 동시성을 제공하는 라이브러리 입니다spawn으로 스레드를 생성할 수 있습니다 메인 스레드가 종료되면 커스텀 스레드도 같이 종료되기 때문에,커스텀 스레드가 종료될 때까지 메인 스레드가 기다리는 코드가 필요합니다use std::thread;use std::time::Duration;fn main() { let handle = thread::spawn(|| { f..
[Rust] 컬렉션 (Collection) 안녕하세요오늘은 Rust의 Collection에 대해 알아보도록 하겠습니다📌 컬렉션Rust의 컬렉션은 대부분 std::collections 모듈에 정의돼 있습니다 주요 컬렉션 타입으로는 다음과 같습니다V">타입설명특징V">Vec가변 크기 배열 (Vector)요소를 동적으로 추가 가능V">String유니코드 문자열Vec 기반V">HashMap키-값 쌍 저장해시 기반, 빠른 검색V">HashSet중복 없는 값 저장내부적으로 HashMapV">LinkedList양방향 연결 리스트요소의 앞뒤 삽입에 효율적V">VecDeque양쪽에서 push/pop 가능큐처럼 사용 가능V">BinaryHeap우선순위 큐최대 힙 구조V">BTreeMap정렬된 키-값 저장트리 기반 (순회 순서 보장)V">BTreeSet정렬된 중복..
[Rust] 에러 처리 안녕하세요.오늘은 Rust의 에러 처리에 대해 알아보도록 하겠습니다.Rust의 에러 처리Rust는 Exception 대신, 오류를 2가지로 나눠서 에러를 처리합니다.복구 가능한 오류 (Recoverable Errors) → Result 사용복구 불가능한 오류 (Unrecoverable Errors) → panic! 사용복구 가능한 오류 (Recoverable Errors)정의프로그램이 정상적으로 실행을 이어나갈 수 있는 오류 입니다적절한 오류 처리 후 다시 실행을 이어나갈 수 있습니다 해결 방법Result를 사용합니다호출자가 에러를 직접 처리할 수 있도록 반환합니다 예제) 파일 읽을 때 오류 발생파일이 존재하지 않으면, 새 파일을 생성하는 방식으로 복구 가능한 예제입니다use std::fs::File;u..
[Rust] 스마트 포인터 (2) - RefCell<T>, Arc<T>, Mutex<T> 지난 포스터에 이어서 이번엔RefCell, Arc, Mutex에 대해 알아보겠습니다.Rc의 한계Rc는 아래 2가지 한계가 있습니다.가변성멀티스레드 이를 해결해주는 스마트 포인터로 RefCell, Arc가 있습니다.RefCell개념런타임에 가변성을 허용하는 스마트 포인터RefCell를 사용해서 가변성을 사용할 수 있습니다use std::cell::RefCell;fn main() { let data = RefCell::new(5); *data.borrow_mut() += 10; // 런타임에서 가변 빌림 println!("data = {}", data.borrow()); // data = 15}borrow_mut()을 통해 불변 변수를 가변으로 변경 가능합니다Rc + RefCell 조합Rc는..