Rust | rust 개념 정리 - 구조체
포스트
취소

Rust | rust 개념 정리 - 구조체

구조체 정의

1
2
3
4
5
6
7
8
9
10
11
// 구조체 정의
struct User {
    name : String,
    email: String,
}

// 구조체 생성
let user = User {
    name : String::from("hve"),
    email: String::from("hve@example.com")
}

필드 초기화 단축 문법 (field init shorthand syntax)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fn main() {
    let name = String::from("hve");
    let email = String::from("hve@example.com");
    
    let user = get_user2(name, email);

    println!("{}", user.name);
    println!("{}", user.email);
}

fn get_user1(name:String, email:String) -> User {
    User {
        name : name,
        email: email
    }
}
fn get_user2(name:String, email:String) -> User {
    User {
        name,
        email
    }
}

구조체의 필드명과 변수명이 동일하다면 필드명 : 변수명 대신 필드명만 적어도 된다.

위의 예시에서 get_user1get_user2는 동일한 역할을 수행한다.

구조체 갱신 문법 (struct update syntax)

1
2
3
4
let user2 = User {
    name : String::from("new user"),
    ..user1
}

기존 구조체를 기반으로 새 구조체를 생성하고 싶다면, .. 를 통해 기존 구조체의 값을 그대로 가져올 수 있다.

새 필드를 추가로 입력하여 기존 구조체에서 갱신할 새 필드를 지정할 수도 있다.

새 구조체로 옮겨진 필드는 소유권이 이동했으므로 기존 구조체의 필드는 유효하지 않지만, 새 값을 추가해 새 구조체로 옮겨가지 않은 필드는 그대로 유지된다.

필드와 타입이 완벽하게 동일하더라도, 다른 구조체간 이동할 수는 없다.

튜플 구조체

1
2
3
4
5
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

let color = Color(0, 0, 0);
let point = Point(0, 0, 0);

메소드 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct Rect {
    width : i32,
    height : i32,
}

impl Rect {
    fn square(width:i32) -> Rect {
        Rect {
            width : width,
            height : width,
        }
    }
    // 메소드 생성
    fn area(&self) -> i32 {
        self.width * self.height
    }
}

impl Rect {
    // 구조체당 여러개의 impl 블럭도 허용됨
    fn show(&self) {
        println!("({}, {})", self.width, self.height);
    }
}

fn main() {
    let rect = Rect::square(16);

    println!("{}", rect.area());
    rect.show();
}

메서드의 첫번째 인자로는 self(소유권 이동), &self(불변 참조), &mut self(가변 참조)가 올 수 있다.

어떤 방식이든 변수.메서드() 로 접근한다.

첫번째 인자로 self 매개변수를 사용하지 않을 수 있으며 이때는 구조체::함수()로 접근하게 된다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.