학습
Rust 구조체 (Structs)
Rust 구조체 (Structs) — 중급
구조체 (Structs)
1. 도입 (왜 배워야 하는가)
구조체는 Rust에서 복잡한 데이터 구조를 정의하는 데 필수적인 요소입니다. 실무에서는 객체지향 프로그래밍의 개념을 활용하여 데이터를 그룹화하고 관련 기능을 함께 묶어 효율적으로 관리할 수 있게 해줍니다. 예를 들어, 소프트웨어 개발에서 사용자 정보, 제품 정보 등을 다룰 때 각각의 속성과 행동을 정의할 수 있습니다.
구조체를 모르면 데이터 관리를 효과적으로 수행할 수 없으며, 프로그램이 복잡해질수록 코드의 가독성과 유지보수성이 떨어집니다. 이는 결국 버그 발생 가능성을 높이고, 시간과 비용을 추가로 소모하게 됩니다.
2. 핵심 개념 설명
구조체는 여러 개의 관련된 데이터를 하나의 단위로 묶는 사용자 정의 데이터 타입입니다. 구조체를 사용하면 프로그램의 데이터 모델을 보다 명확하게 정의할 수 있습니다.
예를 들어, 자동차를 생각해보세요. 자동차는 색상, 제조사, 모델명 등 여러 속성을 가집니다. 이러한 속성을 구조체로 정의하면 코드의 이해와 관리가 쉬워집니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 구조체 (Struct) | 여러 개의 필드를 가진 사용자 정의 데이터 타입 |
| 필드 (Field) | 구조체가 가진 데이터 항목 |
| 메서드 (Method) | 구조체와 관련된 동작을 정의하는 함수 |
3. 기본 코드 예제
아래는 기본적인 구조체 사용법을 보여주는 코드입니다.
struct Car {
color: String,
make: String,
model: String,
}
fn main() {
let my_car = Car {
color: String::from("Red"),
make: String::from("Toyota"),
model: String::from("Corolla"),
};
println!("My car is a {} {} {}", my_car.color, my_car.make, my_car.model);
}
실행 결과
My car is a Red Toyota Corolla
코드 한 줄씩 동작 설명
struct Car { ... }:Car라는 이름의 구조체를 정의하며,color,make,model이라는 세 개의 필드를 포함합니다.let my_car = Car { ... };:Car구조체의 인스턴스를 생성하고my_car라는 변수에 저장합니다.println!(...):my_car의 속성을 출력합니다.- 구조체는 관련 데이터를 그룹화하여 코드의 가독성을 높인다.
- 필드와 메서드를 통해 구조체의 속성과 행동을 정의할 수 있다.
- 실무에서 데이터를 효과적으로 관리하기 위해 구조체는 필수적이다.
- 열거형 (Enums)
- 트레잇 (Traits)
- 제네릭 (Generics)
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니 구현
쇼핑몰에서 사용자 장바구니를 관리하기 위해 구조체를 사용할 수 있습니다.
struct Item {
name: String,
price: f64,
}
struct Cart {
items: Vec<Item>,
}
impl Cart {
fn add_item(&mut self, item: Item) {
self.items.push(item);
}
fn total_price(&self) -> f64 {
self.items.iter().map(|item| item.price).sum()
}
}
fn main() {
let mut cart = Cart { items: Vec::new() };
cart.add_item(Item { name: String::from("Laptop"), price: 999.99 });
cart.add_item(Item { name: String::from("Mouse"), price: 49.99 });
println!("Total price: ${:.2}", cart.total_price());
}
실행 결과
Total price: $1049.98
예제 2: 학생 정보 관리
학생 정보를 관리하기 위한 구조체 예제입니다.
struct Student {
name: String,
age: u32,
}
impl Student {
fn introduce(&self) {
println!("안녕하세요, 저는 {}이고, {}살입니다.", self.name, self.age);
}
}
fn main() {
let student = Student { name: String::from("홍길동"), age: 20 };
student.introduce();
}
실행 결과
안녕하세요, 저는 홍길동이고, 20살입니다.
5. 흔한 실수와 주의사항
실수 1: 구조체 필드 접근 오류
struct Person {
name: String,
}
fn main() {
let person = Person { name: String::from("Alice") };
println!("{}", person.age); // 오류 발생
}
→ 올바른 코드: age 필드를 구조체에 추가해야 한다.
실수 2: 메서드 호출 시 소유권 문제
impl Person {
fn get_name(&self) -> String {
self.name // 소유권을 이동시키려 함
}
}
→ 올바른 코드: &self.name으로 참조를 반환해야 한다.
6. 정리
다음에 학습하면 좋은 주제: