C.W.K.
Stream
Lesson 03 of 05 · published

구조체 정의하기

~11 min · types, structs, data-modeling

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

struct 는 관련 데이터를 네 타입으로 이름 붙이고 묶는 방법이야. Rust 는 세 모양을 주는데, 첫 번째를 제일 자주 쓰게 돼.

이름 붙은 필드 struct

일꾼: 이름이랑 타입이 있는 필드들. 각 필드를 이름 붙여 인스턴스를 만들고, 점 표기로 필드에 접근해. 필드에 이름이 있어서 코드가 스스로 읽혀 — user.emailuser.2 를 매번 이겨.

튜플 struct 와 unit struct

튜플 struct 는 이름 없는 타입 필드를 가져 — struct Meters(f64) 처럼 맨 숫자에 구별되는 타입을 주는 얇은 래퍼에 좋아. unit struct 는 필드가 아예 없어 — 마커로, 또는 데이터는 안 저장하고 trait 을 구현할 때 쓸모 있어. 둘 다 틈새고; 이름 붙은 필드 struct 가 주류야.

필드 init 단축이랑 struct update. 변수가 필드랑 같은 이름이면 email: email 대신 그냥 email 이라 써. 그리고 리터럴 끝의 ..other 가 나머지 필드를 다른 인스턴스에서 채워 — '저거랑 같은데 이거만 바꿔' 에 딱이야.

struct 는 모델링의 심장이야

소유권이 데이터가 어떻게 움직이는지 말한다면, struct 는 데이터가 무엇 인지 말해. 잘 이름 붙은 struct 에 잘 고른 필드 타입이면 유효하지 않은 상태를 표현하기 어렵게 만들어 — Rust 의 'illegal state 를 표현 불가능하게' 철학의 전반부야. (후반부는 enum, 바로 다음 트랙.)

Code

이름 붙은 필드, 튜플 struct, 단축, update 문법·rust
#[derive(Debug)]
struct User {
    name: String,
    email: String,
    active: bool,
}

struct Meters(f64); // 튜플 struct: f64 를 두른 구별되는 타입

fn main() {
    let name = String::from("Ferris");
    let u = User {
        name,                      // 필드 init 단축 (name: name)
        email: String::from("f@rust.org"),
        active: true,
    };
    // struct update: u 랑 같은데, inactive
    let u2 = User { active: false, ..u };
    let dist = Meters(42.0);
    println!("{:?} active={} dist={}", u2.name, u2.active, dist.0);
}

External links

Exercise

필드 최소 세 개짜리 User struct 를 정의해. 필드 init 단축으로 인스턴스 하나를 짓고, struct update 문법 (..first) 으로 필드 하나만 바꾸는 두 번째를 지어. Debug 를 derive 하고 둘 다 출력해. update 문법이 첫 인스턴스에서 복사하는 String 필드들엔 뭘 해?
Hint
struct update 는 String 같은 non-Copy 필드를 출처에서 *move* 해. ..u 후엔 u 의 move 된 필드들을 더는 못 써 — 배운 그 소유권 규칙이 이제 struct 리터럴 안에 있는 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.