일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JPA
- 개발자
- 코드
- 애자일기법
- 클린코드
- 애자일프로그래밍
- ES
- 프레임워크
- Java
- framework
- cleancode
- API
- spring boot
- 코딩
- Elasticsearch
- 그리디알고리즘
- Spring
- 엘라스틱서치
- 읽기쉬운코드
- 백준
- 개발
- Baekjoon
- 알고리즘
- 스프링
- 데이터베이스
- 코딩테스트
- database
- 그리디
- 자바
- 애자일
- Today
- Total
목록프로그래밍/RUST (24)
튼튼발자 개발 성장기🏋️
앞 소개 게시글 에서 언급했 듯이, Packages와 Crates는 라이브러리와 실행 파일을 만들어주는 녀석들이다. crate는 바이너리 혹은 라이브러리이다. crate root는 crate를 빌드할 때 사용되는 소스 파일이다. package는 Crates를 빌드하는 방법을 설명하는 Cargo.toml를 가지고 있다. package의 crate는 하나의 라이브러리가 될 수 있다. (아직 감이 잘 오지 않는다...) 우리가 처음 Cargo를 사용했을 때를 기억해보자... [cargo new] command를 사용했었다. 그렇게 프로젝트를 생성을 했었다. 여기서 생각해야할 것은 생성된 프로젝트에 package가 생겼다는 것. 왜? Cargo가 Cargo.toml파일을 만들었기 때문. 이상하게도 Cargo.t..
러스트는 특수하게(?)도 "모듈 시스템"이라는 것을 제공하는데 scope와 관련된 많은 기능들을 말한다. 추가로 다음과 같은 모듈을 포함한다. Packages는 빌드, 테스트, 공유할수 있도록 해주는 Cargo 기능이다. Crates는 라이브러리나 실행파일을 생성하는 모듈 트리다. Modules는 scope와 privacy 정보(구조체, 함수, 모듈 등의 네이밍을 이야기하는 것 같다.)를 제어할 수 있다. 이번 장이 끝나면 scope를 정의하고, 사용하며, export를 할 수 있다. (기대 중..ㅎㅎㅎㅎ)
panic! 매크로가 복구 불가능한 에러를 처리하기 위함이라면, 복구 가능한 에러 처리를 위한 녀석은 Result가 있다. enum Result { Ok(T), Err(E), } Result의 핵심!!! T와 E는 제네릭 타입 파라미터다. T는 성공한 후에 Ok variant 내에 반환될 값의 타입 E는 실패한 후에 Err variant 내에 반환될 에러 타입 파일을 가지고 오는 코드를 보자. use std::fs::File; fn main() { let file = File::open("hello.txt"); if file.is_ok() { println!("SUCCESS!!! : {:?} ", file.ok()); } else { println!("FAILE!!! : {:?}", file.err())..
러스트의 에러는 크게 두 가지로 나눈다. Recoverable Errors : 복구 가능한 에러 Unrecoverable Errors : 복구 불가능한 에러 복구 가능한 에러의 경우에는 사용자에게 문제를 이야기하고 해당 요청을 재시도 할 수 있도록 한다. 복구 불가능한 에러는 버그의 종류(?)로써, Index를 벗어난다거나, 0으로 나누려고 하는 경우 등과 같이 뻑(?)나는 경우를 이야기 한다. 1. panic! panic! 매크로가 실행되면, 프로그램은 실패 메시지를 출력하고, 스택 해제와 더불어, 정리하고 종료시킨다. panic! 응답으로 인한 중단 혹은 스택 해제 panic! 매크로가 실행되면, 프로그래램은 unwinding(해제)을 시작한다. 이것은 러스트가 panic!을 마주친 함수들로부터 스택..
개인적으로 많은 Collection 중에 String 다음으로 가장 많이 사용했던 녀석이다. HashMap 형식을 가지고 있고 Key와 Value를 매핑시켜 관리하는 데이터 구조가 되겠다. Key와 Value를 메모리 어디에 저장할지 결정하는 해쉬함수를 통해 동작한다. use std::collections::HashMap; fn main() { // HashMap 정의 let mut scores = HashMap::new(); // 값 삽입 scores.insert(String::from("BLUE"), 1); scores.insert(String::from("RED"), 2); // #1 전체 출력 println!("scores : {:?}", scores); // #2 특정 값 출력 println!(..
언제나 그렇듯 대부분의 언어는 컬렉션이라 불리는 데이터 구조를 제공한다. 우리가 공부했던 튜플과 배열과는 다르게, 힙 영역에 저장된다. 즉, Compile Time에 데이터 크기를 알 필요가 없다는 뜻이 되며, 크기 확장 혹은 축소가 가능하다는 이야기다. (우리가 공부할 각 컬렉션의 성격이 조금씩 다르니, 적절하게 사용할 수 있는 능력을 기르는 것이 옳다고 생각된다.) 이번 장에서 다룰 컬렉션은 Vector(벡터)다. 메모리상에서 이웃되도록 모든 값을 넣는 단일 데이터 구조에 하나 이상의 값을 저장할 수 있도록 한다. 같은 타입의 값만을 저장 가능하다. 벡터 정의 및 사용 fn main() { // vector 정의 let mut vector: Vec = Vec::new(); // vector에 값 삽입..
이번 장에서는 코드를 보다 간결하게 제어하기 위한 "if let"이라는 녀석을 알아본다. if let 구문은 하나의 패턴과 일치하는 값을 처리하고 나머지는 무시할 수 있도록 해준다. (간결한 이유 인가?라는 의문이 생긴다..) "어떠한 옵션 값을 매칭 시켜, 그 값이 특정 값일 경우에만 코드를 실행시키고 싶다!"라고 한다면 내 생각에는 두 가지의 방법이 있을 수 있다. 지금 부터 간결하고도 간편한 방법. if let을 소개한다. 다음 코드를 보자 fn main() { let var = 3; let some_u8_value = Some(var); // 첫 번째 방법 match some_u8_value { Some(3) => println!("three"), _ => (), } // 두 번째 방법 if le..
"match"라고 하는 흐름 제어 연산자가 있다.match 표현식은 열거형과 함께 사용되는 경우, 열거형 variants에 따라 다른 코드가 실행되며 해당 코드는 일치하는 값 내부의 데이터를 사용할 수 있다.(쉽게 이해하면 마치 패턴 매칭...?) fn main() { enum Coin { Penny, Nickel, Dime, Quarter, } fn value_in_cents(coin: Coin) -> u32 { // match 표현식 match coin { // arms // {표현식} => value Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, } }} match 표현식의 예를 보면 coin이라는 match가..