STUDY/Rust 28

Rust - 27. 최종 프로젝트 (2) - 러스트 공식문서 끝

1회독 끝! 싱글 스레드 서버를 멀티스레드 서버로 바꾸기 use hello::ThreadPool; use std::{ fs, io::{prelude::*, BufReader}, net::{TcpListener, TcpStream}, thread, time::Duration, }; fn main() { let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming().take(2) { let stream = stream.unwrap(); pool.execute(|| { handle_connection(stream); }); } println!("Sh..

STUDY/Rust 2024.04.07

Rust - 25. 고급 기능 (3) 고급 함수와 클로저, 매크로

너무 길어서 한번 더 끊음. 매크로 부분은 이해가 안가서 그냥 빠르게 읽고 넘어갈예정임 1.. 고급 함수와 클로저 1.1. 함수 포인터 fn add_one(x: i32) -> i32 { x + 1 } fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 { f(arg) + f(arg) } fn main() { let answer = do_twice(add_one, 5); println!("The answer is: {}", answer); } 일반함수를 함수에 전달할수 있음. 새로운 클로저를 정의하는 대신 이미 정의된 함수를 전달하고 싶을때 사용 매개변수에 fn 타입으로 정의하면됨. 1.2. 클로저 반환 클로저는(fn 포함) 반환 타입으로 사용될수 없음 트레이트 객체에 감..

STUDY/Rust 2024.03.31

Rust - 24. 고급 기능 (2) 고급 트레이트, 고급 타입

너무 길어서 한번 끊음 1. 고급 트레이트 1.1. 연관 타입 트레이트 메서드를 정의할때 자리표시자 타입을 시그니처에서 사용할 수 있게 함. 타입 자리 표시자와 트레이트를 연결함 트레이트의 구현자는 자리표시자 타입 대신 구체적인 타입을 지정함 제너릭과의 차이는 제너릭은 각 구현마다 타입을 명시해서 사용해야함. 타입을 여러 개 사용할수 있음 연관 타입은 한 타입만 사용 가능함 1.2. 기본 타입 매개변수 제너릭 타입 매개변수를 사용하면 제너릭 타입에 대한 구체적인 타입을 지정할수 있음 연산자 오버로딩(std::ops)에 쓰임 1.3. 완전 정규화 문법 (fully qualified syntax) 같은 이름의 메서드 호출하기 trait Pilot { fn fly(&self); } trait Wizard { ..

STUDY/Rust 2024.03.31

Rust - 23. 고급 기능 (1) Unsafe RUST

얼마 안남았다~~~ 오예~~~ 3월내로 끝낼듯 1. Unsafe Rust 러스트가 보증하는 것의 일부를 거부하고 해당 보증을 수동으로 유지하는 것에 대한 책임을 지는 방법 unsafe 키워드 이 키워드를 사용한 블록은 안전하지 않은 코드(안전하지않은 슈퍼파워)를 넣을 수 있다. 원시포인터(raw pointer) 역참조 안전하지 않은 함수 혹은 메서드 호출 가변 정적 변수 접근 및 수정 안전하지 않은 트레이트 구현 union 필드 접근 위 다섯 가지 기능 제외한 다른 기능은 안전성 검사를 수행한다. 안전하지 않은 코드는 유효한 방식으로 메모리에 접근하도록 보장해야한다. unsafe 블록을 작게 만드는 편이 좋다. 문제의 원인을 더 쉽게 추적할수 있음 안전하지 않은 코드를 분리하려면 추상화 하고 api를 제..

STUDY/Rust 2024.03.31

Rust - 22. 패턴과 매칭

열거형할때 간단히 링크 남기고 넘어갔던 패턴에 관한 내용이다. 1. 패턴 타입의 구조와 매칭을 위한 문법 패턴에 매치되면 그다음 코드를 실행함 패턴은 아래를 조합해서 구성함 리터럴 값 (literals) 분해한 배열(destructured array), 열거형, 구조체, 튜플 변수 와일드카드 (wildcard) 자리표시자 (placeholder) match match VALUE { PATTERN => EXPRESSION, PATTERN => EXPRESSION, PATTERN => EXPRESSION, } 이전 게시글에 c의 switch와 비슷하다고 작성했었다. 표현식의 모든 값에 대한 경우의 수를 고려해야한다. 모는 가능성을 포괄하기 위해선 catchall 패턴을 사용할수 있다. `-` 이라는 패턴은 ..

STUDY/Rust 2024.03.26

Rust - 21. 객체 지향 프로그래밍

객체지향은 봐도 써먹질않아서 잘모르겠다. 객체는 속성과 행동을 갖는다. 속성은 변수고, 행동은 함수다. 정도? 상속 가능하다. 정도? 1. 객체지향 언어의 특성 객체(object) 객체는 데이터 및 데이터를 활용하는 프로시저를 포함한다. 프로시저들을 보통 메서드(method) 혹은 연산(operation)이라고 부른다. 러스트에서 구조체, 열거형, impl 등을 사용해서 동일한 기능을 제공할수 있다. 캡슐화(encapsulation) 객체의 상세 구현에 접근할 수 없게 하는 것. 객체와 상호작용하기 위해선 객체의 공개 API를 사용해야한다. 러스트에서 pub를 사용해서 데이터나 메서드를 공개할 수 있다. 상속(inheritance) 다른 객체의 정의로부터 요소를 재사용할수 있는 메커니즘 러스트에서는 상속..

STUDY/Rust 2024.03.25

Rust - 20. 동시성, 병렬성

동시성은 항상 읽을때마다 얼추 이해는 되는것 같은데 직접 쓸땐 또 다른건지... 겁 없는 동시성(fearless concurrency) 왜 겁이 없을까? 동시성을 쓰려면 겁이 없어야하나? 아니면 러스트와 함께라면 겁이 없어지나? 1. Thread 연산을 여러스레드로 나눠서 수행하면 성능을 향상시킬수 있음. 아래 조건들만 피한다면. race condition, 특정 데이터에 동시에 접근하려하는것 dead lock, 모두 다 기다리고 있는 것 그 외 순서가 명확하지 않아 생기는 자잘한 버그들 따라서 싱글 스레드와 멀티스레드는 다른 구조를 생각해야됨 스레드 관련 트레이트 thread::spawn - 스레드 생성 반환값은 joinHandle 임 join() 메서드를 사용하면 다른 스레드가 종료될때까지 대기함 t..

STUDY/Rust 2024.03.24

Rust - 19. 스마트 포인터 (2) Rc<T>, RefCell<T>, 순환 참조

Rc까진 얼추 이해가는데 RefCell은 봐도 잘 모르겠음.. 나중에 다시 봐야지 1. Rc Reference Counting 참조 카운트 스마트 포인터 명시적으로 복수 소유권을 갖게함 하나의 값이 여러개의 소유자를 가지는 경우 스코프를 떠나도 정리되지 않도록 함 싱글 스레드에서만 사용 가능 Rc::New 로 생성 Rc::Clone 으로 참조카운트 증가 스코프 밖을 벗어나면 자동으로 참조카운트 감소 2. RefCell 내부 가변성(interior mutability) 패턴 어떤 데이터에 대한 불변 참조자가 있을 때라도 데이터를 변경할 수 있게 해주는 패턴 unsafe 코드를 사용해서 러스트 규칙 우회 러스트 컴파일러가 규칙을 확인하지 않음 컴파일러 에러는 없고 런타임 에러인 panic 발생 RefCell..

STUDY/Rust 2024.03.23

Rust - 18. 스마트 포인터 (1) Box<T>, Deref, Drop

또 포인터야? 오늘도 포인터 때문에 이해안돼서 애먹었는데..? 포인터(pointer): 메모리의 주솟값을 담고 있는 변수에 대한 일반적인 개념 스마트 포인터(smart pointer): 포인터 + 추가적인 메타데이터와 능력 C++에서 유래됨. 이해하기 어려우면 C++에서 먼저 이해하고 오자 1. Box Box 힙에 데이터 저장 스택과 비교해서 힙에 저장하는것 제외하면 성능 측면에서 오버헤드 없음 사용하는 이유(이해 못함) 컴파일 타임에는 크기를 알 수 없는 타입이 있는데, 정확한 크기를 요구하는 컨텍스트 내에서 그 타입의 값을 사용하고 싶을 때 재귀적 타입을 사용하면 공간의 크기를 알기 어려움. Box인 포인터로 대체하면 크기가 고정되므로 사용할수 있음 커다란 데이터를 가지고 있고 소유권을 옮기고 싶지만..

STUDY/Rust 2024.03.21