소개
이 랩에서는 Rust 프로그래밍 언어의 구조체 (structure) 를 탐구해 보겠습니다. struct 키워드를 사용하여 생성할 수 있는 구조체는 튜플 구조체 (tuple struct), 클래식 C 구조체 (classic C struct), 그리고 유닛 구조체 (unit struct) 의 세 가지 유형이 있습니다. 튜플 구조체는 본질적으로 명명된 튜플이며, C 구조체는 C 프로그래밍에서 발견되는 전통적인 구조체이고, 유닛 구조체는 필드가 없으며 제네릭 (generics) 에 유용합니다. name과 age 필드를 가진 Person과 같이 여러 필드를 가진 구조체를 정의할 수 있습니다. 또한, 구조체는 다른 구조체의 필드로 재사용될 수 있습니다. 예를 들어, 왼쪽 상단과 오른쪽 하단 모서리를 나타내는 두 개의 Point 구조체로 구성된 Rectangle의 예시를 볼 수 있습니다. 필드 초기화 축약 (field init shorthand) 을 사용하여 구조체를 초기화하고, 점 표기법 (dot notation) 을 사용하여 해당 필드에 접근할 수 있습니다. let 바인딩을 사용하여 구조체를 분해 (destructure) 하는 것도 가능합니다. 또한, 이 랩에서는 두 가지 활동을 제공합니다. 중첩 분해 (nested destructuring) 를 사용하여 Rectangle의 면적을 계산하는 함수 rect_area를 생성하고, Point와 f32를 인수로 받아 해당 지점에 왼쪽 상단 모서리가 있고 너비와 높이가 f32에 해당하는 Rectangle을 반환하는 함수 square를 생성하는 것입니다.
참고: 랩에서 파일 이름을 지정하지 않은 경우, 원하는 파일 이름을 사용할 수 있습니다. 예를 들어,
main.rs를 사용하고rustc main.rs && ./main으로 컴파일하고 실행할 수 있습니다.
구조체 (Structures)
struct 키워드를 사용하여 생성할 수 있는 구조체는 세 가지 유형이 있습니다.
- 튜플 구조체 (Tuple structs): 기본적으로 명명된 튜플입니다.
- 클래식 C 구조체 (classic C structs)
- 유닛 구조체 (Unit structs): 필드가 없으며 제네릭 (generics) 에 유용합니다.
// 사용하지 않는 코드에 대한 경고를 숨기는 속성입니다.
#![allow(dead_code)]
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}
// 유닛 구조체
struct Unit;
// 튜플 구조체
struct Pair(i32, f32);
// 두 개의 필드를 가진 구조체
struct Point {
x: f32,
y: f32,
}
// 구조체는 다른 구조체의 필드로 재사용될 수 있습니다.
struct Rectangle {
// 사각형은 공간에서 왼쪽 상단과 오른쪽 하단 모서리가 어디에 있는지 지정하여 정의할 수 있습니다.
top_left: Point,
bottom_right: Point,
}
fn main() {
// 필드 초기화 축약 (field init shorthand) 으로 구조체 생성
let name = String::from("Peter");
let age = 27;
let peter = Person { name, age };
// 디버그 구조체 출력
println!("{:?}", peter);
// `Point` 인스턴스화
let point: Point = Point { x: 10.3, y: 0.4 };
// point 의 필드에 접근
println!("point coordinates: ({}, {})", point.x, point.y);
// 다른 point 의 필드를 사용하여 구조체 업데이트 구문을 사용하여 새로운 point 를 만듭니다.
let bottom_right = Point { x: 5.2, ..point };
// `bottom_right.y` 는 `point.y` 와 동일합니다. 왜냐하면 `point` 에서 해당 필드를 사용했기 때문입니다.
println!("second point: ({}, {})", bottom_right.x, bottom_right.y);
// `let` 바인딩을 사용하여 point 를 분해 (destructure) 합니다.
let Point { x: left_edge, y: top_edge } = point;
let _rectangle = Rectangle {
// 구조체 인스턴스화도 표현식입니다.
top_left: Point { x: left_edge, y: top_edge },
bottom_right: bottom_right,
};
// 유닛 구조체 인스턴스화
let _unit = Unit;
// 튜플 구조체 인스턴스화
let pair = Pair(1, 0.1);
// 튜플 구조체의 필드에 접근
println!("pair contains {:?} and {:?}", pair.0, pair.1);
// 튜플 구조체 분해
let Pair(integer, decimal) = pair;
println!("pair contains {:?} and {:?}", integer, decimal);
}
활동 (Activity)
Rectangle의 면적을 계산하는 함수rect_area를 추가합니다 (중첩 분해 (nested destructuring) 를 사용해 보세요).Point와f32를 인수로 받아 왼쪽 상단 모서리가 해당 지점에 있고 너비와 높이가f32에 해당하는Rectangle을 반환하는 함수square를 추가합니다.
요약
축하합니다! 구조체 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.