Dev/Language

    tonic을 이용해 grpc 통신을 구현해 보자 - Rust 프로그래밍

    목차 tonic을 이용해 grpc 통신을 구현해 보자 Proto 파일 정의 Server 모듈 Client 모듈 실행 결과 tonic을 이용해 grpc 통신을 구현해 보자 tonic은 rust로 grpc를 구현한 오픈소스 라이브러리입니다. 즉, tonic을 이용해 grpc server와 client를 편하게 작성할 수 있습니다. Remote Procedure Call을 의미하는 rpc는 일반적인 HTTP 호출이 아닌 함수 호출의 개념을 사용하는 클라이언트-서버 통신의 한 형태입니다. grpc는 구글이 만든 오픈소스 rpc로 g는 Google을 의미하는 것으로 많이 알려져 있지만, 현재는 버전별 g의 의미를 다르게 나타내고 있습니다. protobuf(Protocol Buffer)는 데이터 직렬화를 위한 포맷..

    인자로 &String보다 &str을 사용하라 - Rust 프로그래밍

    목차 인자로 &String보다 &str을 사용하라 Implicit Deref Coercion 반복문에서 함수를 호출할 때 인자로 &String보다 &str을 사용하라 - Rust 프로그래밍 Rust에서는 함수나 메서드의 인자 타입으로 &String 보다 &str을 쓰는 것이 여러모로 더 좋습니다. 우리가 함수나 메서드를 작성할 때, 문자열을 인자로 받는 것은 흔히 볼 수 있는 코드인데요. Rust에서 문자열을 담기 위한 타입은 크게 두 가지로 String 타입과 & 연사자와 함께 사용되는 str 타입이 있습니다. 스트링 슬라이스 혹은 슬라이스 타입으로 불리는 &str은 String과 다르게 값을 소유할 수 없고, String 데이터에 대해 단순히 view를 제공해주는 타입입니다. 그러면, 왜 인자 타입으..

    impl Trait과 Box<dyn Trait> - Rust 프로그래밍

    목차 들어가며 impl Trait Box 1. 들어가며 객체지향 언어들에서는 흔히 추상화를 위해 Interface나 Abstract Class 같은 것들을 제공합니다. Rust에서는 이것들과 유사하지만 다른 Trait이라는 것을 제공하는데요. 이전 글 트레잇(Trait)과 트레잇 바운드(Trait Bound) - Rust 프로그래밍에서도 기본적인 내용들을 설명했었습니다. Rust-Book에서도 찾아볼 수 있지만, Generic Type과 Trait Bound를 함께 사용하면 일부 추상화 기능을 구현할 수 있습니다. 이번 글에서 설명하는 impl Trait도 마찬가지 입니다. 이렇게 컴파일 타임에 구현되는 다형성을 정적 다형성 또는 컴파일 타임 다형성이라고 합니다. Generic Type과 Trait Bo..

    Cell 타입과 RefCell 타입 - Rust 프로그래밍

    목차 Cell 타입과 RefCell 타입 Cell 타입 사용하기 RefCell 타입 사용하기 Cell 타입과 RefCell 타입 이전에 작성했던 Rc 타입과 Weak 타입 - Rust 프로그래밍에서는 어떤 값에 대해 여러 소유자를 가질 수 있게 해주는 스마트 포인터 Rc에 대해 살펴봤습니다. 이번 글에서는 불변 변수를 가변 변수처럼 사용할 수 있게 해주는 Cell과 RefCell 타입에 대해 살펴보겠습니다. Rust의 참조 규칙에 따르면, 어떤 객체에 대한 불변 참조자는 여러 개 가질 수 있고, 가변 참조자는 하나만 가질 수 있습니다. 또한, 이 두 가지 규칙은 동시에 적용할 수 없습니다. 이런 규칙을 깰 필요가 있는 상황에서 Cell과 RefCell 스마트 포인터 타입을 사용할 수 있습니다. Cell과..

    Rc 타입과 Weak 타입 - Rust 프로그래밍

    목차 Rc 타입과 Weak 타입 Rc 타입 사용하기 Weak 타입 사용하기 순환 참조의 문제 Rc 타입과 Weak 타입 소유권 규칙에 따라 Rust에서 어떤 값은 여러 소유자를 가질 수 없습니다. Reference Counted를 의미하는 Rc는 힙 메모리에 할당된 타입 T 값의 소유권을 공유할 수 있게 해주는 타입입니다. 즉, 스마트 포인터 Rc를 사용하면 타입 T의 값에 대한 여러 개의 소유자를 만들 수 있습니다. 기본적으로, Rc 타입은 Clone Trait을 구현하고 있고 clone을 호출해서 T 값에 대한 새로운 포인터를 생성하며, 모든 Rc 포인터가 해제되면 메모리에 할당된 T 값이 drop되는 구조입니다. Rust에서 공유된 참조자는 수정할 수 없는데, Rc 타입 또한 예외가 아니며 일반적인..

    소유권(Ownership)과 원시 타입 - Rust 프로그래밍

    목차 Ownership, Lifetime, Borrow Checker 소유권과 원시 타입 Ownership, Lifetime, Borrow Checker 소유권(Ownership)과 수명(Lifetime), 빌림 검사기(Borrow Checker)는 Rust 언어가 다른 언어들과 개념적으로 차이가 많이 나는 부분이다. 이 세 가지 개념은 모두 서로 연관되어 있다. 기본적으로 소유권을 가진 소유자는 하나다. 다만 소유권을 가지지 않았다고 해서 해당 변수에 접근하지 못한다는 것을 의미하진 않는다. 소유권은 빌림 검사기가 수명을 체크하기 위해 함께 사용되는 개념이다. 아래 코드는 컴파일되지 않는다. #[derive(Debug)] struct Number { num: i32 } fn show_number(num..

    트레잇(Trait)과 트레잇 바운드(Trait Bound) - Rust 프로그래밍

    Rust 트레잇(Trait)과 트레잇 바운드(Trait Bound) Trait Trait은 다른 언어들의 인터페이스, 프로토콜, 추상 클래스와 유사한 역할을 한다. 다양한 타입들이 동일한 기능을 수행할 수 있도록 해주며, 코드 재사용과 추상화를 가능하게 해준다. trait Car { fn drive(&self); } struct Truck; impl Car for Truck { fn drive(&self) { println!("Truck can drive"); } } struct Sedan; impl Car for Sedan { fn drive(&self) { println!("Sedan can drive"); } } Car Trait은 drive라는 메서드를 구현 없이 선언부만 갖고 있다. Truck과..

    반복문과 루프 레이블 - Rust 프로그래밍

    Rust 반복문 while while 반복문은 많은 언어들에서 사용하는 방식과 유사하다. while 반복문은 주어진 조건이 참이면 처리를 반복한다. let mut count = 0; while count < 10 { println!("{}", count); count += 1; } 많은 언어들에서 무한 반복문을 만들기 위해 while 문을 아래와 같이 활용한다. while true { println!("무한 반복"); } 러스트에서는 loop 키워드를 통해 더 간단히 해결할 수 있다. 위 코드를 빌드하면 아래와 같이 Rust 컴파일러가 친절하게 loop를 사용하라는 warning을 보여준다. loop loop 키워드는 다음에 오는 코드 블록을 무한히 반복하는데, break 키워드를 만나거나 프로그램이 종..