구조체 정의 방법
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
struct
키워드를 사용한다.- 타입스크립트 인터페이스 정의와 비슷하다.
// 타입스크립트 예제
export interface User {
createdAt: string;
id: string;
isAdmin: boolean;
karma: number;
}
구조체 초기화 방법
- 구조체를 정의만 해서는 실제로 메모리에 아무것도 생기지 않는다.
- 구조체를 인스턴스화 해야 메모리에 실제 객체가 생긴다.
let user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};
구조체 인스턴스 내부 값 변경
let mut user1 = User {
email: String::from("someone@example.com"),
username: String::from("someusername123"),
active: true,
sign_in_count: 1,
};
user1.email = String::from("anotheremail@example.com");
.
기호를 이용해 변경이 가능하다.
함수를 통해 구조체 반환하기
fn build_user(email: String, username: String) -> User {
User {
email: email,
username: username,
active: true,
sign_in_count: 1,
}
}
builder
함수의 예제이다.
필드 축약법
이용하여 코드 간결하게 만들기
fn build_user(email: String, username: String) -> User {
User {
email,
username,
active: true,
sign_in_count: 1,
}
}
- js 처럼 필드 축약법 (field init shorthand) 을 이용해 간결한 코드로 만든 예제이다.
구조체 갱신법
이용하여 코드 간결하게 만들기
let user2 = User {
email: String::from("another@example.com"),
username: String::from("anotherusername567"),
active: user1.active,
sign_in_count: user1.sign_in_count,
};
let user2 = User {
email: String::from("another@example.com"),
username: String::from("anotherusername567"),
..user1
};
- 위의 코드와 아래의 코드는 의미가 같다.
- 구조체 갱신법 (struct update syntax) 이라 불리는 방법을 이용한 것이다.
튜플 구조체 만들어보기
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
- 각각 다른 타입을 넣는 것도 가능하다.
- RGB 를 의미하는
Color
혹은 좌표 값의Point
등에 유용하게 사용 가능하다. - 필드 값의 이름을 명명하지 않아도 의미가 자연스레 설명되는 경우 유용하다.
유사 유닛 구조체
- 유사 유닛 구조체 (unit-like structs) 는 아무런 필드도 없는 구조체이다.
- 특정한
트레잇(trait)
을 구현해야 하지만, 타입 자체에 데이터를 저장하지 않는 경우에 유용하다.
구조체 데이터 소유권
struct User {
username: &str,
email: &str,
sign_in_count: u64,
active: bool,
}
fn main() {
let user1 = User {
email: "someone@example.com",
username: "someusername123",
active: true,
sign_in_count: 1,
};
}
위와 같이 구조체 속성에 참조값을 넣을 수도 있지만, 라이프타임을 명시하지 않으면 에러가 난다.
error[E0106]: missing lifetime specifier
-->
|
2 | username: &str,
| ^ expected lifetime parameter
error[E0106]: missing lifetime specifier
-->
|
3 | email: &str,
| ^ expected lifetime parameter
반응형
'러스트 (Rust)' 카테고리의 다른 글
러스트 (Rust) 메서드 (Method) 문법 (0) | 2022.11.03 |
---|---|
러스트 (Rust) 구조체를 이용한 리팩토링 연습 (0) | 2022.11.03 |
러스트 (Rust) 의 슬라이스 (Slice) 개념 (0) | 2022.11.02 |
러스트 (Rust) 의 참조자 (References) 와 빌림 (Borrowing) 개념 (0) | 2022.11.02 |
러스트 (Rust) 의 소유권 (ownership) 개념 (0) | 2022.11.02 |