구조체 (Struct)
구조체는 struct 키워드를 사용하여 정의하며, 이름과 중괄호로 묶인 명명된 필드 집합이 뒤따릅니다.
다음은 Person 구조체의 예입니다:
struct Person {
name: String,
age: u8,
}
구조체의 인스턴스를 생성하려면, 구조체 이름 뒤에 중괄호를 사용하고 필드에 값을 할당합니다.
예를 들면:
let person = Person { name: String::from("Alice"), age: 30 };
열거형 (Enum)
열거형(enum, "enumeration"의 줄임말)은 고정된 명명된 값 집합인 "변종(variants)"을 가진 타입을 나타냅니다.
열거형을 정의하려면, enum 키워드를 사용하고 이름과 중괄호로 묶인 명명된 변종 집합이 뒤따릅니다.
다음은 Status 열거형의 예입니다:
enum Status {
Active,
Inactive,
Pending,
}
열거형의 인스턴스를 생성하려면, 열거형 이름 뒤에 두 개의 콜론(::
)과 변종 이름을 사용합니다.
예를 들면:
let status = Status::Active;
열거형 변종에 따라 다른 작업을 수행하려면 match 표현식을 사용할 수 있습니다:
let user_status = Status::Active;
열거형을 다루려면, 종종 match 표현식을 사용하며, 이를 통해 열거형 변종에 따라 다른 작업을 수행할 수 있습니다:
fn print_status_message(status: Status) {
match status {
Status::Active => println!("사용자가 활성 상태입니다."),
Status::Inactive => println!("사용자가 비활성 상태입니다."),
Status::Pending => println!("사용자가 보류 중입니다."),
}
}
fn main() {
let user_status = Status::Active;
print_status_message(user_status);
}
Tuple Struct, Enum
주로 간결한 표현, 타입 안전성 및 논리적 구조를 위해 사용됩니다.
// 튜플 구조체 (Tuple Struct)
struct Point3D(f32, f32, f32);
// 열거형에 튜플 변종 (Tuple Enum Variant) 포함
enum Shape {
Circle(f32),
Rectangle(f32, f32),
}
fn main() {
let point = Point3D(1.0, 2.0, 3.0);
let circle = Shape::Circle(5.0);
let rectangle = Shape::Rectangle(4.0, 6.0);
// 튜플 구조체의 값에 접근
println!("x 좌표: {}", point.0);
println!("y 좌표: {}", point.1);
println!("z 좌표: {}", point.2);
// 튜플 열거형 변종의 값에 접근
match circle {
Shape::Circle(radius) => println!("원의 반지름: {}", radius),
_ => (),
}
}
Nested
중첩된 Struct과 Enum을 만들고 싶다면?
// 중첩된 구조체 (Nested Struct)
struct Address {
street: String,
city: String,
}
struct Person {
name: String,
address: Address,
}
// 중첩된 열거형 (Nested Enum)
enum Animal {
Mammal {
species: String,
is_domestic: bool,
},
Reptile {
species: String,
is_poisonous: bool,
},
}
fn main() {
let person = Person {
name: String::from("지훈"),
address: Address {
street: String::from("서울로"),
city: String::from("서울"),
},
};
let dog = Animal::Mammal {
species: String::from("개"),
is_domestic: true,
};
}