티스토리 뷰

Rust-Language

구조체

kmj24 2021. 4. 7. 01:11

구조체 

구조체는 tuple과 비슷하게, 구성요소들은 각자 다른 타입을 지닐 수 있다.

또한 각 구성요소들을 명명하여 값이 의미하는 바를 명확히 할 수 있다.

구조체 명명 규칙은 Upper Case로 작성

 

struct 생성 방법

ex) 유저 정보

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

정의한 구조체를 사용하기위해 각 필드의 값을 명세한 instance를 생성해야 함. (구조체 정의 시 필드의 순서는 상관 없음)

    let mut user1 = User{
        email : String::from("user1@google.com"),
        username : String::from("user1"),
        active: true,
        sign_in_count: 1
    };

구조체의 특정 값을 읽으려면 . 키워드 사용하면 된다.

    let mut user1 = User{
        email : String::from("user1@google.com"),
        username : String::from("user1"),
        active: true,
        sign_in_count: 1
    };
    println!("{}", user1.email);

인스턴스는 반드시 mutable상태이어야 하며, 특정 필드만 변경할 수 있도록 할 수 없다.

 

인스턴스를 반환하는 함수를 만들 수 있다.

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

구조체 갱신법

인스턴스 내의 값을 다른 인스턴스 요소의 값을 그대로 사용할 수 있다. 

    let mut user3 = User{
        email : user2.email,
        username : user1.username,
        sign_in_count : user1.sign_in_count,
        active : user2.active
    };

익명 구조체

필드의 타입만 정의, 명명은 할 수 없는 tuple과 유사한 구조체도 있다.

해당 인스턴스를 정의 하고 접근할 때는 인덱스로 접근한다.

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

let black = Color(0, 1, 2);
let origin = Point(2, 1, 0);
println!("{}", black.0);
println!("{}", origin.1);

유사 유닛 구조체

어떠한 필드도 없는 구조체이다.

유사 유닛 구조체는 특정한 타입의 trait을 구현해야 함. trait 학습 후 다시 봐야겠다.

struct Pc();

구조체의 소유권

구조체는 데이터의 참조(소유권이 없는 타입)를 저장할 수 있지만, lifetimes의 사용을 전제로하여야 한다.

lifetimes는 구조체가 존재하는 동한 참조하는 데이터를 계속 존재할 수 있도록 함.

아래는 lifetimes를 사용하지 않은 상태로 소유권이 없는 타입을 정의 했을 경우 나는 오류이다. 

요거도 추후 lifetimes를 학습 후 다시 봐야겠다.

 

 

이 장의 전체 코드

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

//익명 구조체
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

//유사유닛구조체
struct Pc();

#[derive(Debug)] //Debug 트레잇을 파생시키기위한 annotation
struct Rectangle{
    length : u32,
    width : u32
}

pub fn run(){
    let mut user1 = User{
        email : String::from("user1@google.com"),
        username : String::from("user1"),
        active: true,
        sign_in_count: 1
    };
    println!("{}", user1.email);
    let mut user2 = build_user(String::from("user2@google.com"), String::from("user2"));
    println!("{}", user2.email);
    let mut user3 = User{
        email : user2.email,
        username : user1.username,
        sign_in_count : user1.sign_in_count,
        active : user2.active
    };
    println!("{}", user3.email);

    let black = Color(0, 1, 2);
    let origin = Point(2, 1, 0);
    println!("{}", black.0);
    println!("{}", origin.1);

    let rect1 = Rectangle { length: 50, width: 30};
    println!("area : {}", area(&rect1)); //구조체를 활용한 argument를 넘겨줌
    println!("rect1 is {:?}", rect1); //:?는 Debug라 불리는 출력 포맷을 사용
    println!("rect1 is {:#?}", rect1); //:#? 정리해서 출력해줌
}

fn area(rectangle: &Rectangle) -> u32{
    rectangle.length * rectangle.width
}

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

 

 

참고 : rinthel.github.io/rust-lang-book-ko/ch05-01-defining-structs.html

 

구조체를 정의하고 생성하기 - The Rust Programming Language

구조체는 3장에서 학습한 튜플과 비슷합니다. 튜플과 유사하게, 구조체의 구성요소들은 각자 다른 타입을 지닐 수 있습니다. 그러나 튜플과는 다르게 각 구성요소들은 명명할 수 있어 값이 의미

rinthel.github.io

'Rust-Language' 카테고리의 다른 글

열거형  (0) 2021.04.09
method  (0) 2021.04.07
Slices  (0) 2021.04.05
참조자와 빌림  (0) 2021.04.03
소유권(Ownership)  (0) 2021.04.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함