본문 바로가기

휴지통/러스트

러스트 Structure, Enum

Structure 같은경우에 말 그대로 C++의 구조체와 비슷하다.

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

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

 

이런식으로 이름없이 사용도 가능하다. 사용은 Color.0, Color.1 이런식으로 쓸수 있다.

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);
}

 

구조체 에서 사용하는 함수를 impl을이용해서 표현할 수 있다.

예시를 보면 파이썬에서 함수에서 자기자신을 불러오는 방식과 비슷해 보인다.

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!(
        "The area of the rectangle is {} square pixels.",
        rect1.area()
    );
}

 

C, C++에서 사용하는 -> 를 생각해보자. 위와 같은 상황에서는 self->width가 더 맞는 표현 같다. 하지만 러스트에서는 이 표현이 존재하지않는다. 이를 automatic referencing and dereferencing 이라고 부른다. 러스트는 자동적으로 &, *을 더한다. 따라서 아래의 두 코드는 같은 내용이다. 

p1.distance(&p2);
(&p1).distance(&p2);

 

Enum형 같은경우에는 C, C++ 및 다른 언어에도 역시 존재한다. structure와 함께 사용한 예시 이다.

 enum IpAddrKind {
        V4,
        V6,
    }

    struct IpAddr {
        kind: IpAddrKind,
        address: String,
    }

    let home = IpAddr {
        kind: IpAddrKind::V4,
        address: String::from("127.0.0.1"),
    };

    let loopback = IpAddr {
        kind: IpAddrKind::V6,
        address: String::from("::1"),
    };

Enum에 있는 Option타입을 보자.

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

이는 열거형에 데이터가 있는 Some, 그리고 없는 None 두가지 형태로 나뉜다.

스프링에서 공부한 자바의 Optional과 비슷한 느낌이 나는 것 같다.

 

let x: i8 = 5;
let y: Option<i8> = Some(5);

let sum = x + y;

다음 코드는 오류를낸다. 오류내용은 i8과 Option<i8> 을 더할 수 없다는 내용이다. 그렇다고 x를 Option으로 바꿔도 해결되는가? 그것도 아니다.

 

fn main() {
    let x: Option<i8> = Some(5);
    let y: Option<i8> = Some(5);

    let sum = match (x, y) {
        (Some(a), Some(b)) => Some(a + b),
        _ => None,
    };

    println!("{:?}", sum);
}

gpt한테 물어본결과 다음과 같이 변경해야한다고한다. Option은 데이터의 여부만 알려주는것 같다.

'휴지통 > 러스트' 카테고리의 다른 글

러스트 Ownership2  (0) 2023.08.23
러스트 Ownership1  (0) 2023.08.22
러스트 기본프로그래밍 2 함수, 조건문, 반복문  (0) 2023.08.17
러스트 기본프로그래밍 1 변수, 출력  (0) 2023.08.17
러스트 hello world  (0) 2023.08.16