Rust, 쉽게 하자!

Rust 입문

[Rust] Struct

바로크냥 2022. 10. 5. 23:18

1. Struct

구조체, Struct 는 필드 또는 멤버라고 불리는 데이터들을 묶어 놓은 데이터 집합입니다. 

필드(멤버)는 각각 다른 타입을 가질 수 있습니다. 그리고 이름을 가집니다. 

구조체를 하나 만들어 보겠습니다.

 

struct People {      // 1  구조체 선언
    name: String,
    age: u32,
    job: String,
}

fn main() {
    // 2 구조체 인스턴스 생성
    let mut man1 = People {
        name: String::from("Jane"),
        age: 12,
        job: String::from("student"),
    };
    println!("{} is a {} old {}", man1.name, man1.age, man1.job);
}

// 출력
Jane is a 12 old student

 

// 1: 먼저 구조체 People을 만들었습니다.

필드로 name, age, job을 가지고 있습니다. 

// 2: main 함수에는 People 구조체 타입으로 정의된 man1이라는 객체 (또는 인스턴스)를 만들었습니다. 이때 각 필드의 값을 지정했습니다. 이것을 ‘초기화’라고 합니다. 

필드값은 다시 할당할 수 있습니다. 물론 People 타입 객체를 만들 때 미리 mut 키워드로 변수가 변화 가능하도록 선언 해 둬야만 가능합니다.

위 코드에 몇 줄 첨가해 보겠습니다. 이미 초기화 된 필드값을 변경합니다.

 

struct People {
    name: String,
    age: u32,
    job: String,
}

fn main() {
    let mut man1 = People {
        name: String::from("Jane"),
        age: 12,
        job: String::from("student"),
    };
    Println!(“{} is a {} old {}", man1.name,man1.age, man1.job);
    
   // 필드값 다시 할당
    man1.name = "John".to_string();
    man1.age = 33;
    man1.job = "programmer".to_string();
    println!("{} is a {} old {}", man1.name,man1.age, man1.job);
}

// 출력
Jane is a 12 old student
John is a 33 old programmer

 

객체의 필드에 접근 할 때는 man1.age처럼 “.”을 사용합니다. 

 

객체의 필드값이 아닌 객체 자체를 출력 하고 싶으면 구조체를 선언할 때 Debug 트레이트를 구현 해야 합니다.

Debug 트레이트는 Rust에 미리 정의 되어서 제공되는 트레이트 중에 하나 입니다.

자세한 내용은 뒤에서 트레이트를 설명할 때 살펴 보겠습니다. 

여기서는 다음 코드와 같이 포맷터를 사용 해야 객체 자체를 출력할 수 있고, 또 이것이 가능 하려면  Debug 트레이트가 구현 되어 있어야 한다는 정도만 알아 두시길 바랍니다.

 

#[derive(Debug)]     // Debug 트레이트 적용
struct People{
    name: String,
    age: u32,
    job: String,
}

fn main() {
let mut man1 = People{
    name: "Jane".to_string(),
    age: 30,
    job: "Player".to_string()
};

    println!("{:?}", man1);       // 출력 포맷 1
    println!("{:#?}", man1);      // 출력 포맷 2
}

// 출력
People { name: "Jane", age: 30, job: "Player" }
People {
    name: "Jane",
    age: 30,
    job: "Player",
}

 

People 구조체 선언부 위에 붙어 있는 다음 코드는

#[derive(Debug)] 

attribute이라고 부릅니다. 이 코드는 Debug 트레이트를 People 구조체에 구현 시킵니다.

다르게 표현하면, 이제 People 구조체는 Debug 속성을 가지고 있습니다.

#[derive(트레이트)] 

이 코드는 Rust에 미리 선언되어 있는 트레이트를, 적용되는 구조체에 맞게 자동으로 구현합니다.

트레이트를 다룰 때 자세히 알아 보겠습니다.


참고로, 객체 man1을 출력하는 println!() 매크로를 보면 두 가지 포맷을 사용해서 출력 했습니다.

포맷 1은 “:?”을 사용 했습니다. 이때의 출력은 

People { name: "Jane", age: 30, job: "Player" }

입니다. 

포맷 2는 “:#?”을 사용 했습니다. 이때의 출력은 조금 다릅니다.

People {
    name: "Jane",
    age: 30,
    job: "Player",
}

Rust 레퍼런스에는 포맷2를 prettier format, 더 예쁜 포맷이라고 부르고 있습니다.


 Rust에는 튜플을 활용한  특이한 구조체도 있습니다.

다음 코드를 보겠습니다.

#[derive(Debug)]
struct Color(u8, u8, u8);    // 튜플을 활용한 구조체 선언

fn main(){
   let color = Color(100,150, 200);
    println!("color = ({}, {}, {})", color.0, color.1, color.2);    // 요소 접근
    println!("{:#?}", color);       // 구조체 출력
  }  

// 출력
color = (100, 150, 200)
Color(
    100,
    150,
    200,
)

다음과 같이 구조체 Color를 선언했습니다.

struct Color(u8, u8, u8);

 

요소 잡근은 튜픙의 요소 접근과 같은 방법을 사용합니다.

 

반응형

'Rust 입문' 카테고리의 다른 글

[Rust] Method  (2) 2022.10.07
[Rust] Enum  (0) 2022.10.05
[Rust] Closure  (0) 2022.10.05
[Rust] 함수  (0) 2022.10.05
[Rust] match  (0) 2022.10.02