Post

7. Rust struct 자료형

다른 언어에서는 클래스를 사용하지만, 러스트에서는 구조체를 사용합니다.

구조체는 데이터 필드, 메서드, 연관 함수를 가질 수 있습니다. 구조체와 그 필드의 구문은 struct 키워드로 시작하여, 대문자 카멜 케이스로 구조체의 이름을 작성한 뒤 중괄호로 둘러싸는 것으로 이루어집니다. 예를 들어, RedFox라는 구조체가 있다면 다음과 같습니다.

1
2
3
4
struct RedFox {
    field1: i32,
    field2: String,
}

구조체의 인스턴스를 생성하는 것은 간단하지만 다소 장황합니다. 모든 필드에 대한 값을 지정해 주어야 합니다. 일반적으로는 연관 함수를 구현하여 기본값을 가진 구조체를 생성하는 생성자 역할을 수행한 다음 해당 함수를 호출합니다. (Java에서는 static method, C++에서는 정적 멤버 함수와 동일한 개념입니다)

메서드와 연관 함수는 구조체 정의와 별도의 구현 블록에서 정의됩니다. 구현 블록은 impl 키워드로 시작하며, 구현할 구조체의 이름이 뒤에 옵니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
impl RedFox {
    // 연관 함수(생성자)
    fn new(name: String, age: u8) -> Self {
        RedFox { name, age }
    }

    // 메서드
    fn do_something(&self) {
        // 메서드 내용
    }

    fn display_info(&self) {
        println!("Name: {}", self.name);
        println!("Age: {} years", self.age);
    }
}

fn main() {
    // associated function을 사용하여 RedFox 구조체 인스턴스 생성
    let red_fox = RedFox::new(String::from("Foxy"), 3);

    // 메서드 호출
    red_fox.display_info();
}

여기서 new() 함수는 연관 함수이므로 첫 번째 매개변수로 self를 갖지 않습니다. 이 함수는 주로 다른 언어의 생성자 역할을 수행하며, 새로운 기본값을 가진 구조체를 생성합니다. 메서드는 항상 첫 번째 매개변수로 self를 갖습니다.

이제 구조체를 생성하고 필드에 접근하거나 메서드를 호출할 수 있습니다. 이는 대부분의 언어에서 사용되는 도트 구문과 유사합니다.

연관 함수

연관 함수(associated function)는 특정 타입에 속한 함수로서, 해당 타입의 인스턴스와 무관하게 호출될 수 있는 함수입니다. 즉, 연관 함수는 인스턴스의 메서드가 아니며, 첫 번째 매개변수로 인스턴스를 받지 않습니다. 연관 함수는 해당 타입의 네임스페이스에 속하므로 이를 호출할 때는 해당 타입의 이름을 통해 접근합니다.

러스트에서는 연관 함수를 주로 생성자로 사용하거나, 특정 타입에 대한 기능을 제공하는 함수로 활용합니다. 연관 함수는 구조체의 인스턴스를 생성하는 데 사용되는 패턴이며, 일반적으로 new라는 이름을 가집니다.

구조체에서는 연관 함수를 impl 블록 내에서 정의합니다. 이 함수들은 해당 구조체의 이름 공간 안에 존재하므로 구조체의 인스턴스를 생성하는 데 사용됩니다.

러스트에서는 클래스 상속이라는 개념이 없습니다. 이는 구조체 상속이라고도 불립니다. 상속이 없는 이유는 상속이 해결하려는 문제를 더 나은 방식으로 해결하기 위해 트레이트를 선택했기 때문입니다.

This post is licensed under CC BY 4.0 by the author.