본문 바로가기
개발/러스트 (Rust)

Rust 기본, 구조체 (Struct) Implementation blocks

by snowoods 2024. 8. 1.

https://rustacean.net/

 

Rust 기본 : 구조체 (Struct) Implementation blocks

 

구현 블록 (Implementation blocks)

구현 블록은 주어진 유형에 대한 기능을 구현합니다.

주어진 유형에는 struct, enum, trait 이렇게 세가지가 있습니다.

 

그리고 주어진 유형에 대해,

 - 메서드(method) : 인스턴스 함수.

 - 연관 함수(associated function) : 인스턴스 없이 호출, C++의 정적 메서드 역할.

 - 특성 구현(trait implementation) : 특성(trait)을 통해 정의된 인터페이스를 실제 타입에서 구현.

 

여기서는 구조체에 대한 메서드와 연관 함수에 구현을 설명합니다.

 


 

메소드(method)

 - 첫번째 함수 인자를 self, &self, &mut self로 사용하면 메소드가 된다.

 - self를 사용할 경우 함수 호출이 끝나면 인스턴스가 삭제되어 다시 사용할 수 없다.

struct Student {
    first_name: String,
    last_name: String,
    roll_no: u16, // 학생 등록 번호
}

impl Student {
    fn get_name(&self) -> String { // 구조체 데이터 읽기
        format!("{} {}", self.first_name, self.last_name)
    }
    fn set_roll_no(&mut self, new_roll_no: u16) { // 구조체 데이터 수정
        self.roll_no = new_roll_no;
    }
    fn convert_to_string(&self) -> String { // 새 데이터 리턴 (should take ownership)
        format!(
            "Name: {} {}, Roll no: {}",
            self.first_name, self.last_name, self.roll_no
        )
    }
    fn destroy(self) {}
}

fn main() {
    // 직접 구조체 생성
    let mut student = Student {
        first_name: "Harry".to_string(),
        last_name: "Potter".to_string(),
        roll_no: 42,
    };
    
    println!("Student is: {}", student.get_name());
    student.set_roll_no(50);
    let student_details = student.convert_to_string();
    println!("{student_details}");
    student.destroy(); // 명시적 인스턴스 삭제
}

 

연관 함수 만들기 (static function)

struct ShopItem {
    name: String,
    quantity: u32,
}

impl ShopItem {
    fn new(name: String, quantity: u32) -> ShopItem {
        ShopItem { name, quantity }
    }
    fn in_stock(&self) -> bool {
        self.quantity > 0
    }
}

fn main() {
    // 직접 구조체를 생성하는 것 보다는 new 함수를 구현하는 게 더 가독성이 좋다.
    let item = ShopItem::new("Pants".to_string(), 450);
    
    if item.in_stock() {
        println!("{} remaining: {}", item.name, item.quantity);
    } else {
        println!("{} not in stock", item.name);
    }
}