⚙️ Rust

    [Rust / 튜토리얼] 20. 러스트에서 벡터 (vector) 사용하기

    벡터 컬렉션 러스트의 표준 라이브러리는 컬렉션이라고 불리는 유용한 데이터 구조들이 포함되어 있다. 이 컬렉션은 다른 일반적인 타입들 처럼 하나의 값만 가지는 것이 아닌, 여러개의 값을 가질수 있다. 그렇다면 구조체나, 배열, 튜플과 비슷하다고 생각할 수 있겠지만, 그들과는 다르게 벡터는 Heap 영역에 저장된다. 컴퓨터 구조나 OS를 공부한 사람이라면 단번에 알겠지만, 이는 크기가 런타임에 결정되며, 다이나믹하게 크기가 결정될 수 있다는 것을 의미한다. 러스트에서 자주 사용되는 컬렉션은 아래의 세 가지이다. 벡터는 여러 개의 값을 서로 붙어있게 저장할 수 있다. String은 character의 모음이다. Hashmap은 데이터들을 키와 값으로 가지고 있는다. 그 중에서 먼저 벡터에 대해서 알아보도록 하..

    [Rust / 튜토리얼] 19. 러스트의 use. super의 사용

    모듈 가져오기 대부분의 사람들은 별명을 하나즈음 가지고 있을 것이다. 나는 낙타라는 별명을 고등학생때부터 가지게 되어 10년이 훌쩍 넘게 낙타로 불리우고 있다. 가끔은 내이름이 그립긴 하지만 좋은 점이 몇개 있는데, 첫째로 부르기 쉽다는 것이고 둘째로는 기억하기 쉽다는 것이다. 러스트는 모듈을 사용하기 쉽게 하기 위해 네이밍룰을 제공하고 있다. 아래와 같은 코드가 있다고 생각해 보자. pub mod a { pub mod series { pub mod of { pub fn nested_modules() {} } } } fn main() { a::series::of::nested_modules(); } 저 하나의 메소드를 호출하기 위해 대체 몇 단계의 (nested된) 모듈을 타고 들어가야 하는지 현기증이 ..

    [Rust / 튜토리얼] 18. 러스트의 public 과 private

    pub으로 가시성 제어하지 이전 글에서 network 와 network::server 코드를 파일별로 나누어 작성했다. 그리고 cargo build로 빌드 또한 되는 것을 확인 했다. 그럼 이제 모든게 끝난 것일까? 우리는 다른 파일의 어딘가에서 해당 모듈들을 사용 할 수 있을까? 답은 아니다. 우선 빌드할 때 출력되는 경고 메시지들을 확인해보자. warning: function is never used: `connect` --> src/network/mod.rs:1:4 | 1 | fn connect() { | ^^^^^^^ | = note: `#[warn(dead_code)]` on by default warning: function is never used: `connect` --> src/clien..

    [Rust / 튜토리얼] 17. 러스트의 모듈 (mod)

    mod와 파일 시스템 지금까지 진행하며 작성했던 작은 테스트 코드들은 모듈화를 할 필요가 없었다. 하지만 대규모의 프로젝트를 진행 한다고 생각 해 보자. 지금처럼 하나의 main.rs에 모든 코드를 때려 박을 순 없을 것이다. 코드의 유지보수 및 최적화 관점에서 모듈화는 중요한 요소이다. 이번 글에서는 지금까지 진행했던 binary crate에서 나아가 library crate를 생성하고 다루어 보자. 앞에서 주저리주저리 설명 했지만, 실제로 만드는 법은 엄청 간단하다. binary crate 처럼 library crate 역시 cargo를 사용한다. 거기서 옵션만 --bin 에서 --lib로 변경해 주면 된다. 그럼, 라이브러리 이름을communicator로 해서 생성해 보자. MacBook-Pro r..

    [Rust / 튜토리얼] 16. 러스트의 let if 의 사용법

    if let을 사용한 흐름 제어 if let 문법은 if 와 let을 조합해 하나의 패턴만 매칭 시키고 나머지는 무시하는 방법이다. if let을 사용 하지 않는다면 아마 아래처럼 코딩 하게 될 것이다. fn main() { let some: Option = Some(3); match some { Some(3) => println!("Three!!"), _ => (), } } Three!! Some(3) 일때만 Three!! 를 출력하는 간단한 코드이다. 이외의 경우에는 아무런 동작도 하지 않는다. 그러기 위해서 _ => (), 코드를 추가해 주었는데, 이는 내가 필요하지 않는 부분 이기 때문에 작성하기가 매우 귀찮다. 러스트에선 이런 귀찮음을 해소하기 위해 if let 코드를 제공하고 있다. 이 코드를..

    [Rust / 튜토리얼] 15. 러스트에서 match 를 이용한 분기.

    match 를 이용한 분기 코딩을 하다 보면 if/else 문을 여러개 사용해야 될 상황이 있다. 이럴 때 무식하게 if/else를 남발하는 것은 그다지 권장되는 상황이 아니다. 오히려 표창좀 그만 남발 하라고 욕을 먹지 않으면 다행이다. 다른 언어에선 switch 라는 키워드를 사용해 이런 상황을 해결한다. switch는 표창을 날리는 것 보다 훨씬 빠르고, 직관적이며 우하하다. 하지만 평범하지 않은 우리의 러스트 언어는 switch 키워드는 제공하지 않으며, match라는 키워드를 통해 이를 해결한다. 분기문을 사용하는 대부분의 경우는 한줄기의 큰 흐름을 진행하는 중 자잘한 세부 줄기로 진행하기 위함이다. 우리가 카페에 갔다고 가정 해 보자. 카페에 도착해서 메뉴판을 보고 주문을 한다. 라는 것은 큰..

    [Rust / 튜토리얼] 13. 러스트의 열거형과 Option, None 그리고 Some

    열거형 (Enum) 정의하기 코드를 작성하다 보면 열거형이 구조체보다 더 유용한 상황들이 있다. 사용 가능한 여러 값들 중 하나의 상태만 가지는 데이터들이 그런 경우이다. 예를들어 IP주소는 버전4 또는 버전6을 사용하고 있고, 동시에 두개의 값을 가지지 않는다. 이번 튜토리얼 에서는 이런 IP주소를 열거형으로 나타내며 공부해 보도록 하자. enum IpAddrKind { V4, // variants 라고 부른다 V6 } 구조체와 비슷한 방법으로 열거형을 쉽게 선언했다. 이제 이 열거형을 사용하기 위해 인스턴스를 만들어 보자. enum IpAddrKind { V4, V6 } fn main() { let v4 = IpAddrKind::V4; let v6 = IpAddrKind::V6; } 열거형을 정의하게..

    [Rust / 튜토리얼] 13. 러스트의 메소드.

    메소드 문법 메소드는 함수와 유사하다. fn키워드와 메소드 이름으로 선언되고, 파라미터와 리턴값을 가지고 있다. 함수와의 차이점은 크게 두가지이다. 메소드는 구조체의 내용 안에 정의된다. 첫번 째 파라미터는 항상 self이다. 여기서 self는 구조체의 인스턴스를 가리키고 있다. 메소드를 정의하기 앞에서 공부했던 Rectangle 구조체를 재활용해 area 메소드를 만들어 보자. 이렇게 메소드로 구현하는 것이 아마도 함수로 구현하는 것보다 더 우아할 것이다! #[derive(Debug)] struct Rectangle { length: u32, width: u32, } impl Rectangle { fn area(&self) -> u32 { self.length * self.width } } fn mai..

    [Rust / 튜토리얼] 12. 러스트 구조체를 이용한 예제 프로그래밍

    구조체를 이용한 예제 프로그램 앞에서 공부한 구조체를 예제를 통해서 이해해 보자. 사각형의 넓이를 계산하는 간단한 프로그램을 작성해 보자. 일단은 먼저, 구조체를 사용하지 말고 변수를 이용해 넓이를 구한 후, 이를 구조체를 사용하는 방법으로 변경해 가도록 하겠다. fn area(width: u32, length: u32) -> u32 { width * length } fn main() { let width = 50; let length = 50; println!("Square is {}", area(width, length)); } Compiling rust v0.1.0 (/Users/seunghye/Documents/juneun/rust) Finished dev [unoptimized + debugin..

    [Rust / 튜토리얼] 11. 러스트에서 구조체를 정의하고 생성하기

    구조체를 정의하고 초기화 하기 구조체는 앞에서 공부했던 튜플과 유사한 기능을 한다. 튜플처럼 각각의 요소들의 타입을 지정해 선언할 수 있다. 튜플과 다른 점은 타입과 함께 타입의 구성요소를 이름 지을 수 있다는 점이다. 이름을 지어주는 건 그 이름을 통해 데이터에 접근할 수 있다는걸 의미한다. 예를들어 타나기월드라는 구조체의 타나기 요소에 접근하고 싶다면, 타나기월드.타나기와 같은 식으로 접근할 수 있다. 구조체를 정의할 때는 struct키워드를 구조체 이름 앞에 적어주면 된다. 구조체의 이름을 짓는건 개발자 마음이지만 구조체 요소의 이름을 포괄하도록 짓는것이 좋다. 러스트에선 구조체의 요소들을 필드라고 부르고 있으니, 앞으로는 필드라고 부르도록 하겠다. 아래의 예시에서 구조체를 생성하고 인스턴스를 생성..