티스토리 뷰
구조체
구조체는 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 |