반응형

전체 글 307

[Rust] match 연산자

: 흐름 제어 연산자로, 일련의 패턴에 대해 어떤 값을 비교한 뒤 어떤 패턴에 매치되었는지를 바탕으로 코드를 수행하게 해줍니다. match의 힘은 패턴의 표현성으로부터 오며, 컴파일러는 모든 가능한 경우가 다루어지는지를 검사합니다. 다음은 코인의 종류를 enum으로 표현하고, 코인을 센트로 변환해주는 함수입니다. match에서의 각각 나뉘는 갈래를 arm이라 합니다. enum Coin { Penny, Nickel, Dime, Quarter, None, } fn value_in_cents(coin: Coin) -> u32 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, Coin::None =>..

[Rust] 2023.08.15

[Rust] 컬렉션(Collection)

: 러스트 표준 라이브러리의 유용한 데이터 구조로, 다수의 값을 담을 수 있습니다. 배열이나 튜플과는 달리 힙에 저장되는데 이는 프로그램 실행 중에 데이터의 양이 늘거나 줄어들 수 있음을 의미합니다. 러스트 프로그램에서 자주 사용되는 컬렉션에는 다음 세가지가 있습니다. 벡터(vector) : 여러 개의 값을 서로 붙어서 저장될 수 있게 해줍니다. 문자열(string) : 문자(character)의 모음입니다. 해시맵(hash map) : 어떤 값을 특정 키와 연관지어 주도록 해줍니다. 1) 벡터(vector) - Vec 같은 타입의 값만 저장 가능하며, 모든 값을 메모리에서 연속적으로 배치합니다. - 새 벡터 만들기 : 비어있는 벡터를 만들기 위해서 Vec::new 함수를 호출합니다. 벡터에 어떤 값도 ..

[Rust] 2023.08.14

[Rust] 패키지, 크레이트, 모듈로 프로젝트 관리

프로젝트 규모가 커지면 코드를 여러 모듈, 파일로 나눠서 관리해야 합니다. 한 패키지는 여러 개의 바이너리 크레이트와 라이브러리 크레이트를 포함할 수 있고, 커진 프로젝트의 각 부분을 크레이트로 나눠서 외부 라이브러리처럼 쓸 수 있습니다. 러스트에서 코득 조직화에 필요로하는 모듈 시스템에는 다음과 같은 기능들이 있습니다. 패키지 : 크레이트를 빌드, 테스트, 공유하는 데 사용하는 카고 기능 크레이트 : 라이브러리나 실행 가능한 모듈로 구성된 트리 구조 모듈과 use : organization, scope를 제어하고, 조직 세부 경로를 감추는 데 사용 경로 : 구조체, 함수, 모듈 등의 이름을 지정 - 크레이트(crate) : 러스트가 컴파일 한 차례에 고려하는 가장 작은 코드 단위입니다. 크레이트는 여러..

[Rust] 2023.08.11

[Rust] 열거형(enum)

열거형은 코드에서 다음과 같이 정의할 수 있습니다. enum ItemType { None, Food, Book, } None, Food, Book처럼 열거된 것들을 열거형의 variants라 부릅니다. 열거형의 variants에 대한 인스턴스를 만드는 방법은 다음과 같습니다. let food = ItemType::Food; let book = ItemType::Book; 지난 챕터에 배운 struct에 열거형을 다음과 같이 사용할 수 있는데요, struct Item{ itemType: ItemType, name: String, } let pizza = Item { itemType: ItemType::Food, name: String::from("pizza"); } 위와 같이 struct를 사용하지 않고,..

[Rust] 2023.08.01

[Rust] 구조체 - 메서드

메서드(method)는 함수와 유사하지만, 구조체의 내용 안에 정의되어야 합니다. 메서드의 첫번째 매개변수는 항상 self여야 하며, 메서드가 호출되는 구조체의 인스턴스를 나타냅니다. 따라서 타입을 정의하지 않아도 됩니다. 구조체의 소유권을 가져오지 않고 싶다면 &self를 사용해줍니다. self는 예약어로, 다른 이름을 매개변수에 입력할 경우 타입이 없다는 에러를 출력합니다. impl 블록에서 정의해야 합니다. #[derive(Debug)] struct Rectangle { length : u32, width: u32 } impl Rectangle { fn area(&self) -> u32 { self.length * self.width } } fn struct2() { let rect1 = Recta..

