가변 구조체
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 23번째.
기본적으로 Rust의 구조체 인스턴스는 불변(immutable)입니다. 즉, 인스턴스를 생성한 후에는 필드 값을 변경할 수 없습니다. 하지만 다른 변수들과 마찬가지로, 선언할 때 mut 키워드를 추가하여 구조체 인스턴스를 가변(mutable)으로 만들 수 있습니다.
구조체 인스턴스를 가변(mutable)으로 선언하면, 점 표기법(dot notation)을 사용하여 필드 중 하나를 수정할 수 있습니다:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // player가 가변이므로 작동합니다mut 키워드가 없으면, 필드를 변경하려고 시도할 때 컴파일 에러가 발생합니다. 가변성은 구조체 인스턴스 전체에 적용됩니다. 즉, 다른 필드들을 불변으로 유지하면서 특정 필드만 가변으로 만들 수는 없습니다.
챌린지
쉬움플레이어 이름, 초기 점수(정수), 추가할 보너스 점수(정수), 그리고 최종 점수 조정값(정수)까지 총 네 개의 입력을 받게 됩니다. String 타입의 name 필드와 i32 타입의 score 필드를 가진 Player 구조체를 정의하세요. 이 구조체의 가변(mutable) 인스턴스를 생성한 다음, 입력받은 값들을 사용하여 score 필드를 여러 번 수정하십시오.
요구 사항:
name: String과score: i32필드를 가진Player구조체를 정의합니다.- 첫 번째 입력을 플레이어 이름으로 읽습니다.
- 두 번째 입력을 읽고 초기 점수를 위해
i32로 변환합니다. - 이 값들을 사용하여
Player구조체의 가변(mutable) 인스턴스를 생성합니다. - 세 번째 입력을 읽고 보너스 점수를 위해
i32로 변환합니다. - 도트 노테이션(dot notation)을 사용하여 플레이어의 현재 점수에 보너스 점수를 더합니다.
- 네 번째 입력을 읽고 최종 조정값을 위해
i32로 변환합니다. - 플레이어의 현재 점수에 최종 조정값을 더합니다.
- 아래에 표시된 정확한 형식으로 플레이어 정보를 출력합니다.
입력:
- 첫 번째 줄: 플레이어 이름 (예:
Alice) - 두 번째 줄: 정수 형태의 초기 점수 (예:
50) - 세 번째 줄: 정수 형태의 보너스 점수 (예:
30) - 네 번째 줄: 정수 형태의 최종 조정값 (예:
20)
출력:
- 첫 번째 줄:
Player: [name] - 두 번째 줄:
Final Score: [score]
치트 시트
Rust의 구조체 인스턴스는 기본적으로 불변(immutable)입니다. 생성 후 필드 값을 수정하려면 mut 키워드를 사용하여 인스턴스를 가변(mutable)으로 선언하세요:
let mut player = Player {
name: String::from("Alice"),
score: 0,
};
player.score = 100; // 점 표기법을 사용하여 필드 수정가변성은 구조체 인스턴스 전체에 적용됩니다. 다른 필드는 불변으로 유지하면서 특정 필드만 가변으로 만들 수는 없습니다.
직접 해보기
use std::io;
// TODO: 여기에 name과 score 필드를 가진 Player 구조체를 정의하세요
fn main() {
// 플레이어 이름 읽기
let mut name = String::new();
io::stdin().read_line(&mut name).expect("Failed to read line");
let name = name.trim().to_string();
// 초기 점수 읽기
let mut initial_score = String::new();
io::stdin().read_line(&mut initial_score).expect("Failed to read line");
let initial_score: i32 = initial_score.trim().parse().expect("Invalid number");
// 보너스 점수 읽기
let mut bonus = String::new();
io::stdin().read_line(&mut bonus).expect("Failed to read line");
let bonus: i32 = bonus.trim().parse().expect("Invalid number");
// 최종 조정 점수 읽기
let mut adjustment = String::new();
io::stdin().read_line(&mut adjustment).expect("Failed to read line");
let adjustment: i32 = adjustment.trim().parse().expect("Invalid number");
// TODO: 가변(mutable) Player 인스턴스를 생성하세요
// TODO: 플레이어의 점수에 보너스 점수를 더하세요
// TODO: 플레이어의 점수에 최종 조정 점수를 더하세요
// TODO: 요구되는 형식으로 출력을 프린트하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.