반응형 러스트22 [Rust] 26. 싱글 스레드 웹서버 싱글 스레드 기반에서 작동되는 웹서버를 간단히 작성하여 테스트 해보는 시간을 갖겠습니다. 웹서버에 구동되는 주요 프로토콜은 HTTP(Hypertext Transfer Protocol) 과 TCP(Transmission Control Protocol) 입니다. TCP 프로토콜을 통하여 네트워크 접속 및 송수신에 대한 기본적인 하위레벨로 작동되며, HTTP 가 사용되는 코드로 웹브라우저가 출력되는 방식으로 구동됩니다. 이번 시간에는 TCP를 사용하기 위해서 std::net 모듈을 이용하여 해당 모듈내에 있는 TcpListener 를 사용하여 접속 및 송수신을 작성합니다. Tcp 연결 처리 use std::net::TcpListener; fn main() { let listener = TcpListener::.. 2023. 4. 6. [Rust] 24. 스레드 스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드라고 한다. Spawn 으로 스레드 생성 Rust 에서는 새로운 스레드를 생성하기 위해서 thread::spawn 함수를 호출하고 여기에 우리가 실행하기 위한 코드를 작성할 수 있습니다. use std::thread; use std::time::Duration; fn main() { thread::spawn(|| { for i in 1..10 { println!("생성 스레드 : {}", i); thread::sleep(Duration::from_millis(1)); .. 2023. 3. 14. [Rust] 23. 파일 입출력 파일 입출력 Rust 에서는 파일 입출력을 위해 File 구조체를 사용하며, 구조체의 모든 메소드는 io:Result 열거형으로 반환된다. 파일 쓰기 std::io::Write 의 write_all() 함수를 사용하여 파일을 쓸수 있다. 아래 예제를 보자 use std::fs::File; use std::io::Write; fn main() { let mut _file = File::create("test.txt").expect("파일 생성 실패!"); _file.write_all("Hello Rust World!".as_bytes()).expect("쓰기 실패"); _file.write_all("\n반갑습니다 러스트!!".as_bytes()).expect("쓰기 실패"); println!("파일 쓰기 .. 2023. 3. 10. [Rust] 22. 커멘드라인 아규먼트 프로그램을 실행하면서 아규먼트로 값을 던져서 실행하는 방법에 대해서 알아보도록 하자 기본적으로 rust 에서는 std::env::args() 를 사용하여 아규먼트를 읽을 수 있으며, Iterator로 반환된다. 다음과 같이 간단히 아규먼트를 받는 예제를 알아보자 use std::env; fn main() { for i in env::args() { println!("{}", i); } } // 실행 터미널 cargo run 아규먼트1 아규먼트2 아규먼트3 // 실행 결과 target\debug\test_rust.exe 아규먼트1 아규먼트2 아규먼트3 Iterator 에서는 collect() 함수를 사용하면 벡터로 반환할 수 있다. 또는 변수로 저장도 가능 use std::env; fn main() { /.. 2023. 3. 9. [Rust] 21. 테스트 코드 테스트 코드 테스트 코드를 작성하여 실행상에 문제점이 없는지 확인하기 위한 테스팅 코드를 작성 할 수 있습니다. 테스트 코드는 테스트를 진행할 함수위에 #[test] 구문을 기입합니다. #[test] fn 테스트함수() { ... 테스트 코드 } assert! 인자 값이 true가 아니라면 panic! 호출 #[test] fn 테스트() { assert!(1 == 2, "실패!!!"); } assert_eq! 두 인자 값이 같은지 확인 #[test] fn 테스트() { assert_eq!(1 + 1, 2, "실패!!!"); } assert_ne! 두 인지 값이 같지 않은지 확인 #[test] fn 테스트() { assert_ne!(1 + 1, 2, "실패!!!"); } #[cfg(tests)] 테스트 모.. 2023. 3. 6. [Rust] 19. 제너릭(Generic) 제너릭(Generic) 동일한 기능을 여러 타입으로 구현해야 될때 코드가 중복되는 것이 문제가 된다. 제너릭은 타입과 코드를 분리시켜 하나의 코드로 다양한 타입에 맞게 동작할 수 있는 기능을 구현할 수 있다. C언어의 템플릿과 같다. 제너릭을 알아 보기위해 간단히 덧샘 함수를 만드는 예제로 들어보자. 실수형 덧샘과 정수형 덧샘을 따로 따로 만들어서 구현해야 되는 것을 간단히 제너릭 타입 정의로 하나의 코드로 만들 수 있다. fn main() { println!("{}", add(3, 2)); println!("{}", add2(3.2, 2.4)); } // int 형 덧셈 fn add(a: i32, b: i32) -> i32 { a + b } // float형 덧셈 fn add2(a: f32, b: f3.. 2023. 3. 2. 이전 1 2 3 4 다음 반응형