[Rust] 2023.07.30

[Rust] 데이터 구조체

다른 타입의 여러 값을 가질 수 있다는 점에서 튜플과 비슷하지만, 각각을 필드에 정의하고 명명할 수 있다는 점에서 차이가 있습니다. struct를 사용해 다음과 같이 정의하여 사용할 수 있습니다. 인스턴스인 my_data를 생성할 때 값을 입력하는 순서는 중요하지 않지만, 모든 필드에 값을 입력해주어야 합니다. struct UserData { username: String, email: String, sign_in_count: u64, active: bool, } let my_data = UserData { username : String::from("Geukggom"), email : String::from("geukggom@gmail.com"), sign_in_count : 1, active : tr..

[Rust] 2023.07.29

[Rust] 슬라이스(slices)

슬라이스의 개념을 알아보기 전에 다음 예제를 먼저 살펴보겠습니다. 스트링을 입력 받아서 첫번째 공백 전까지의 단어를 반환하는 함수를 작성해봅니다. fn main() { let str = String::from("ab cde f g"); let w = first_word_length(&str); println!("{}", w); //ab 2글자이므로 2 출력. } fn first_word_length(s:&String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' '{ return i; } } s.len() } first_word_length() 함수에서는 다음과 같은 과정을 거칩..

[Rust] 2023.07.27

[Rust] 참조자(References)와 빌림(Borrowing)

함수에게 값을 사용할 수 있도록 넘겨주되 소유권을 넘기고 싶지 않을 때, 다음과 같이 튜플로 여러 값을 돌려받을 수 있습니다. fn main() { let s1 = String::from("hello"); let (s2, len) = calculate_length(s1); } fn calculate_length(s:String)-> (String,usize){ let length = s.len(); (s, length) } 하지만 이는 조금 과한 작업이고, 러스트는 이처럼 소유권을 넘기고 싶지 않을 때 참조자(references)라 부르는 기능을 사용할 수 있습니다. fn main() { let s1 = String::from("hello"); let len = calculate_length2(&s1);..

[Rust] 2023.07.26

[Rust] 소유권

: 러스트의 가장 유니크한 특성으로, 러스트가 가비지 콜렉터 없이 메모리 안정성을 보장할 수 있도록 해줍니다. 어떤 언어는 프로그램이 실행될 때 사용하지 않는 메모리를 찾는 가비지 컬렉션을 사용하고, 어떤 언어는 프로그래머가 직접 명시적으로 메모리를 할당하고 해제해줍니다. 러스트는 이런 방법을 사용하지 않고, 컴파일 타임에 컴파일러가 체크할 규칙으로 구성된 소유권 시스템을 통해 메모리를 관리합니다. 소유권에 대해 알아보기 앞서 스택과 힙이 무엇인지 짚고 넘어가겠습니다. * 스택과 힙 : 러스트에서는 값이 스택에 있는지, 힙에 있는지에 따라 프로그래머의 결정에 큰 영향을 줍니다. 스택과 힙 둘 다 런타임에 사용할 수 있는 메모리 영역입니다. 스택은 Last in, First out으로, 데이터를 추가하는 ..

[Rust] 2023.07.25

[Rust] 제어문

코드의 실행 흐름을 제어할 수 있는 문법을 제어문이라 합니다. 가장 보편적인 제어문에는 if 표현식과 반복문이 있습니다. 1) if 표현식 fn main() { let number = 3; if number < 5 { println!("condition was true"); } else if number == 5 { println!("number is 5"); } else { println!("condition was false"); } } if 식은 조건을 붙이고 조건이 true가 될 때 중괄호 안의 코드를 읽습니다. else 식은 if 식이 false일 때, else if 식은 if 식 조건문에 포함되지 않는 또 다른 조건을 제시합니다. if 식에 쓰이는 조건은 반드시 bool을 반환해야 합니다. l..

[Rust] 2023.07.20
반응형