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 |