관리 메뉴

밤 늦게까지 여는 카페

[rust 공식 문서 14일 공부] 5일차 본문

For Fun

[rust 공식 문서 14일 공부] 5일차

Jㅐ둥이 2024. 12. 11. 02:46
반응형

5.1. Defining and Instantiating Structs

struct는 tuple과 비슷하지만 더 유연한 자료 구조입니다.

tuple처럼 데이터의 순서로 의미를 부여하는 것이 아니라 이름으로 의미를 부여하기 때문이죠.

 

rust의 struct 정의는 다음과 같습니다. 일반적인 프로그래밍 언어와 비슷합니다.

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}

 

이렇게 정의된 struct를 사용하는 방법은 단순합니다. struct를 선언하고 각 필드의 값을 채워주면 됩니다.

let user = User {
    active: true,
    username: String::from("someusername123"),
    email: String::from("someone@example.com"),
    sign_in_count: 1,
};

 

struct를 mutable 하게 만드는 방법은 mut 키워드를 앞에 붙이는 것으로 동일합니다.

단, struct의 일부 필드만 mutable 하게 만드는 방법은 없습니다.

let user = User {
    active: true,
    username: String::from("someusername123"),
    email: String::from("someone@example.com"),
    sign_in_count: 1,
};

 

여기까지 내용을 보니 다른 프로그래밍 언어 struct랑 비슷하네? 싶어서 넘어가려고 했는데 조금 다른 내용이 있어서 공유드립니다.

 

 

기존 struct를 이용해서 새로운 struct 만들기

rust에는 ..struct_var 라는 문법이 있더라고요?

다음과 같이 작성하면 username, email을 제외한 다른 필드들을 자동으로 user1 변수의 값으로 채워준다고 합니다.

let user2 = User {
    username: String::from("mysername"),
    email: String::from("myuser@example.com"),
    ..user1
};
  • 대신 user1의 필드들에 대한 ownership 관리도 잊으면 안됩니다.
  • username과 email처럼 ownership이 shallow copy가 이뤄지는 값들은 ownership이 이동되기 때문에 다시 사용하려고 하면컴파일 에러가 발생합니다.

 

Tuple Struct

tuple을 이용해서 struct를 간단하게 정의하는 방법도 있습니다. 이렇게 정의된 경우에는 필드를 .0, .1, .2, ... 이런 식으로 접근하더라고요?

tuple struct 예시

 

Unit-Like Structs Without Any Fields

필드가 없는 struct를 정의해서 unit type처럼 사용한다는 설명이 있는데 이 부분은 아직 이해가 되지 않았습니다.

 

다음 예시에서 AlwaysEqual이 unit-like struct인데 모든 타입의 모든 값과 항상 같게끔 구현하여 테스트에 사용하는 예시를 들더라고요.

 

rust를 조금 더 알면 이해가 되지 않을까 싶습니다.

struct AlwaysEqual;

fn main() {
    let subject = AlwaysEqual;
}

 

5.2. An Example Program Using Structs

여기에서는 tuple, struct를 사용해서 다음 코드를 리팩토링 해봤습니다.

사용성이 tuple, struct로 바꿔가면서 사용성이 높아지는 것을 체감할 수 있었습니다.

 

+++

derive라는 것을 사용했는데 나중에 더 자세히 알아보게 될 것 같습니다.

fn main() {
    let width1 = 30;
    let height1 = 50;
    println!( "The area of the rectangle is {} square pixels.", area(width1, height1) );
}

fn area(width: u32, height: u32) -> u32 {
    width * height
}

 

5.3. Method Syntax

struct의 메소드를 작성하는 방법을 알려줍니다. 이 부분은 rust의 문법이라서 덧붙일 내용이 없네용... ㅎㅎ

 

6. Enums ans Pattern Matching

6.1. Defining an Enum

앞에서 공부한 struct가 데이터 간의 관계를 쉽게 관리할 수 있도록 도와준다면

enum은 요구사항에 맞는 값들을 관리하는 것을 도와줍니다.

  • Todo 리스트의 카드 상태를 관리할 때 문자열로 관리하는 것보다는 enum으로 관리하는 것이 편리한 점이 많습니다.

Enum 정의 방법 및 사용 방법

Enum의 정의 방법과 사용 방법은 간단합니다.

enum EnumName {
    EnumVal1,
    EnumVal2,
}

let var1 = EnumName::EnumVal1;
let var2 = EnumName::EnumVal2;

 

타입처럼 사용할 수 있는 enum...?

여기부터는 조금 생소합니다. enum을 타입처럼 사용할 수 있더라고요.

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

이걸 굳이 enum으로 제공할 필요가 있을까? 라는 궁금증이 들었습니다. 뒷부분을 보면 궁금증이 해소될까요?

 

Option - Null을 사용하지 말자!

null reference는 SW에 정말 수많은 버그를 발생시켰을 것입니다.

rust에서는 null reference로 인해 발생하는 문제를 해소하기 위해서 Option<T>라는 기본 enum을 제공합니다.

enum Option<T> {
    None,
    Some(T),
}

 

Option enum을 사용하면 None일 때의 처리가 되었는지 컴파일 단계에서 확인해주기 때문에 안전하게 개발할 수 있죠!


앗 이제 재밌는 match가 나오는데 벌써 시간이 이렇게 늦었네요...

오늘은 여기서 마쳐보겠습니다!

 

반응형