์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- ์๋ฐ
- Database
- ๋ฐฑ์ค ๋ฌ์คํธ
- ํ์ด์ฌ
- Rust
- C
- ํ์ด์ฌ ์ฒผ๋ฆฐ์ง
- ์๊ณ ๋ฆฌ์ฆ
- Reversing
- ์ฐ๋ถํฌ
- Python
- ๋ฐ์ดํฐ ํต์
- ์๋ฐ ๊ฐ๋
- ํ์ด์ฌ ์ฑ๋ฆฐ์ง
- ๋ฌ์คํธ
- ์๋ฐ ๊ธฐ์ด
- ์ค๋ผํดDB
- OS
- ๋ฐฑ์ค
- ์ค๋ผํด
- ๋ฌ์คํธ ํ๋ก๊ทธ๋๋ฐ ๊ณต์ ๊ฐ์ด๋
- java
- Operating System
- Python challenge
- ์ด์์ฒด์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ubuntu
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ
- ๋ฌ์คํธ ์์
- data communication
Archives
- Today
- Total
IT’s Portfolio
[Rust] Start Rust (Day 10) - Using Structs to Structure Related Data ๋ณธ๋ฌธ
Development Study/Rust
[Rust] Start Rust (Day 10) - Using Structs to Structure Related Data
f1r3_r41n 2023. 2. 1. 14:11728x90
๋ฐ์ํ
๐ฆ Rust Day 10
๐ณ๏ธ Using Structs to Structure Related Data
- ๊ตฌ์กฐ์ฒด(struct ๋๋ structure)๋ ์๋ก ๊ด๋ จ์ด ์๋ ์ฌ๋ฌ ๊ฐ์ ์๋ฏธ ์๋ ํ๋๋ก ๋ชจ์ผ๊ณ , ์ด๋ฆ์ ์ง์ ํด ์ ๊ทผํ ์ ์๋ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ํ์
- ๊ตฌ์กฐ์ฒด๋ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ '๊ฐ์ฒด์ ๋ฐ์ดํฐ ์์ฑ' ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํด๋ ๋ฌด๋ฐฉ
1๏ธโฃ ๊ตฌ์กฐ์ฒด ์ ์์ ์ธ์คํด์ค ์์ฑ
- ํํ๊ณผ ์ ์ฌํจ
- ๊ฐ ๋ฐ์ดํฐ์ ๋ณ๊ฐ์ ์ด๋ฆ์ ๋ถ์ฌํด์ ๊ฐ์ ์๋ฏธ๋ฅผ ๋ถ๋ช ํ๊ฒ ํํํ ์ ์์
- ๊ฐ ๋ฐ์ดํฐ์ ์ด๋ฆ์ด ์์ผ๋ฏ๋ก ํํ๋ณด๋ค ์ ์ฐํจ
- ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๊ฑฐ๋ ์ธ์คํด์ค์ ๊ฐ์ ์ฝ์ ๋ ๋ฐ์ดํฐ์ ์์์ ์์กดํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ
- ๐ ๊ตฌ์กฐ์ฒด ์ ์
struct User {
username: String,
pw: String,
email: String,
sign_in_count: u32,
active: bool,
}
struct
keyword ๋ค์์ ๊ตฌ์กฐ์ฒด์ ๋ถ์ฌํ ์ด๋ฆ ์ง์ - ์ด๋ฆ์ ๊ทธ๋ฃนํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํํ ์ ์์ด์ผ ํจ
- ์ค๊ดํธ ๋ด์ ๊ตฌ์กฐ์ฒด๊ฐ ์ ์ฅํ ๋ฐ์ดํฐ ํ์
๊ณผ ์ด๋ฆ ๋์ด
- ๋ฐ์ดํฐ๋ค์
ํ๋(field)
๋ผ ์นญํจ
- ๋ฐ์ดํฐ๋ค์
- ๐ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค ์์ฑ
let user1 = User {
username: String::from("f1r3_r41n"),
pw: String::from("a12345"),
email: String::from("qkrghkql1@gmail.com"),
sign_in_count: 3,
active: true,
};
- ํด๋น ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ๊ณผ ์ค๊ดํธ๋ฅผ ์ด์ฉํด
'key: value'
์ ์์ ๋์ดkey
: ํ๋์ ์ด๋ฆvalue
: ํด๋น ํ๋์ ์ ์ฅํ ๋ฐ์ดํฐ
- ํ๋์ ๋์ด ์์๋ ๊ตฌ์กฐ์ฒด์ ์ ์ํ ์์์ ๋ฐ๋์ ๊ฐ์ ํ์๋ ์์
- ๊ตฌ์กฐ์ฒด์ ์ ์๋ ํ์ ์ ํ ํ๋ฆฟ
- ์ธ์คํด์ค๋ ํด๋น ํ์ ์ ๊ฐ์ ์์ฑํ๊ธฐ ์ํด ํ ํ๋ฆฟ์ ๊ฐ์ ์ฑ์ด ๊ฒ
- ๐ ์ธ์คํด์ค ํ์ฉ
#[derive(Debug)]
struct User {
username: String,
pw: String,
email: String,
sign_in_count: u32,
active: bool,
}
fn main() {
let id = String::from("f1r3_r41n");
let pw = String::from("a12345");
let email = String::from("qkrghkql1@gmail.com");
let user1 = build_user(id, pw, email);
println!("{}", user1.username);
println!("{:?}", user1);
}
fn build_user(username: String, pw: String, email: String) -> User {
User{
username: username,
pw: pw,
email: email,
sign_in_count: 3,
active: true,
}
}
// Result
// f1r3_r41n
// User { username: "f1r3_r41n", pw: "a12345", email: "qkrghkql1@gmail.com", sign_in_count: 3, active: true }
- ๊ตฌ์กฐ์ฒด์์ ์ํ๋ ๊ฐ์ ์ฝ์ผ๋ ค๋ฉด
๋ง์นจํ(.)
์ฌ์ฉuser1.username
- ์ธ์คํด์ค๊ฐ ๊ฐ๋ณ ์ธ์คํด์ค์ธ ๊ฒฝ์ฐ ๋ง์นจํ๋ฅผ ์ฌ์ฉํด ํน์ ํ๋์ ์๋ก์ด ๊ฐ ๋์
๊ฐ๋ฅ
- ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค ์์ฒด๊ฐ ๊ฐ๋ณ์ด์ด์ผ ํจ
- ๋ฌ์คํธ๋ ๊ตฌ์กฐ์ฒด์ ๋ช๋ช ํ๋๋ง์ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ก ํ์ํ๋ ๊ฒ์ ์ง์ํ์ง ์์
- ํจ์๋ฅผ ์ด์ฉํด ์๋ก์ด ์ธ์คํด์ค ์์ฑ ๊ฐ๋ฅ
- ํจ์์ ๋ง์ง๋ง ํํ์์ ๋ฌต์์ ์ผ๋ก ์ ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํด์ผ ํจ
๐ค ๊ฐ์ ์ด๋ฆ์ ํ๋์ ๋ณ์๋ฅผ ํธ๋ฆฌํ๊ฒ ํ์ฉํ๊ธฐ
fn build_user(username: String, pw: String, email: String) -> User {
User{
username,
pw,
email: email,
sign_in_count: 3,
active: true,
}
}
- ํจ์์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ๊ณผ ๊ตฌ์กฐ์ฒด์ ํ๋ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ
ํ๋ ์ด๊ธฐํ ๋จ์ถ ๋ฌธ๋ฒ(field init shorthand syntax)
์ฌ์ฉ
- ์ธ์คํด์ค ํ์ฉ ๋ถ๋ถ์ ์ฝ๋ ์ค
build_user
ํจ์์ํ๋ ์ด๊ธฐํ ๋จ์ถ ๋ฌธ๋ฒ
์ ์ ์ฉํ ์ฝ๋
๐ค ๊ธฐ์กด์ ์ธ์คํด์ค๋ก๋ถํฐ ์ ์ธ์คํด์ค ์์ฑํ๊ธฐ
#[derive(Debug)]
struct User {
username: String,
pw: String,
email: String,
sign_in_count: u32,
active: bool,
}
fn main() {
let user1 = User{
username: String::from("f1r3_r41n"),
pw: String::from("a12345"),
email: String::from("qkrghkql1@gmail.com"),
sign_in_count: 3,
active: true,
};
let user2 = User{
username: String::from("gnuykob_"),
pw: String::from("b12345"),
email: String::from("leebk1124@gmail.com"),
..user1
};
println!("{:?}", user1);
println!("{:?}", user2);
}
// Result
// User { username: "f1r3_r41n", pw: "a12345", email: "qkrghkql1@gmail.com", sign_in_count: 3, active: true }
// User { username: "gnuykob_", pw: "b12345", email: "leebk1124@gmail.com", sign_in_count: 3, active: true }
- ์ด๋ฏธ ์กด์ฌํ๋ ์ธ์คํด์ค์์ ๋ช ๊ฐ์ง ํ๋์ ๊ฐ๋ง ์์ ํ ์ํ์ ์ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ
๊ตฌ์กฐ์ฒด ๊ฐฑ์ ๋ฌธ๋ฒ(struct update syntax)
์ฌ์ฉ
..
๋ฌธ๋ฒ์ ๋ช ์์ ์ผ๋ก ๋์ดํ์ง ์์ ๋๋จธ์ง ํ๋์ ๋ํด์๋ ๊ธฐ์กด์ ์ธ์คํด์ค ํ๋์ ๊ฐ์ ๊ฐ์ ์ฌ์ฉํ๋ผ๋ ์๋ฏธ ๋ดํฌ
๐ค ์ด๋ฆ ์๋ ํ๋๋ฅผ ๊ฐ์ง ํํ ๊ตฌ์กฐ์ฒด๋ก ๋ค๋ฅธ ํ์ ์์ฑํ๊ธฐ
- ํํ๊ณผ ์ ์ฌํ๊ฒ ์๊ธด ๊ตฌ์กฐ์ฒด ์ ์ธ ๊ฐ๋ฅ
ํํ ๊ตฌ์กฐ์ฒด(tuple structs)
- ๊ตฌ์กฐ์ฒด์๋ ์ด๋ฆ์ ๋ถ์ฌํ์ง๋ง, ํ๋์๋ ์ด๋ฆ์ ๋ถ์ฌํ์ง ์๊ณ ํ์ ๋ง ์ง์
- ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ์ฒด์ฒ๋ผ ํ๋์ ์ด๋ฆ์ ๋ถ์ฌํ๋ ๊ฒ์ด ๊ท์ฐฎ๊ฑฐ๋ ๋ถํ์ํ๊ณ , ํํ ์์ฒด์๋ง ์ด๋ฆ์ ๋ถ์ฌํด ์ฌํ์ ํํ๋ค๊ณผ๋ ๋ค๋ฅธ ํ์ ์ผ๋ก ๊ตฌ๋ถํ๊ณ ์ ํ ๋ ์ ์ฉํจ
- ๐ ํํ ๊ตฌ์กฐ์ฒด ์ ์
struct
keyword์ ๊ตฌ์กฐ์ฒด ์ด๋ฆ, ํํ ์์์ ์ฌ์ฉํ ํ์ ๋ค์ ์ฐจ๋ก๋ก ๋์ด- ๊ฐ์ ํ์
๋ค์ ํฌํจํ๋ ๊ฐ๊ฐ์ ํํ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ ์๋ก ๋ค๋ฅธ ํ์
- '
B
ํํ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค' ์ ๊ฐ์ ํ์ ์ ํฌํจํ 'A
ํํ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค' ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ํจ์์ 'B
ํํ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค' ๋ฅผ ์ธ์๋ก ์ ๋ฌ ๋ถ๊ฐ๋ฅ
- '
- ์์ ์ ๋ง ์ ์ธํ๋ฉด ํํ๊ณผ ๋๊ฐ์ด ๋์ํจ
- (1). ๊ฐ ํ๋๊ฐ์ ๋์ํ๋ ๋ณ์๋ก ํด์ฒด ๊ฐ๋ฅ
- (2).
๋ง์นจํ(.)
์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ๊ฐ๋ณ ํ๋๊ฐ์ ์ ๊ทผ ๊ฐ๋ฅ
๐ค ํ๋๊ฐ ์๋ ์ ์ฌ ์ ๋ ๊ตฌ์กฐ์ฒด
- ํ๋๊ฐ ํ๋๋ ์๋ ๊ตฌ์กฐ์ฒด ์ ์ธ ๊ฐ๋ฅ
์ ์ฌ ์ ๋ ๊ตฌ์กฐ์ฒด(unit-like structs)
- ์ด ๊ตฌ์กฐ์ฒด๋ ์ ๋ ํ์
, ์ฆ
()
๊ณผ ์ ์ฌํ๊ฒ ๋์ํ๊ธฐ ๋๋ฌธ
- ์ ์ฌ ์ ๋ ๊ตฌ์กฐ์ฒด๋ ์ด๋ค ํ์ ์ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํด์ผ ํ์ง๋ง, ํ์ ์ ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ์์ ๋ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์์
- ๐ ๊ตฌ์กฐ์ฒด ๋ฐ์ดํฐ์ ์์ ๊ถ
- ์ด ๊ธ์์ ๊ตฌ์กฐ์ฒด ์ ์ ์
&str
๋ฌธ์์ด ์ฌ๋ผ์ด์ค ํ์ ์ด ์๋String
ํ์ ์ ์ฌ์ฉํ๊ณ ์์- ๊ตฌ์กฐ์ฒด๊ฐ ๋ฐ์ดํฐ์ ์์ ๊ถ์ ๊ฐ๊ฒ ํจ์ผ๋ก์จ ์ ํจํ ๋ฒ์ ๋ด์ ์กด์ฌํ๋ ๋์ ๊ทธ ๋ฐ์ดํฐ๋ ์ ํจํ ์ ์๋๋ก ํ๊ธฐ ์ํ ์๋์
- ๊ตฌ์กฐ์ฒด์ ๋ค๋ฅธ ๋ณ์๊ฐ ์์ ํ ๋ฐ์ดํฐ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ ์ ์์
์๋ช (lifetimes)
๋ฅผ ์ฌ์ฉํด์ผ ํจ- ์๋ช ์ ๊ตฌ์กฐ์ฒด์ ์ ํจ ๋ฒ์ ์์์ ๊ตฌ์กฐ์ฒด๊ฐ ์ฐธ์กฐํ๋ ๋ฐ์ดํฐ๊ฐ ์ ํจํ๋๋ก ๋ณด์ฅํด ์ค
- ์๋ช ์ ์ง์ ํ์ง ์๊ณ ๊ตฌ์กฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ฉด ์ ์์ ์ผ๋ก ๋์ํ์ง ์์
- ์์ง ์๋ช
์ ๋ํด ์ดํด๋ณด์ง ์์๊ธฐ์
String
ํ์ ๊ณผ ๊ฐ์ด ์์ ํ ์ ์๋ ํ์ ์ ์ฌ์ฉํ ๊ฒ์
- ์ด ๊ธ์์ ๊ตฌ์กฐ์ฒด ์ ์ ์
2๏ธโฃ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์์ ํ๋ก๊ทธ๋จ
- ์ฌ๊ฐํ์ ๋ฉด์ ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ ์์ฑ
- ๋ณ์๋ฅผ ์ด์ฉํด ํ๋ก๊ทธ๋จ ์์ฑ ํ ๊ตฌ์กฐ์ฒด ์ฌ์ฉ ํํ๋ก ๋ฆฌํฉํ ๋ง
๐ค ๋ณ์ ์ด์ฉ
fn main() {
let width1: u32 = 30;
let height1: u32 = 50;
println!(
"์ฌ๊ฐํ 1์ ๋ฉด์ : {} ์ ๊ณฑ ํฝ์
",
get_area(width1, height1)
);
}
fn get_area(width: u32, height: u32) -> u32 {
width * height
}
// Result
// ์ฌ๊ฐํ 1์ ๋ฉด์ : 1500 ์ ๊ณฑ ํฝ์
get_area
ํจ์๋ ํ ์ฌ๊ฐํ์ ๋ฉด์ ์ ๊ตฌํ์ง๋ง, ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์์- ๋๋น์ ๋์ด๋ฅผ ์ฐ๊ด์ง์ ์ ์๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ๊ฐ๋ ์ฑ์ด ํฅ์๋๋ ๊ฒ ์ ๋ฌผ๋ก ๊ด๋ฆฌ๋ ์ฌ์ธ ๊ฒ ์
๐ค ํํ ์ด์ฉ
fn main() {
let width1: u32 = 30;
let height1: u32 = 50;
println!(
"์ฌ๊ฐํ 1์ ๋ฉด์ : {} ์ ๊ณฑ ํฝ์
",
get_area((width1, height1))
);
}
fn get_area(compression: (u32, u32)) -> u32 {
compression.0 * compression.1
}
// Result
// ์ฌ๊ฐํ 1์ ๋ฉด์ : 1500 ์ ๊ณฑ ํฝ์
- ํํ์ ์์์ ์ด๋ฆ์ ๋ถ์ฌํ์ง ์์
- ๊ฐ ์์์ ์๋ฏธ๊ฐ ๋ช ํํ์ง ์์
๐ค ๊ตฌ์กฐ์ฒด ์ด์ฉ : ๋ ๋ง์ ์๋ฏธ ๋ฐ์ํ๊ธฐ
struct Rectangle {
width: u32,
height: u32,
}
fn main() {
let rectangle1 = Rectangle{ width: 30, height: 50, };
let rectangle2 = Rectangle{ width: 31, height: 45, };
println!(
"์ฌ๊ฐํ 1์ ๋ฉด์ : {} ์ ๊ณฑ ํฝ์
",
get_area(&rectangle1)
);
println!(
"์ฌ๊ฐํ 2์ ๋ฉด์ : {} ์ ๊ณฑ ํฝ์
",
get_area(&rectangle2)
);
}
fn get_area(rectangle: &Rectangle) -> u32 {
rectangle.width * rectangle.height
}
// Result
// ์ฌ๊ฐํ 1์ ๋ฉด์ : 1500 ์ ๊ณฑ ํฝ์
// ์ฌ๊ฐํ 2์ ๋ฉด์ : 1395 ์ ๊ณฑ ํฝ์
- ๋ฐ์ดํฐ์ ์ด๋ฆ์ ๋ถ์ฌํด์ ์๋ฏธ๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด ๊ตฌ์กฐ์ฒด ์ฌ์ฉ
get_area
ํจ์๋ ํ๋์ ๋งค๊ฐ๋ณ์๋ง์ ์ฌ์ฉํ๊ณ ์์- ๋งค๊ฐ๋ณ์ ํ์ ์ ๊ตฌ์กฐ์ฒด์ ๋ถ๋ณ ์ธ์คํด์ค์ ๋ํ ๋์ฌ
- ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด
main
ํจ์๊ฐ ํด๋น ๋ณ์์ ์์ ๊ถ์ ๊ณ์ ๊ฐ๊ณ ์์ผ๋ฏ๋ก ์ถ๊ฐ์ ์ผ๋ก ๋ฒ์ ๋ด์์ ์ฌ์ฉํ ์ ์์
๐ค ํธ๋ ์ดํธ๋ฅผ ์์ํด์ ์ ์ฉํ ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
- ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๊ฐ ๊ฐ์ง ๊ฐ๋ค์ ํ์ธํ ์ ์๋ค๋ฉด ๋๋ฒ๊น ์ ๋งค์ฐ ํจ์จ์ ์ผ ๊ฒ์
println!("rectangle1 : {}", rectangle1);
$=>$Error
- ๐
println
๋งคํฌ๋ก- ๋ค์ํ ํ์์ผ๋ก ๋ฌธ์์ด ์ถ๋ ฅ ๊ฐ๋ฅ
- ์ค๊ดํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ๋งคํฌ๋ก๊ฐ
Display
ํ์์ ์ถ๋ ฅํ๋๋ก ํจDisplay
ํ์ : ์ต์ข ์ฌ์ฉ์๋ฅผ ์ํ ์ถ๋ ฅ ํ์
- ๊ธฐ๋ณธ ํ์
๋ค์ ์์ ์ ํํํ ๋ฐฉ๋ฒ์ด ๋จ ํ ๊ฐ์ง๋ฐ์ ์๊ธฐ์
Display
ํ์์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ๋์ด ์์ - ๊ตฌ์กฐ์ฒด์ ๋น์ทํ ์ฌ๋งํ ์ปดํ์ด๋ ํ์ ๋ค์ ์์ ์ ์ถ๋ ฅํ ๋ฐฉ๋ฒ์ด ํ๋ ์ด์์
- ๋ฌ์คํธ๋ ์ฐ์๋ ๊ฐ์ ๊ฐ๋ ํ์
์ ๋ํด
Display
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ์ง ์๋๋ก ๋จ๊ฒจ๋ println
๋งคํฌ๋ก์ ์ค๊ดํธ ์์:?
์ฐ์ฐ์๋ฅผ ์ง์ ํ๋ฉดDebug
๋ผ๋ ์ถ๋ ฅ ํ์์ ์ด์ฉํด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํจDebug
ํธ๋ ์ดํธ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ ์ฉํ ํ์์ผ๋ก ๊ตฌ์กฐ์ฒด์ ๊ฐ์ ์ถ๋ ฅํจ- ๋ฌ์คํธ๋ ๋๋ฒ๊น ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ๊ตฌ์กฐ์ฒด๋ ์ด ๊ธฐ๋ฅ์ ๋ช ์์ ์ผ๋ก ๊ตฌํํด์ฃผ์ด์ผ ํจ
#[derive(Debug)]
์ ๋ ธํ ์ด์ ์ ๊ตฌ์กฐ์ฒด ์ ์์ ์ถ๊ฐ- ๊ตฌ์กฐ์ฒด์ ํฌํจ๋ ํ๋์ ์๊ฐ ๋ง๋ค๋ฉด
:?
๋์:#?
์ฌ์ฉ
- ๋ฌ์คํธ๋
derive
์ ๋ ธํ ์ด์ ์ ์ด์ฉํด ์ฌ์ฉ์ ์ ์ ํ์ ์ ์ ์ฉํ ๋์์ ์ ์ฉํ ์ ์๋ ๋ค์ํ ํธ๋ ์ดํธ ์ ๊ณต
3๏ธโฃ ๋ฉ์๋ ๋ฌธ๋ฒ
๋ฉ์๋(method)
๋ ํจ์์ ์ ์ฌํจfn
keyword๋ก ์ ์ํ๋ฉฐ, ์ด๋ฆ, ๋งค๊ฐ๋ณ์, ๋ฆฌํด ํ์ ์ ์ ์ ๊ฐ๋ฅ- ํธ์ถ ์ ์คํํ ์ผ๋ จ์ ์ฝ๋๋ ์ ์ ๊ฐ๋ฅ
- ํจ์์ ๋ฌ๋ฆฌ ๊ตฌ์กฐ์ฒด์
์ปจํ ์คํธ(context)
์์ ์ ์ํ๋ฉฐ, ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ํญ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ํํํ๋self
์ด์ด์ผ ํจ- ๋ฉ์๋๋ ์ด๊ฑฐ์๋ ํธ๋ ์ดํธ ๊ฐ์ฒด์๋ ์ ์ ๊ฐ๋ฅ
๐ค ๋ฉ์๋ ์ ์ํ๊ธฐ
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn get_area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let rectangle1 = Rectangle{ width: 30, height: 50, };
let rectangle2 = Rectangle{ width: 31, height: 45, };
println!(
"์ฌ๊ฐํ 1์ ๋ฉด์ : {} ์ ๊ณฑ ํฝ์
",
rectangle1.get_area()
);
println!(
"์ฌ๊ฐํ 2์ ๋ฉด์ : {} ์ ๊ณฑ ํฝ์
",
rectangle2.get_area()
);
}
// Result
// ์ฌ๊ฐํ 1์ ๋ฉด์ : 1500 ์ ๊ณฑ ํฝ์
// ์ฌ๊ฐํ 2์ ๋ฉด์ : 1395 ์ ๊ณฑ ํฝ์
- ๊ตฌ์กฐ์ฒด ํ์
์ ์ปจํ
์คํธ ์์ ํจ์ ์ ์ ์
impl(implementation)
๋ธ๋ก ์ด์ฉ - ๋ฉ์๋ ๋ฌธ๋ฒ ์ฌ์ฉ์ผ๋ก
get_area
๋ฉ์๋๋Rectangle
์ธ์คํด์ค ์์์ ํธ์ถ ๊ฐ๋ฅ - ๋ฉ์๋ ๋ฌธ๋ฒ์ ์ธ์คํด์ค ๋ค์์ ๋ฐ๋ผ์ด
- ์ธ์คํด์ค ๋ค์์ ๋ง์นจํ, ๋ฉ์๋์ ์ด๋ฆ, ๊ดํธ, ํ์ํ ์ธ์๋ฅผ ์ ๋ฌํ๋ฉด ๋จ
get_area
๋ฉ์๋์ ์๊ทธ๋์ฒ๊ฐ&self
์- ํจ์๊ฐ
Rectangle
๊ตฌ์กฐ์ฒด์ ์ปจํ ์คํธ ์์ ์กด์ฌํ๋ฏ๋ก ๋ฌ์คํธ๋self
์ ํ์ ์ดRectangle
์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ - ๋ฉ์๋๋
self
์ ๋ํ ์์ ๊ถ์ ๊ฐ๊ฑฐ๋self
์ ๋ถ๋ณ ์ธ์คํด์ค๋ฅผ ๋์ฌํ๊ฑฐ๋self
์ ๊ฐ๋ณ ์ธ์คํด์ค๋ฅผ ๋์ฌํ ์ ์์
- ํจ์๊ฐ
- ํด๋น ์ฝ๋์์๋ ๋จ์ํ ๊ตฌ์กฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ฟ ๊ฐ์ ์ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ์์ ๊ถ์ ๊ฐ์ง ํ์๊ฐ ์์
- ์ฐธ์กฐ์ ์ฌ์ฉ ์ด์
- ๋ฉ์๋๋ฅผ ํธ์ถํ ์ธ์คํด์ค์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ค๋ฉด ๋งค๊ฐ๋ณ์๋ฅผ
&mut self
๋ก ์ ์ธํด์ผ ํจ- ๋งค๊ฐ๋ณ์๋ฅผ
self
๋ก๋ง ์ ์ธํ์ฌ ์ธ์คํด์ค์ ๋ํ ์์ ๊ถ์ ๊ฐ๋ ๋ฉ์๋๋ ๋๋ฌพ - ๋ฉ์๋๊ฐ
self
๋ฅผ ๋ค๋ฅธ ์ธ์คํด์ค๋ก ๊ต์ฒดํ ํ ํธ์ถ์๊ฐ ๋ ์ด์ ์์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ํ ๊ฒฝ์ฐ์ ํ์ฉ
- ๋งค๊ฐ๋ณ์๋ฅผ
- ๐ ํจ์ ๋์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ์ฅ์
- (1). ํธ์ถ ๋๋ง๋ค ๋งค๊ฐ๋ณ์๋ก ํ์ ์ ๋๊ฒจ์ค ํ์๊ฐ ์์
- (2). ์ฝ๋๋ฅผ ๋ ์ ์ ๋ฆฌํ ์ ์์
- ๐
->
์ฐ์ฐ์๋ ์ด๋์?- C๋ CPP์์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์๋ก ๋ค๋ฅธ ์ฐ์ฐ์ ์ฌ์ฉ
- ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ๋
.
์ฐ์ฐ์ ์ฌ์ฉ - ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด ๋ฉ์๋๋ฅผ ํธ์ถ ์
->
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํฌ์ธํฐ๋ฅผ์ญ์ฐธ์กฐ(dereference)
ํด์ผ ํจ - ๊ฐ์ฒด๊ฐ ํฌ์ธํฐ์ผ ๋๋
object->something()
์(*object).something()
๊ณผ ์ ์ฌํจ
- ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ๋
- ๋ฌ์คํธ์๋
->
์ฐ์ฐ์์ ํด๋นํ๋ ์ฐ์ฐ์๊ฐ ์์- ๋ฌ์คํธ๋
์๋ ์ฐธ์กฐ ๋ฐ ์ญ์ฐธ์กฐ(automatic referencing and dereferencing)
๊ธฐ๋ฅ ์ ๊ณต - ๋ฉ์๋์ ํธ์ถ ์ญ์ ๋ฌ์คํธ๊ฐ ์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ ๋ถ๋ถ ์ค ํ๋
- ๋ฌ์คํธ๋
object.something()
๊ณผ ๊ฐ์ด ๋ฉ์๋ ํธ์ถ ์ ๋ฌ์คํธ๋ ๋ฉ์๋์ ์๊ทธ๋์ฒ์ ๋ฐ๋ผ ์๋์ผ๋กobject
๋ณ์์&
,&mut
, ๋๋*
์ ์ถ๊ฐํจp1.distance(&p2);
$=$(&p1).distance(&p2);
- ์๋ ์ฐธ์กฐ ๊ธฐ๋ฅ์ ๋ฉ์๋๊ฐ ์์ ์, ์ฆ
self
์ ํ์ ์ ๋ช ํํ๊ฒ ์ ์ธํ๊ธฐ์ ๋์ํ๋ ๊ฒ์ - ๋ฉ์๋์ ์์ ์์ ์ด๋ฆ ๋๋ถ์ ๋ฌ์คํธ๋ ์ด ๋ฉ์๋๊ฐ ๊ฐ์ ์ฝ๋์ง
(&self)
, ๊ฐ์ ์ฐ๋์ง(&mut self)
, ์๋๋ฉด ์๋นํ๋์ง(self)
๋ฅผ ์ ํํ ์ ์ ์์
- C๋ CPP์์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์๋ก ๋ค๋ฅธ ์ฐ์ฐ์ ์ฌ์ฉ
๐ค ๋ ๋ง์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ ๋ฉ์๋
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn get_area(&self) -> u32 {
self.width * self.height
}
fn can_hold(&self, other: &Rectangle) -> bool {
self.width>other.width && self.height>other.height
}
}
fn main() {
let rectangle1 = Rectangle{ width: 30, height: 50, };
let rectangle2 = Rectangle{ width: 10, height: 40, };
let rectangle3 = Rectangle{ width: 60, height: 45, };
println!(
"์ฌ๊ฐํ 1์ ๋ฉด์ : {} ์ ๊ณฑ ํฝ์
",
rectangle1.get_area()
);
println!(
"์ฌ๊ฐํ 2์ ๋ฉด์ : {} ์ ๊ณฑ ํฝ์
",
rectangle2.get_area()
);
println!(
"์ฌ๊ฐํ 1์ด ์ฌ๊ฐํ 2๋ฅผ ํฌํจํ๋๊ฐ? {}",
rectangle1.can_hold(&rectangle2)
);
println!(
"์ฌ๊ฐํ 1์ด ์ฌ๊ฐํ 3์ ํฌํจํ๋๊ฐ? {}",
rectangle1.can_hold(&rectangle3)
);
}
// Result
// ์ฌ๊ฐํ 1์ ๋ฉด์ : 1500 ์ ๊ณฑ ํฝ์
// ์ฌ๊ฐํ 2์ ๋ฉด์ : 400 ์ ๊ณฑ ํฝ์
// ์ฌ๊ฐํ 1์ด ์ฌ๊ฐํ 2๋ฅผ ํฌํจํ๋๊ฐ? true
// ์ฌ๊ฐํ 1์ด ์ฌ๊ฐํ 3์ ํฌํจํ๋๊ฐ? false
- ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค์ ๋ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ์ ๋ฌํด์ ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค์ ๋ฉด์ ์ด ๋ ๋ฒ์งธ ์ธ์คํด์ค์ ๋ฉด์ ์ ์์ ํ ํฌํจํ ์ ์๋ค๋ฉด
true
๋ฆฌํด, ๊ทธ๋ ์ง ์์ผ๋ฉดfalse
๋ฅผ ๋ฆฌํดํ๋ ์ฝ๋ - ๋ฉ์๋์ ์ฌ๋ฌ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด
self
๋งค๊ฐ๋ณ์ ์ดํ์ ์ํ๋ ๋งํผ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๋ฉด ๋จ
๐ค ์ฐ๊ด ํจ์
impl
๋ธ๋ก์self
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ค๋ฅธ ํจ์๋ก ์ ์ํ ์ ์์ =>์ฐ๊ด ํจ์(associated functions)
- ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ง์ ์ ๋ฌ๋ฐ์ง ์๊ธฐ์ ๋ฉ์๋๊ฐ ์๋ ํจ์์
- Ex)
String::from
ํจ์
- Ex)
- ์ฐ๊ด ํจ์๋ ๊ตฌ์กฐ์ฒด์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ฆฌํดํ๋
์์ฑ์(constructors)
๋ฅผ ๊ตฌํํ ๋ ์์ฃผ ์ฌ์ฉ
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn square(size: u32) -> Rectangle {
Rectangle { width: size, height: size }
}
}
fn main() {
let square1 = Rectangle::square(4);
println!(
"width: {}\nheight: {}",
square1.width, square1.height
);
}
// Result
// width: 4
// height: 4
- ์ฐ๊ด ํจ์๋ฅผ ํธ์ถํ๋ ค๋ฉด ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ๊ณผ
::
๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋จ - ์ฐ๊ด ํจ์๋ ํด๋น ๊ตฌ์กฐ์ฒด์ ๋ํด์๋ง ์ฌ์ฉํ ์ ์์
::
๋ฌธ๋ฒ์ ์ฐ๊ด ํจ์์ ํธ์ถ๋ฟ๋ง ์๋๋ผ ๋ชจ๋์ด ์์ฑํ๋์ด๋ฆ ๊ณต๊ฐ(namespace)
์ ์์๋ ์ฌ์ฉ๋จ
๐ค ์ฌ๋ฌ ๊ฐ์ impl ๋ธ๋ก
- ๊ฐ ๊ตฌ์กฐ์ฒด๋ ์ฌ๋ฌ ๊ฐ์
impl
๋ธ๋ก ์ ์ธ ๊ฐ๋ฅ - ์ ๋ค๋ฆญ ํ์ ๊ณผ ํธ๋ ์ดํธ์์ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์์
Summary
- ๊ตฌ์กฐ์ฒด๋ ํ๋ก๊ทธ๋จ ๋ด์์ ํน์ ํ ์๋ฏธ๊ฐ ์๋ ์ฌ์ฉ์ ์ ์ ํ์ ์ ์ ์ธํ๊ธฐ ์ํ ๊ฐ๋
- ๋ฉ์๋๋ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค์ ์ํ๋ ๋์์ ๋ถ์ฌํจ
- ์ฐ๊ด ํจ์๋ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๊ฐ ์๋ ์ํฉ์์ ๊ตฌ์กฐ์ฒด์ ์ ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌ๋ถ์ง๋ ๋ฐ ํ์ฉํ ์ ์์
- ๊ตฌ์กฐ์ฒด๊ฐ ์ฌ์ฉ์ ์ ์ ํ์ ์ ์ ์ธํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋
728x90
๋ฐ์ํ
'Development Study > Rust' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Comments