구조체 정의와 인스턴스
구조체를 정의하려면 struct
키워드와 구조체에 지어줄 이름을 입력한다.
필드에는 각 구성 요소의 이름과 타입을 정의한다.
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
fn main() {
let mut user1 = User {
active: true,
username: String::from("someusername123"),
email: String::from("someone@example.com"),
sign_in_count: 1,
};
user1.email = String::from("anotheremail@example.com");
}
구조체를 사용하려면 인스턴스를 생성한다. 생성은 정의와 동일한 형식으로 키:값 쌍 형태로 추가하고, 생성된 인스턴스의 필드에는 .
으로 접근한다.
변수명과 필드명이 같다면 축약법을 사용할 수 있다.
fn build_user(email: String, username: String) -> User {
User {
active: true,
username,
email,
sign_in_count: 1,
}
}
업데이트
일부 필드만 수정해 새로운 인스턴스를 만들 때, 구조체 업데이트 문법을 사용할 수 있다.
fn main() {
let user2 = User {
email: String::from("another@example.com"),
..user1
};
}
email값만 바꾸고 나머지는 user1의 값과 동일하게 하라는 의미이다.
구조체 업데이트는 =
을 사용하므로 이동하라는 뜻이다. 따라서 user2
를 생성하면 User
를 사용할 수 없다.
튜플 구조체
구조체에는 이름을 지어주고, 필드에는 이름을 붙이지 않는다.
struct Color(i32, i32,i 32);
let black = Cokor(0, 0, 0);
유사 유닛 구조체
유닛은 어떠한 값도 반환하지 않는 튜플이다.
유사 유닛 구조체(unit-like struct)는 필드가 아예 없는 구조체로, 어떤 타입에 트레이트를 구현하고 싶지만 내부에 어떤 데이터를 저장할 필요는 없을 때 사용한다.
구조체 사용
트레이트 파생으로 유용한 기능 추가하기
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
fn main() {
let rect1 = Rectangle {
width: 30,
height: 50,
};
println!("rect1 is {:?}", rect1);
}
println!
매크로의 기본 출력 형식 {}
은 Display라는 형식을 사용하는데, 이는 기본 타입에는 구현되어 있으나 구조체에는 제공되지 않는다.
{:?}
은 Debug
라는 출력 형식을 사용하겠다는 뜻이다. 디버깅 정보를 출력하는 기능은 러스트 자체에 있으나, 명시적 동의가 필요하다. 따라서 #[derive(Debug)
라는 외부 속성을 작성해야 한다.
메서드
메서드는 구조체 콘텍스트에 정의되고, 첫 번째 매개변수는 항상 self
이다. self
는 메서드를 호출하고 있는 구조체 인스턴스를 나타낸다.
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
Rectangle
구조체에 함수를 정의하려면 impl
블록을 만드는 것으로 시작한다.
매개변수는 rectangle: &Rectangle
대신 &self
를 사용했는데, 이는 self : &Self
를 줄인 것이다.
메서드는 Self
타입의 self
라는 이름의 매개변수를 첫 번째 매개변수로 가져야 한다.
impl
블록 내에 구현된 모든 함수는 연관 함수(associated function)인데, 작동하는 데 해당 인스턴스가 필요하지 않다면 self
를 첫 번째 매개변수로 갖지 않을 수도 있다. String::from
함수가 그 예이다.
메서드가 아닌 연관 함수는 보통 새 인스턴스를 반환하는 생성자로 활용된다.
'프로그래밍 > Rust' 카테고리의 다른 글
[Rust] 컬렉션 (0) | 2024.05.18 |
---|---|
[Rust]프로젝트 모듈 관리 (0) | 2024.05.17 |
[Rust] 열거형 (0) | 2024.05.17 |
[Rust] 소유권 (0) | 2024.05.16 |
[Rust] 변수, 함수, 조건문, 반복문 (0) | 2024.05.16 |