구조체 선언
struct User {
name: String,
email: String,
active: bool,
}
구조체 인스턴스 생성
fn main() {
let user = User {
name: String::from("rust"),
email: String::from("rust@email.com"),
active: true
};
println!("name = {}", user.name);
}
구조체 필드 변경
변수와 마찬가지로 인스턴스 생성 시 mut을 붙여줘야 한다.
fn main() {
let mut user = User {
name: String::from("rust"),
email: String::from("rust@email.com"),
active: true
};
user.email = String::from("rust@example.com");
println!("name = {}", user.name);
}
구조체 생성 함수 사용
// 매번 선언하기 귀찮으니 구조체 만드는 함수 선언해서 그때그때 호출해서 인스턴스 생성.
// 디폴트 값 (ex. active=true)을 매번 넣어주지 않아도 된다.
fn build_user(name: String, email: String) -> User { // 인스턴스 생성해서 소유권 포함 반환.
User {
name: name,
email: email,
active: true, // true로 고정.
}
}
fn main(){
let mut user = build_user(name: String::from("홍길동"), email:String::from("gildong@example.com"));
}
구조체 축약형
fn build_user(name: String, email: String) -> User {
User {
name, // 이름이 같은 경우 생략 가능
email, // 이름이 같은 경우 생략 가능
active: true,
}
}
fn main() {
let user1 = User {
name: String::from("홍길동"),
email: String::from("gildong@example.com"),
active: true,
};
let user2 = User {
active: false,
..user1 // active 필드 제외, user1을 그대로 복사해와서 사용 가능.
}
}
구조체를 튜플 처럼 사용
구조체를 간략하게 튜플 대신 사용할 수 있다.
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let color = Color(1, 2, 3);
let point = Point(1, 2, 3);
color.0;
color.1;
}
예제
fn main() {
let rect = (20, 30);
println!("해당 사각형의 면적은 {}.", area(rect));
}
fn area(rect: (u32, u32)) -> u32 {
rect.0 * rect.1
}
// 디버깅 목적으로
#[derive (Debug)] // 컴파일러에게 지시자. Debug를 위한 걸 만들어줘!
struct Rectangle {
width: u32,
height: u32,
}
fn main() {
let rect = Rectangle {
width: 20,
height: 30,
};
println!("해당 사각형의 면적은 {}.", area(&rect));
// println!("사각형 = {:?}", rect); :? 를 붙이면 디버깅 목적 메소드 호출
// dbg!(rect); 디버깅 매크로
}
fn area(rect: (u32, u32)) -> u32 {
rect.width * rect.height
}
인프런 김대현님의 우아한 고성능 프로그래밍 언어 Rust 입문 및 활용 강좌를 참고하였습니다.