함수 매개변수로서의 구조체
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 24번째.
이제 구조체를 생성하고 수정하는 방법을 알게 되었으니, 함수와 함께 사용하는 방법을 살펴보겠습니다. Rust의 다른 데이터 타입과 마찬가지로, 구조체 인스턴스를 함수에 전달하거나 함수에서 반환할 수 있습니다.
구조체를 함수에 전달하려면, 함수 정의에서 이를 매개변수로 포함하기만 하면 됩니다:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}이 함수는 Rectangle 구조체를 매개변수로 받아서 i32를 반환합니다. 함수 내부에서는 다른 곳에서와 마찬가지로 점 표기법을 사용하여 구조체의 필드에 접근할 수 있습니다.
반환 타입으로 구조체 타입을 지정하여 함수에서 구조체를 반환할 수도 있습니다:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}함수와 함께 구조체(structs)를 사용하면 코드가 더 체계적이고 의미 있게 됩니다. 여러 개의 개별 매개변수를 전달하는 대신, 관련된 데이터를 함께 그룹화하여 정의가 잘 된 하나의 단위로 전달할 수 있습니다.
챌린지
쉬움네 개의 입력을 받게 됩니다: 사각형의 너비(정수), 사각형의 높이(정수), 정사각형의 한 변의 길이(정수), 그리고 선택 번호(1 또는 2). width: i32와 height: i32라는 두 개의 필드를 가진 Rectangle 구조체를 정의하세요. 두 개의 함수를 만드세요: 하나는 Rectangle을 매개변수로 받아 면적을 계산하는 함수이고, 다른 하나는 변의 길이를 매개변수로 받아 정사각형을 나타내는 Rectangle을 반환하는 함수입니다. 입력받은 선택 번호에 따라 적절한 면적을 계산하고 출력하세요.
요구 사항:
width: i32와height: i32필드를 가진Rectangle구조체를 정의합니다.Rectangle을 매개변수로 받아i32(면적)를 반환하는calculate_area함수를 만듭니다.i32(변의 길이)를 매개변수로 받아 너비와 높이가 같은Rectangle을 반환하는create_square함수를 만듭니다.- 첫 번째 입력을 읽어 사각형의 너비를 위한
i32로 변환합니다. - 두 번째 입력을 읽어 사각형의 높이를 위한
i32로 변환합니다. - 이 치수들을 사용하여
Rectangle인스턴스를 생성합니다. - 세 번째 입력을 읽어 정사각형의 변의 길이를 위한
i32로 변환합니다. - 네 번째 입력을 읽어 선택 번호(1 또는 2)를 위한
i32로 변환합니다. - 선택 번호가 1인 경우: 사각형의 면적을 계산하고 출력합니다.
- 선택 번호가 2인 경우:
create_square를 사용하여 정사각형을 생성한 후, 그 면적을 계산하고 출력합니다.
입력:
- 첫 번째 줄: 정수 형태의 사각형 너비 (예:
8) - 두 번째 줄: 정수 형태의 사각형 높이 (예:
5) - 세 번째 줄: 정수 형태의 정사각형 변의 길이 (예:
6) - 네 번째 줄: 1 또는 2 중 하나의 정수 형태 선택 번호 (예:
1)
출력:
- 선택 번호가 1인 경우:
Rectangle area: [area] - 선택 번호가 2인 경우:
Square area: [area]
치트 시트
구조체는 함수의 매개변수로 전달될 수 있으며, 함수에서 반환될 수도 있습니다.
구조체를 함수에 전달하려면, 이를 매개변수로 포함하세요:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}함수에서 구조체를 반환하려면, 반환 타입으로 구조체 타입을 지정하세요:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}함수 내부에서는 점 표기법(dot notation)을 사용하여 구조체 필드에 접근합니다. 함수와 함께 구조체를 사용하면 여러 개의 개별 매개변수를 전달하는 대신 관련된 데이터를 하나로 묶을 수 있습니다.
직접 해보기
use std::io;
// TODO: 여기에 Rectangle 구조체를 정의하세요
// TODO: 여기에 calculate_area 함수를 정의하세요
// TODO: 여기에 create_square 함수를 정의하세요
fn main() {
// 사각형의 너비를 읽습니다
let mut width_input = String::new();
io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: i32 = width_input.trim().parse().expect("Invalid input");
// 사각형의 높이를 읽습니다
let mut height_input = String::new();
io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: i32 = height_input.trim().parse().expect("Invalid input");
// 정사각형의 변 길이를 읽습니다
let mut side_input = String::new();
io::stdin().read_line(&mut side_input).expect("Failed to read line");
let side: i32 = side_input.trim().parse().expect("Invalid input");
// 선택지를 읽습니다
let mut choice_input = String::new();
io::stdin().read_line(&mut choice_input).expect("Failed to read line");
let choice: i32 = choice_input.trim().parse().expect("Invalid input");
// TODO: 아래에 코드를 작성하세요
// Rectangle 인스턴스를 생성하고, 선택지를 확인한 후, 적절한 면적을 계산하세요
// 선택지에 따라 결과를 출력합니다
// 사용 예: println!("Rectangle area: {}", area); 또는 println!("Square area: {}", area);
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.