Archive

    [Rustlings] 11. Error Handling

    Rust에는 Error Handling을 할 때 Result라는 타입을 사용한다. Result는 Ok와 Err로 나뉘는데, Ok는 과제를 성공적으로 수행했을 때 내보내는 값이고 Err는 과제 수행 중에 발생한 오류를 나타낸다. enum Result { Ok(T), Err(E), } 예를 들어 어떤 문자열을 정수로 파싱하는 경우, 성공적으로 정수로 변환할 수 있지만 빈 문자열이나 숫자가 아닌 다른 문자가 포함된 경우에는 정수로 파싱할 수 없다. 그래서 parse 함수는 Result를 반환해 정수 변환에 성공했는지 실패했는지 결과를 넘겨준다. let num = input.parse::(); let num = match num { Ok(n) => n, Err(error) => panic!("Input a va..

    [Rustlings] 10. String

    Rust에는 문자열 타입이 두가지 존재한다. 언어 자체로 지원하는 str과 표준 라이브러리에서 지원하는 String이 그렇다. let s1: &str = "Hello str"; let s2: String = String::from("Hello String"); str은 보통 &str로 많이 사용한다. String과 &str의 가장 큰 차이점은 String은 문자열 수정이 가능하지만 &str은 불가능하다는 점이다. &str은 보통 문자열 리터럴이나 문자열 슬라이스를 저장하는데 사용된다. String과 &str은 서로 변환이 가능하다. let s1 = "Hello".to_string(); using_string(&s1); // ... fn using_string(s: &str) { // ... }

    [Rustlings] 9. collection

    Vector는 같은 타입의 데이터를 여러 개 저장할 수 있다. let mut vec1: Vec = Vec::new(); let vec2: Vec = vec![1,2,3]; vec1.insert(1); vec1.insert(2); vec1.insert(3); for i in vec1.iter_mut() { *i = *i * 5; } HashMap은 c++의 hash나 python의 dict와 같다. use std::collections::HashMap; let mut hash: HashMap = HashMap::new(); hash.insert(String::from("apple"), 3); hash.insert(String::from("banana"), 2); // 해당 키가 없으면 추가 hash.ent..

    [Rustlings] 8. module

    mod는 네임스페이스와 비슷한 역활을 한다. mod는 소스코드에서 함수나 매크로 상수, 구조체 등의 요소를 묶는다. mod sausage_factory { fn make_sausage() { println!("sausage!"); } } mod 안에서 선언된 모든 요소들은 기본적으로 private다. mod 밖에서 해당 요소에 접근할려면 pub를 붙여줘야 한다. mod sausage_factory { pub fn make_sausage() { println!("sausage!"); } } fn main() { sausage_factory::make_sausage(); } 하지만 주의해야할 점이 있다. 상위 범위가 public이라고 해서 그 안의 요소가 public이 되지 않는다. 해당 요소에 접근할려면 ..

    [Rustlings] 7. enum

    enum은 열거 데이터(enumerate)를 정의하는 예약어다. #[derive(Debug)] enum Result { Ok, Err, } fn main() { println!("{:?}", Result::Ok); } 열거 데이터는 단일로 존재할 수 있지만, structure처럼 다른 값을 가질 수 있다. 형태도 structure와 비슷하다. enum Result { Ok(u32), Err { code: u32, msg: String }, } fn main() { println!("{}", Result::Err { code: 404, msg: String::from("page not found") }); } enum 값에 따라 조건부를 다는데는 match가 편하다. 다만 모든 enum 값에 대해 어떻게 ..

    [Rustlings] 6. struct

    Rust에는 struct의 종류는 세가지 있다. C 스타일의 struct과 Tuple 스타일의 struct, Unit 스타일의 struct을 사용할 수 있다. C 스타일의 struct는 C언어에서 본 방식과 비슷하다. 각 요소마다 이름과 타입을 지정하는 방식이다. struct Color { name: String, code: String, } fn main() { let green = Color { name: String::from("green"), code: String::from("#00ff00"), }; println!("{} {}", green.name, green.code); } Tuple 스타일의 struct는 Tuple처럼 요소에 이름을 붙이지 않는다. struct Color(String, ..

    [Rustlings] 5. Primitive Types

    Rust의 기본 데이터 타입은 다른 프로그래밍 언어와 유사하다. 여기서 몇가지 특징을 나열하면, 정수는 데이터 크기별로 타입이 나눠져있다. i8, i16, i32, i64, i128, isize(아키텍쳐 기준) u8, u16, u32, u64, u128, usize(아키텍쳐 기준) 정수 리터럴에서 다양한 진법 표현이 가능하다 123_456_789 (끊어서 표현 가능) 0xff 0o77 0b1111_1111 b'a' (u8에서만 사용가능) 튜플이 존재한다 let t = (1, "hello", 2.1); t.0 == 1 (튜플의 요소 접근) let (num, string, float) = t (destruction 지원) 배열 표기법 타입 : [i32; 5] 할당 : [12; 5] == [12, 12, 12..

    [Rustlings] 4. Move Semantics

    여러 프로그래밍 언어마다 메모리 관리법이 다르다. Java는 가비지 컬렉터를 사용하고 C++은 프로그래머가 언제 메모리를 할당하고 해제하는지 직접 지정한다. Rust는 ownership이라는 본연의 시스템으로 메모리를 관리한다. Ownership은 각 값의 소유권을 변수에게 지정하는 방식이다. ownership은 다음 세가지 방식으로 메모리를 관리한다. 각 값들은 한 변수에게 소유되며, 이러한 변수를 owner라고 한다. 각 변수들은 둘 이상의 값을 소유할 수 없다. owner가 소멸되면 owner가 소유하던 값도 소멸한다. 보통 가비지 컬렉터를 지원하는 언어는 가비지 컬렉터가 분석해 더이상 사용하지 않는 메모리를 알아서 반환시킨다. 메모리 할당과 해제를 직접 다루는 경우에는 프로그래머가 언제 할당하고 ..