Rust Defining and Instantiating Structs

고승우·2023년 6월 5일
0
post-thumbnail

Defining and Instantiating Structs (구조체 정의하고 초기화하기)

stuctstuples과 다르게 다양한 타입들을 조합할 수 있고, tuples처럼 순서를 외울 필요가 없다. struct를 선언하기 위해서 struct 키워드를 사용한다.

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

해당 구조체의 instance를 사용하기 위해선, curly brackets(중괄호)를 활용해 key: value 쌍을 추가해야 한다.

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

구조체의 특정 값을 가져오기 위해서는 dot notation을 써야 한다,

user1.email = String::from("anotheremail@example.com");

구조체의 instance는 mutable 해야 한다. Rust는 특정 부분만 mutable하게 두지 않는다. 아래 코드에서는 build_user함수를 활용해 새로운 User instance를 반환해준다.

fn build_user(email: String, username: String) -> User {
    User {
        email: email,
        username: username,
        active: true,
        sign_in_count: 1,
    }
}

Using the Field Init Shorthand

parameter 와 field의 이름이 같은 경우 이를 축약할 수 있다.

fn build_user(email: String, username: String) -> User {
    User {
        email: email,
        username: username,
        active: true,
        sign_in_count: 1,
    }
}

Instances from Other Instances with Struct Update Syntax

새로운 struct의 instance를 만들 때, 다른 instance에 있는 값들을 그대로 사용할 수 있는 편한 문법이 있다. 아래 코드는 email과 username을 제외한 다른 값들은 모두 user1에서 가져온다는 뜻이다.

let user2 = User {
    email: String::from("another@example.com"),
    username: String::from("anotherusername567"),
    ..user1
};

Tuple Struct

Rust에서는 tuples와 비슷한 tuple structs를 지원해준다. tuple structs를 정의하기 위해서 struct 키워드를 시작으로 tuple 내에 데이터 타입을 적어주면 된다. 모든 요소의 타입이 같아야만 하는 것은 아니다.

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

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

Unit-Like Structs

filed가 없는 struct를 선언할 수 있다.이러한 구조체를 unit-list struct라고 한다. 아직 필드를 어떻게 선언할 지 모르는 상황에서 유용하다. 일종의 추상화라고 생각하면 이해하기 쉽다.

struct AlwaysEqual;

fn main() {
    let subject = AlwaysEqual;
}

Ownership of Struct Data

위의 예시에서는 String 타입을 사용했다. struct에서 &str과 같은 reference를 사용할 수 있지만, lifetimes의 사용을 전제로 한다. 구조체가 존재하는 동안 참조하는 데이터도 계속 존재할 수 있도록 하는 것이다. 만약 lifetime을 사용하지 않고 저장하고자 하면 compile error 가 난다.

struct User {
    username: &str,		// missing lifetime specifer
    email: &str,		// missing lifetime specifer
    sign_in_count: u64,
    active: bool,
}

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

0개의 댓글