- 구조체 : 사용자들이 연관된 여러 값들을 묶어서 의미있는 데이터 단위를 정의
일반 구조체
- 구조체를 정의 할 때는 struct 키워드 사용
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
- 정의한 구조체를 사용할려면 각 필드의 값을 명세한 인스턴스 생성
let user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};
- 구조체에서 값을 읽어오려면, 점(.) 표기법 사용
- 값을 변경할 때도 마찬가지
fn build_user(email: String, username: String) -> User {
User {
email: email,
username: username,
active: true,
sign_in_count: 1,
}
}
- 구조체 초기화 방법 - 함수 이용
fn build_user(email: String, username: String) -> User {
User {
email,
username,
active: true,
sign_in_count: 1,
}
}
- 구조체 초기화 방법 - 구조체 갱신법 이용
let user2 = User {
email: String::from("another@example.com"),
username: String::from("anotherusername567"),
active: user1.active,
sign_in_count: user1.sign_in_count,
};
- 구조체 초기화 방법 - 다른 구조체의 필드와 동일한 값이 들어갈 때
- email/username은 원하는 값을 넣고, 나머지는 user1의 값과 동일let user2 = User {
email: String::from("another@example.com"),
username: String::from("anotherusername567"),
..user1
};
튜플 구조체
- 구조체 명을 통해 의미 부여가 가능하나, 타입만 정의
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
println!로 구조체 출력하기
- {} 내에 :? 혹은 :#? 명시자를 집어넣어 Debug 포맷 사용 요청
- #[derive(Debug)]를 젤 첫줄에 넣어줘 명시적 Debug 허용
#[derive(Debug)]
struct Rectangle {
length: u32,
width: u32,
}
fn main() {
let rect1 = Rectangle { length: 50, width: 30 };
println!("rect1 is {:?}", rect1);
}
rect1 is Rectangle { length: 50, width: 30 }
rect1 is Rectangle {
length: 50,
width: 30
}