์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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
- Rust
- ์ด์์ฒด์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ค๋ผํด
- ๋ฐฑ์ค ๋ฌ์คํธ
- Database
- Operating System
- ์๋ฐ ๊ฐ๋
- ubuntu
- ๋ฌ์คํธ ํ๋ก๊ทธ๋๋ฐ ๊ณต์ ๊ฐ์ด๋
- Python
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ
- ์๊ณ ๋ฆฌ์ฆ
- ๋ฌ์คํธ
- ์๋ฐ ๊ธฐ์ด
- ์ค๋ผํดDB
- Python challenge
- ํ์ด์ฌ ์ฒผ๋ฆฐ์ง
- ํ์ด์ฌ ์ฑ๋ฆฐ์ง
- ๋ฐฑ์ค
- ๋ฌ์คํธ ์์
- ๋ฐ์ดํฐ ํต์
- java
- data communication
- ํ์ด์ฌ
- Reversing
- OS
- ์ฐ๋ถํฌ
- C
- ์๋ฐ
Archives
- Today
- Total
IT’s Portfolio
[Rust] Start Rust (Day 19) - Generic Types, Traits, and Lifetimes ๋ณธ๋ฌธ
Development Study/Rust
[Rust] Start Rust (Day 19) - Generic Types, Traits, and Lifetimes
f1r3_r41n 2023. 7. 1. 14:37728x90
๋ฐ์ํ
๐ฆ Rust Day 19
๐ณ๏ธ Generic Types, Traits, and Lifetimes
- ๋ฌ์คํธ์ ์ ๋ค๋ฆญ(Generic)์ ๊ตฌ์ฒด์ ์ธ ํ์ (concrete type)์ด๋ ๋ค๋ฅธ ์์ฑ์ผ๋ก ๋์ฒดํ ์ ์๋ ์ถ์ํ๋ ํ์ ์ ํ์ฉํจ
- ๊ตฌ์ฒด์ ์ธ ํ์
๋์ ์ ๋ค๋ฆญ ํ์
์ ๋งค๊ฐ๋ณ์๋ก ์ ์ธํ ์ ์์
Option<T>
,Vec<T>
,HashMap<K, V>
,Result<T, E>
๋ชจ๋ ์ ๋ค๋ฆญ ํ์ ์
- ์๋ช ์ ์ ๋ค๋ฆญ์ ์ผ์ข ์ผ๋ก ์ฐธ์กฐ๊ฐ ์๋ก ์ด๋ป๊ฒ ๊ด๋ จ์ด ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ปดํ์ผ๋ฌ์ ์ ๊ณตํจ
1๏ธโฃ ํจ์๋ก๋ถํฐ ์ค๋ณต ์ ๊ฑฐํ๊ธฐ
fn main() {
let num_list_1 = vec![34, 56, 77, 25, 100, 54];
let num_list_2 = vec![102, 24, 6000, 89, 54, 2, 43, 8];
let mut max = num_list_1[0];
for number in num_list_1 {
if number > max {
max = number;
}
}
println!("num_list_1's max: {max}");
max = num_list_2[0];
for number in num_list_2 {
if number > max {
max = number;
}
}
println!("num_list_2's max: {max}");
}
// Result
// num_list_1's max: 100
// num_list_2's max: 6000
- ๋ ๊ฐ์ ์ซ์ ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ถ๋ ฅํ๋ ์ฝ๋
- ์ฝ๋๊ฐ ์ค๋ณต๋๋ ๋ถ๋ถ์ด ์์
fn get_max(num_list: &[i32]) -> i32 {
let mut max = num_list[0];
for number in num_list {
if number > &max {
max = *number;
}
}
max
}
fn main() {
let num_list_1 = vec![34, 56, 77, 25, 100, 54];
let num_list_2 = vec![102, 24, 6000, 89, 54, 2, 43, 8];
println!("num_list_1's max: {}", get_max(&num_list_1));
println!("num_list_2's max: {}", get_max(&num_list_2));
}
// Result
// num_list_1's max: 100
// num_list_2's max: 6000
- ์ค๋ณต๋ ๋ถ๋ถ์ ํจ์ํ์ํจ ์ฝ๋
- ํจ์์ ๋งค๊ฐ๋ณ์๋
i32
๊ฐ์ ์ฌ๋ผ์ด์ค๋ผ๋ฉด ์ด๋ค ํ์ ์ด๋ ์ ๋ฌํ ์ ์์
2๏ธโฃ ์ ๋ค๋ฆญ ๋ฐ์ดํฐ ํ์
- ์ ๋ค๋ฆญ์ ์ฌ๋ฌ ๊ตฌ์ฒดํ๋ ํ์ ์ ์ฌ์ฉํ ์ ์๋ ํจ์ ์๊ทธ๋์ฒ๋ ๊ตฌ์กฐ์ฒด ๊ฐ์ ์์ดํ ์ ์ ์ํ ๋ ์ฌ์ฉํจ
๐ค ํจ์ ์ ์์์ ์ฌ์ฉํ๊ธฐ
fn get_i32_max(num_list: &[i32]) -> i32 {
let mut max = num_list[0];
for number in num_list {
if number > &max {
max = *number;
}
}
max
}
fn get_char_max(char_list: &[char]) -> char {
let mut max = char_list[0];
for char in char_list {
if char > &max {
max = *char;
}
}
max
}
fn main() {
let num_list = vec![34, 56, 77, 25, 100, 54];
let char_list = vec!['y', 'm', 'a', 'q'];
println!("num_list's max: {}", get_i32_max(&num_list));
println!("char_list's max: {}", get_char_max(&char_list));
}
// Result
// num_list's max: 100
// char_list's max: y
- ๋งค๊ฐ๋ณ์์ ๋ฆฌํด ํ์ ๋ง ๋ค๋ฅด๊ณ ๋์์ ๊ฐ์ ๋ ์ค๋ณต ํจ์ ์ฝ๋
- ๋ ํจ์์ ๋ณธ๋ฌธ์ ์์ ํ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ด ์ค๋ณต์ ์ ๊ฑฐํ๋ ค๋ฉด ์ ๋ค๋ฆญ ํ์ ์ ์ด์ฉํด ํ๋์ ํจ์๋ก ์ ์ํด์ผ ํจ
- ํจ์์ ๋ณธ๋ฌธ์ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ ์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์๊ทธ๋์ฒ์ ์ ์ธํด์ ์ปดํ์ผ๋ฌ๊ฐ ๊ทธ ์ด๋ฆ์ ์๋ฏธ๋ฅผ ํ๋จํ ์ ์๋๋ก ํจ
fn get_max<T>(list: &[T]) -> T {
- ์ ๋ค๋ฆญ
get_max
ํจ์๋ฅผ ์ ์ํ ์ ํจ์์ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก ์ฌ์ด์๊บพ์ ๊ดํธ(<>)
์ ํ์ ์ด๋ฆ์ ๋ช ์ํ๋ฉด ๋จ get_max
ํจ์ ์ ์- ํจ์
get_max
๋ ์ด๋ค ํ์T
๋ฅผ ์ผ๋ฐํํ ํจ์
- ํจ์
- ์์ ์ ๋ค๋ฆญ
get_max
ํจ์๋ฅผ ๊ตฌํํด์ ์์ฑํ ์ฝ๋๋ ์ปดํ์ผ ์ ์๋ฌ๊ฐ ๋ฐ์ํจ- ์๋ฌ ๋ฉ์์ง์์๋
std::cmp::PartialOrd
ํธ๋ ์ดํธ๋ฅผ ์ธ๊ธํจ get_max
ํจ์์ ๋ณธ๋ฌธ์ด ๋ชจ๋ ํ์T
์ ๋ํด ๋์ํ์ง ์๋๋ค๋ ๊ฒ์ ์ค๋ช ํจ- ํจ์ ๋ณธ๋ฌธ์์ ํ์
T
์ ๊ฐ์ ๋น๊ตํ๋ฏ๋ก ์ด ๊ฐ์ ๋ฐ๋์ ์ ๋ ฌ ๊ฐ๋ฅํด์ผ ํจ
- ์๋ฌ ๋ฉ์์ง์์๋
๐ค ๊ตฌ์กฐ์ฒด ์ ์์์ ์ฌ์ฉํ๊ธฐ
struct Point<T> {
x: T,
y: T,
}
- x์ y ์ขํ์ ๊ฐ์ ์ด๋ค ํ์
์ผ๋ก๋ ์ ์ฅํ ์ ์๋
Point<T>
๊ตฌ์กฐ์ฒด ์ ์ธ - ํ๋์ ์ ๋ค๋ฆญ ํ์
๋ง์ ์ฌ์ฉํ๋ฏ๋ก ํ์
T
๋ฅผ ์ผ๋ฐํํ ๊ตฌ์กฐ์ฒด - ํ๋์ ๊ฐ์ ๋ชจ๋ ๊ฐ์ ํ์ ์ด์ด์ผ ํจ
struct Point<T, U> {
x: T,
y: U,
}
- ๋ค์ค ์ ๋ค๋ฆญ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋์ ๊ฐ๋ค์ ๊ฐ๊ฐ ๋ค๋ฅธ ํ์ ์ ์ ๋ค๋ฆญ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์ ์ธ ๊ฐ๋ฅ
- ์ ๋ค๋ฆญ ํ์ ์ด ๋๋ฌด ๋ง์ด ํ์ํด์ง๋ค๋ ๊ฒ์ ์ฝ๋๋ฅผ ๋ ์์ ๋ถ๋ถ์ผ๋ก ์ฌ๊ตฌ์ฑํด์ผ ํ๋ค๋ ๊ฒ์ ๋ปํจ
๐ค ์ด๊ฑฐ์ ์ ์์์ ์ฌ์ฉํ๊ธฐ
enum Option<T> {
Some(T),
None,
}
Option<T>
์ด๊ฑฐ์ ์ ์- ํ์
T
๋ฅผ ์ผ๋ฐํํ ์ด๊ฑฐ์ Option<T>
์ด๊ฑฐ์๋ฅผ ์ด์ฉํ๋ฉด ์ ํ์ ์ธ ๊ฐ์ ๊ฐ๋ ์ถ์ํ ๊ฐ๋ฅOption<T>
๋ ์ ๋ค๋ฆญ ์ด๊ฑฐ์์ด๋ฏ๋ก ์ ํ์ ์ธ ๊ฐ์ ํ์ ๊ณผ ๋ฌด๊ดํ๊ฒ ์ถ์ํ๋ ํ์ ์ ์ฌ์ฉํ ์ ์์
- ํ์
enum Result<T, E> {
Ok(T),
Err(E),
}
Result<T, E>
์ด๊ฑฐ์ ์ ์- ๋ ๊ฐ์ ํ์
T
์E
๋ฅผ ์ผ๋ฐํํ ํ์
- ๋ ๊ฐ์ ํ์
๐ค ๋ฉ์๋ ์ ์์์ ์ฌ์ฉํ๊ธฐ
struct Point<T> {
x: T,
y: T,
}
impl<T> Point<T> {
fn get_x(&self) -> &T {
&self.x
}
}
fn main() {
let p = Point{
x: 2,
y: 5,
};
println!("{}", p.get_x());
}
// Result
// 2
Point<T>
๊ตฌ์กฐ์ฒด์ ํ๋ x์ ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ๋ ๋ฉ์๋ ์ ์impl
keyword ๋ค์์ ํ์T
๋ฅผ ์ง์ ํ๋ฉด ๋ฌ์คํธ๋Point
๊ตฌ์กฐ์ฒด์ ๊บพ์ ๊ดํธ ์์ ์ง์ ๋ ํ์ ์ด ๊ตฌ์ฒดํ๋ ํ์ ์ด ์๋ ์ ๋ค๋ฆญ ํ์ ์ด๋ผ๋ ์ ์ ์ธ์ํจ
struct Point<T> {
x: T,
y: T,
}
impl Point<f64> {
fn dis_from_ori(&self) -> f64 {
(self.x.powi(2) + self.y.powi(2)).sqrt()
}
}
fn main() {
let p = Point{
x: 3.4,
y: 8.9,
};
println!("{}", p.dis_from_ori());
}
// Result
// 9.527329111561121
- ํน์ ํ์ ์ ์ธ์คํด์ค์๋ง ์ ์ฉํ ๋ฉ์๋ ๊ตฌํ
Point<f64>
ํ์ ์ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋ค๋ฅธPoint<T>
์ธ์คํด์ค๋ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์dis_from_ori
๋ฉ์๋๋ ๊ธฐ์ค ์ขํ(0.0, 0.0)์ผ๋ก๋ถํฐ ์ง์ ๋ ์ขํ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ์ผ๋ง๋ ๋จผ์ง ๊ณ์ฐํ๋ ๋ฉ์๋์- ์ํ ์ฐ์ฐ์ ์ฌ์ฉํ๋ ๋ฉ์๋๋ ๋ถ๋ ์์์ ํ์ ์๋ง ์ ์ฉํ ์ ์๋ ๋ฉ์๋์
#[derive(Debug)]
struct Point<T, U> {
x: T,
y: U,
}
impl<T, U> Point<T, U> {
fn struct_mix<V, W> (self, other: Point<V, W>) -> Point<T, W> {
Point {
x: self.x,
y: other.y,
}
}
}
fn main() {
let p1 = Point { x: 4.5, y: 7.7 };
let p2 = Point { x: "Hello", y: 'r'};
println!("{:?}", p1.struct_mix(p2));
}
// Result
// Point { x: 4.5, y: 'r' }
- ๊ตฌ์กฐ์ฒด์ ์ ์์๋ ๋ค๋ฅธ ์ ๋ค๋ฆญ ํ์ ์ ์ฌ์ฉํ๋ ๋ฉ์๋ ๊ตฌํ
impl
๋ธ๋ก๊ณผ ๋ฉ์๋ ์ ์์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์- ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์
T
์U
๋ ๊ตฌ์กฐ์ฒด์ ์ ์์ ๋ฐ๋ผimpl
๋ธ๋ก ๋ค์์ ์ง์ ๋์ด ์์ - ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์
V
์W
๋ ๋ฉ์๋์๋ง ๊ด๋ จ์ด ์์ผ๋ฏ๋ก ๋ฉ์๋์ ์ ์ํจ
- ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์
- ํด๋น ์ฝ๋์์ p1๊ณผ p2๋ ๋ฉ์๋ ํธ์ถ ์ ํด๋น ๋ฉ์๋์ ์์ ๊ถ์ด ๋์ด๊ฐ๋ฏ๋ก ๋ฉ์๋ ์์ ์ด ๋๋ ํ์๋ ์ ํจํ์ง ์์
๐ค ์ ๋ค๋ฆญ์ ์ฑ๋ฅ
- ๋ฌ์คํธ๊ฐ ์ ๋ค๋ฆญ์ ๊ตฌํํ๋ ๋ฐฉ์์ ์ ๋ค๋ฆญ ํ์
์ ์ฌ์ฉํ๋ค๊ณ ํด์ ๊ตฌ์ฒดํ๋ ํ์
์ ์ฌ์ฉํ ๋๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง์ง ์์
- ์ปดํ์ผ ์์ ์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ
๋จ์ผํ(Monomorphzation)
ํ๊ธฐ ๋๋ฌธ ๋จ์ผํ
: ์ปดํ์ผ ์์ ์ ์ ๋ค๋ฆญ ์ฝ๋๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ตฌ์ฒดํ๋ ํ์ ์ผ๋ก ๋ณํํ๋ ๊ณผ์ - ์ปดํ์ผ๋ฌ๋ ์ ๋ค๋ฆญ ์ฝ๋๊ฐ ํธ์ถ๋๋ ๋ถ๋ถ์ ๋ชจ๋ ์ฐพ์ ์ ๋ค๋ฆญ ์ฝ๋์ ํธ์ถ์ ์ฌ์ฉ๋ ๊ตฌ์ฒดํ๋ ํ์ ์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์์ฑํจ
- ์ปดํ์ผ ์์ ์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ
fn main() {
let integer = Some(5);
let float = Some(8.9);
}
- ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ฝ๋
enum Option_i32 {
Some(i32),
None,
}
enum Option_f64 {
Some(f64),
None,
}
fn main() {
let integer = Option_i32::Some(5);
let float = Option_f64::Some(8.9);
}
- ๋จ์ผํ๋ ๋ฒ์ ์ ์ฝ๋
- ์ ๋ค๋ฆญ
Option<T>
๋ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ ํน์ ์ ์๋ก ๊ต์ฒด๋จ
3๏ธโฃ ํธ๋ ์ดํธ: ๊ณต์ ๊ฐ๋ฅํ ํ์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ
ํธ๋ ์ดํธ(trait)
: ๋ฌ์คํธ ์ปดํ์ผ๋ฌ์๊ฒ ํน์ ํ์ ์ด ์ด๋ค ๊ธฐ๋ฅ์ ์คํํ ์ ์์ผ๋ฉฐ, ์ด๋ค ํ์ ๊ณผ ์ด ๊ธฐ๋ฅ์ ๊ณต์ ํ ์ ์๋์ง๋ฅผ ์๋ ค์ฃผ๋ ๋ฐฉ๋ฒ- ๊ณต์ ๊ฐ๋ฅํ ํ์๋ฅผ ์ถ์ํ๋ ๋ฐฉ์์ผ๋ก ์ ์ํ๋ ๋ฐฉ๋ฒ
- ๋ค๋ฅธ ์ธ์ด์์
์ธํฐํ์ด์ค(interface)
๊ธฐ๋ฅ๊ณผ ์ ์ฌํจ
๐ค ํธ๋ ์ดํธ ์ ์ธํ๊ธฐ
- ํธ๋ ์ดํธ ์ ์๋ ์ด๋ค ๋ชฉ์ ์ ์ด๋ฃจ๋ ๋ฐ ํ์ํ ์ผ๋ จ์ ํ์๋ฅผ ์ ์ํ๊ณ ์ฌ๋ฌ ํ์ ์ ์ ์ฉํ ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ๊ทธ๋ฃนํํ๋ ๋ฐฉ๋ฒ
NewArticle
๊ตฌ์กฐ์ฒด๋story
ํ๋์ ํน์ ์ง์ญ์ ๋ด์ค ์ฝํ ์ธ ๋ฅผ ์ ์ฅํ๋ฉฐ,Tweet
๊ตฌ์กฐ์ฒด๋ ์ต๋ 280๊ธ์์ ํ ์คํธ์ ํด๋น ํธ์์ด ์ ํธ์์ธ์ง, ๋ฆฌํธ์๋ ํธ์์ธ์ง, ์๋๋ฉด ๋ค๋ฅธ ํธ์์ ๋๊ธ์ธ์ง๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจ- ํด๋น ๊ตฌ์กฐ์ฒด๋ค์ ์ธ์คํด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฝํด์ ๋ณด์ฌ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ
// src/lib.rs
pub trait Summary {
fn summarize(&self) -> String;
}
trait
keyword๋ฅผ ์ด์ฉํ ํธ๋ ์ดํธ ์ ์์ ๋ฉ์๋ ์๊ทธ๋์ฒ ์ ์- ๋ฉ์๋ ์๊ทธ๋์ฒ๋ ๊ฐ๊ฐ ๋ณ๊ฐ์ ์ค์ ์ ์ธํ๋ฉฐ ๊ฐ ์ค์ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๋๋์ผ ํจ
- ํด๋น ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋ ๊ฐ ํ์ ์ ๋ฐ๋์ ์ด ๋ฉ์๋์ ๋ณธ๋ฌธ์ ์์ ์ ํ์๋ฅผ ๊ตฌํํด์ผ ํจ
๐ค ํ์ ์ ํธ๋ ์ดํธ ๊ตฌํํ๊ธฐ
// src/lib.rs
pub trait Summary {
fn summarize(&self) -> String;
}
pub struct NewsArticle {
pub headline: String,
pub location: String,
pub author: String,
pub content: String,
}
pub struct Tweet {
pub username: String,
pub content: String,
pub reply: bool,
pub retweet: bool,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!(
"{}, by {}, {}",
self.headline, self.author, self.location
)
}
}
impl Summary for Tweet {
fn summarize(&self) -> String {
format!(
"{}: {}",
self.username, self.content
)
}
}
Summary
ํธ๋ ์ดํธ๋ฅผ ์ด์ฉํด ํ์ํ ํ์ ์ ์- ํ์ ์ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋ณดํต์ ๋ฉ์๋ ๊ตฌํ๊ณผ ์ ์ฌํจ
impl
๋ธ๋ก์์ ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ์ถ๊ฐํ๊ณ ํด๋น ํ์ ์ ๋ํด ์ํํด์ผ ํ ํน์ ๋์์ ๊ตฌํ
// src/main.rs
use trait_example::*;
fn main() {
let tweet = Tweet {
username: String::from("f1r3_r41n"),
content: String::from("ํธ๋ ์ดํธ ๊ตฌํ ๋จ๊ณ ing.."),
reply: false,
retweet: false,
};
println!("์ ํธ์ 1๊ฐ: {}", tweet.summarize());
}
// Result
// ์ ํธ์ 1๊ฐ: f1r3_r41n: ํธ๋ ์ดํธ ๊ตฌํ ๋จ๊ณ ing..
NewsArticle
ํ์ ,Tweet
ํ์ ,Summary
ํธ๋ ์ดํธ๋lib.rs
ํ์ผ ํ๋์ ๋ชจ๋ ์ ์ํ์ผ๋ฏ๋ก ๋ชจ๋ ๊ฐ์ ๋ฒ์์ ์กด์ฌํจ- ๋ง์ฝ ๋ณ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์์ ์ ์๋ ๊ตฌ์กฐ์ฒด์
Summary
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๊ณ ์ ํจ- ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ๋ช
์ํ์ฌ ์์ ์ด ์ ์ํ ํ์
์
Summary
ํธ๋ ์ดํธ ๊ตฌํ - ๋๋ฌธ์ ๊ณต๊ฐ ํธ๋ ์ดํธ๋ก ์ ์ธํ์์
- ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ๋ช
์ํ์ฌ ์์ ์ด ์ ์ํ ํ์
์
- ํธ๋ ์ดํธ ๊ตฌํ ์ ํ ๊ฐ์ง ์ ์ฝ
- ํธ๋ ์ดํธ๋ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ ํ์
์ด ํ์ฌ ํฌ๋ ์ดํธ์ ๋ก์ปฌ ํ์
์ด์ด์ผ ํจ
Display
๊ฐ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํธ๋ ์ดํธ๋ฅผ ์์ ์ ํฌ๋ ์ดํธ ์ผ๋ถ์ธTweet
ํ์ ์ ๊ตฌํํ ์ ์๋ ์ด์ ๋Tweet
ํ์ ์ด ์์ ์ ํฌ๋ ์ดํธ์ ๋ก์ปฌ ํ์ ์ด๊ธฐ ๋๋ฌธSummary
ํธ๋ ์ดํธ๋ ์์ ์ ํฌ๋ ์ดํธ์ ๋ก์ปฌ ํ์ ์ด๋ฏ๋กVec<T>
ํ์ ์Summary
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ ์ ์์
- ์ธ๋ถ ํ์
์ ์ธ๋ถ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ ์ ์์
Display
์Vec<T>
๋ ๋ชจ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์๋ ํ์ ์ด๋ฉฐ ์์ ์ ํฌ๋ ์ดํธ์ ๋ก์ปฌ ํ์ ์ด ์๋๊ธฐ ๋๋ฌธ์ ์์ ์ ํฌ๋ ์ดํธ ์์์Vec<T>
ํ์ ์Display
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ ์ ์์
ํต์ผ์ฑ(coherence)
ํน์๊ณ ์ ๊ท์น(orphan rule)
์ด๋ผ๊ณ ์นญํจ
- ํธ๋ ์ดํธ๋ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ ํ์
์ด ํ์ฌ ํฌ๋ ์ดํธ์ ๋ก์ปฌ ํ์
์ด์ด์ผ ํจ
๐ค ๊ธฐ๋ณธ ๊ตฌํ
- ํธ๋ ์ดํธ์ ์ ์ธ๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋๋ก ์๊ตฌํ๋ ๊ฒ๋ณด๋ค ์ผ๋ถ ํน์ ์ ์ฒด ๋ฉ์๋์ ๊ธฐ๋ณธ ๋์์ ๊ตฌํํด ์ฃผ๋ฉด ํน์ ํ์ ์ ๊ตฌํํ ๋ ๋ฉ์๋์ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ ์ํ ์ ์์
// src/lib.rs
pub trait Summary {
fn summarize(&self) -> String {
String::from("(๊ณ์ ์ฝ๊ธฐ)")
}
}
pub struct NewsArticle {
pub headline: String,
pub location: String,
pub author: String,
pub content: String,
}
pub struct Tweet {
pub username: String,
pub content: String,
pub reply: bool,
pub retweet: bool,
}
impl Summary for NewsArticle { }
impl Summary for Tweet {
fn summarize(&self) -> String {
format!(
"{}: {}",
self.username, self.content
)
}
}
Summary
ํธ๋ ์ดํธ ์ ์ ๋ธ๋ก์์summarize
๋ฉ์๋์ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตNewsArticle
๊ตฌ์กฐ์ฒด์์summarize
๋ฉ์๋๋ฅผ ์ ์ํ์ง ์๊ฑฐ๋ ์ฌ์ ์ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ตฌํ์ด ์ ๊ณต๋จ
// src/main.rs
use trait_example::*;
fn main() {
let article = NewsArticle {
headline: String::from("headline"),
location: String::from("korea"),
author: String::from("f1r3_r41n"),
content: String::from("text..."),
};
println!("์๋ก์ด ๊ธฐ์ฌ: {}", article.summarize());
}
// Result
// ์๋ก์ด ๊ธฐ์ฌ: (๊ณ์ ์ฝ๊ธฐ)
Tweet
๊ตฌ์กฐ์ฒด์summarize
๋ฉ์๋๋ ์ฌ์ ์๋ ๊ตฌํ์ด ์ ๊ณต๋จ- ๊ธฐ๋ณธ ๊ตฌํ์ ์ฌ์ ์ํ๊ธฐ ์ํ ๋ฌธ๋ฒ์ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ์ง ์๋ ํธ๋ ์ดํธ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๋ฌธ๋ฒ๊ณผ ๊ฐ์
// src/lib.rs
pub trait Summary {
fn summarize_author(&self) -> String;
fn summarize(&self) -> String {
format!("{}๋์ ๊ธฐ์ฌ ๋ ์ฝ๊ธฐ", self.summarize_author())
}
}
pub struct Tweet {
pub username: String,
pub content: String,
pub reply: bool,
pub retweet: bool,
}
impl Summary for Tweet {
fn summarize_author(&self) -> String {
format!("@{}", self.username)
}
}
- ๊ธฐ๋ณธ ๊ตฌํ์ ๊ฐ์ ํธ๋ ์ดํธ์ ๋ค๋ฅธ ๋ฉ์๋๋ ํธ์ถ ๊ฐ๋ฅ
- ๋ค๋ฅธ ๋ฉ์๋๊ฐ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ์ง ์์๋ ๊ฐ๋ฅ
// src/main.rs
use trait_example::*;
fn main() {
let tweet = Tweet {
username: String::from("f1r3_r41n"),
content: String::from("ํธ๋ ์ดํธ ๊ตฌํ ๋จ๊ณ ing.."),
reply: false,
retweet: false,
};
println!("์ ํธ์ 1๊ฐ: {}", tweet.summarize());
}
// Result
// ์ ํธ์ 1๊ฐ: @f1r3_r41n๋์ ๊ธฐ์ฌ ๋ ์ฝ๊ธฐ
- ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ฉด์ ๊ธฐ๋ณธ ๊ตฌํ ์ฝ๋๋ฅผ ํธ์ถํ ์๋ ์์
๐ค ํธ๋ ์ดํธ ๋งค๊ฐ๋ณ์
// src/lib.rs
pub trait Summary {
fn summarize(&self) -> String;
}
pub struct NewsArticle {
pub headline: String,
pub location: String,
pub author: String,
pub content: String,
}
pub struct Tweet {
pub username: String,
pub content: String,
pub reply: bool,
pub retweet: bool,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!(
"{}, by {}, {}",
self.headline, self.author, self.location
)
}
}
impl Summary for Tweet {
fn summarize(&self) -> String {
format!(
"{}: {}",
self.username, self.content
)
}
}
pub fn notify(item: impl Summary) {
println!("์๋ณด! {}", item.summarize());
}
// src/main.rs
use trait_example::*;
fn main() {
let article = NewsArticle {
headline: String::from("headline"),
location: String::from("korea"),
author: String::from("f1r3_r41n"),
content: String::from("text..."),
};
println!("์๋ก์ด ๊ธฐ์ฌ: {}", article.summarize());
notify(article);
}
// Result
// ์๋ก์ด ๊ธฐ์ฌ: headline, by f1r3_r41n, korea
// ์๋ณด! headline, by f1r3_r41n, korea
impl Trait
๋ฌธ๋ฒ : ์ง์ ๋ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ํ์ ์ ์ธ์๋ก ์ ๋ฌํ ์ ์์- ๋น๊ต์ ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ์ ๋์
- ํธ๋ ์ดํธ ๊ฒฝ๊ณ๋ผ๊ณ ๋ถ๋ฅด๋ ๋ ๊ธด ๋ฌธ๋ฒ์ ๊ฐ๋จํ ํํํ๊ธฐ ์ํ ํธ์ ์ฅ์น
(1) ํธ๋ ์ดํธ ๊ฒฝ๊ณ ๋ฌธ๋ฒ
pub fn notify<T: Summary>(item: T) {
println!("์๋ณด! {}", item.summarize());
}
- ํธ๋ ์ดํธ ๊ฒฝ๊ณ ๋ฌธ๋ฒ : ์ ๋ค๋ฆญ ํ์
๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ ๊บพ์ ๊ดํธ ์์ ์ฝ๋ก ์ ์ด์ฉํด ์ง์
- ์๋ก ๋ค๋ฅธ ํ์
์ธ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์ ์ ์ธ :
impl Trait
๋ฌธ๋ฒ - ๊ฐ์ ํ์ ์ธ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์ ์ ์ธ : ํธ๋ ์ดํธ ๊ฒฝ๊ณ ๋ฌธ๋ฒ
- ์๋ก ๋ค๋ฅธ ํ์
์ธ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์ ์ ์ธ :
(2) + ๋ฌธ๋ฒ์ผ๋ก ์ฌ๋ฌ ํธ๋ ์ดํธ ๊ฒฝ๊ณ ์ ์ํ๊ธฐ
pub fn notify(item: impl Summary + Display) {
impl Trait
๋ฌธ๋ฒnotify
ํจ์์์item
๋งค๊ฐ๋ณ์ ๊ฐ์ ์ถ๋ ฅ ํ์์ ์ ์ฉํ๋ ๋์์summarize
๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ ํ ๋+
๋ฌธ๋ฒ์ผ๋ก ํธ๋ ์ดํธ ๊ตฌํ ๋ช ์
pub fn notify<T: Summary + Display>(item: T) {
- ํธ๋ ์ดํธ ๊ฒฝ๊ณ ๋ฌธ๋ฒ
(3) where ์ ์ ์ด์ฉํด ํธ๋ ์ดํธ ๊ฒฝ๊ณ ์ ๋ฆฌํ๊ธฐ
- ์ฌ๋ฌ ๊ฐ์ ์ ๋ค๋ฆญ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ ํจ์์๋ ํจ์ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก ์ฌ์ด์ ๋๋ฌด ๋ง์ ํธ๋ ์ดํธ ๊ฒฝ๊ณ๋ฅผ ๋์ดํ๊ฒ ๋์ด ํจ์ ์๊ทธ๋์ฒ๋ฅผ ์ฝ๊ธฐ ์ด๋ ค์์ง
fn function<T: Display + Clone, U: Clone + Debug>(t: T, u: U) -> i32 {
- ์ฌ๋ฌ ๊ฐ์ ์ ๋ค๋ฆญ ํ์ ๋งค๊ฐ๋ณ์์ ํธ๋ ์ดํธ ๊ฒฝ๊ณ
fn function<T, U>(t: T, u: U) -> i32
where T: Display + Clone, U: Clone + Debug {
where
์ ์ ์ด์ฉํด ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ ์ฝ๋
๐ค ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋ ๊ฐ ๋ฆฌํดํ๊ธฐ
fn returns_summarizable() -> impl Summary {
Tweet {
username: String::from("f1r3_r41n"),
content: String::from("ํธ๋ ์ดํธ ๊ตฌํ ๋จ๊ณ ing.."),
reply: false,
retweet: false,
}
}
- ๋ฆฌํด ํ์
์
impl Summary
๋ฅผ ์ง์ ํ๊ธฐ์Summary
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋ ์ด๋ค ํ์ ๋ ๋ฆฌํดํ ์ ์์ - ์ด ํจ์๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ ์ค์ ๋ฆฌํด ํ์ ์ ์์ง ๋ชปํจ
impl Trait
๋ฌธ๋ฒ์ ํ๋์ ํ์ ์ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์์- ์ปดํ์ผ๋ฌ๊ฐ
impl Trait
๋ฌธ๋ฒ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ ์ฝ ๋๋ฌธ
- ์ปดํ์ผ๋ฌ๊ฐ
๐ค ํธ๋ ์ดํธ ๊ฒฝ๊ณ๋ฅผ ์ด์ฉํด largest ํจ์ ์์ฑํ๊ธฐ
fn get_max<T: PartialOrd + Copy>(list: &[T]) -> T {
let mut max = list[0];
for &i in list.iter() {
if i > max {
max = i;
}
}
max
}
fn main() {
let num_list = vec![34, 56, 77, 25, 100, 54];
let char_list = vec!['y', 'm', 'a', 'q'];
println!("max: {}", get_max(&num_list));
println!("max: {}", get_max(&char_list));
}
// Result
// max: 100
// max: y
>
์ฐ์ฐ์๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์std::cmp::PartialOrd
ํธ๋ ์ดํธ์ ๊ธฐ๋ณธ ๋ฉ์๋๋ก ์ ์๋์ด ์์T
ํ์ ์PartialOrd
ํธ๋ ์ดํธ ๊ฒฝ๊ณ๋ฅผ ์ง์ ํ์ฌ ํจ์๊ฐ ์ค์ ๋ก ๋น๊ตํ ์ ์๋ ํ์ ์ ์ฌ๋ผ์ด์ค๋ง์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํจ
- ํฌ๊ธฐ๊ฐ ์ด๋ฏธ ์ ํด์ง ์ค์นผ๋ผ ๊ฐ์ ์คํ์ ์ ์ฅ๋๋ฏ๋ก
Copy
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๊ณ ์์ผ๋ ์ ๋ค๋ฆญ ๋ณ์์Copy
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ์ง ์๋ ํ์ ์ ๊ฐ์ด ์ ๋ฌ๋ ๊ฐ๋ฅ์ฑ์ด ์๊นT
ํ์ ์Copy
ํธ๋ ์ดํธ ๊ฒฝ๊ณ๋ฅผ ์ง์ ํ์ฌCopy
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋ ํ์ ์ ๋ํด์๋ง ํธ์ถํ ์ ์๊ฒ ํจ
Copy
๋์Clone
ํธ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๊ฐ ์์ ๊ถ์ ๊ฐ์ง ๋ ์ฌ๋ผ์ด์ค์ ๊ฐ ๊ฐ์ ๋ณต์ ํจclone
ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์String
์ฒ๋ผ ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ํ์ ์ ๋ ๋ง์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉฐ, ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์๋๊ฐ ๋จ์ด์ง ์ ์์
- ์ฌ๋ผ์ด์ค์ ์ ์ฅ๋
T
ํ์ ์ ์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ๋ ๊ฒClone
ํน์Copy
ํธ๋ ์ดํธ ๊ฒฝ๊ณ๋ฅผ ์ ์ธํ ํ์ ์์ผ๋ฉฐ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ ํ์ํ์ง ์์
(1) ํธ๋ ์ดํธ ๊ฒฝ๊ณ๋ฅผ ์ด์ฉํด ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฉ์๋ ๊ตฌํํ๊ธฐ
use std::fmt::Display;
struct Pair<T> {
x: T,
y: T,
}
impl<T> Pair<T> {
fn new(x: T, y: T) -> Self {
Self {
x,
y,
}
}
}
impl<T: Display + PartialOrd> Pair<T> {
fn cmp_display(&self) {
if self.x >= self.y {
println!("๊ฐ์ฅ ํฐ ๋ฉค๋ฒ๋ x = {}", self.x);
} else {
println!("๊ฐ์ฅ ํฐ ๋ฉค๋ฒ๋ y = {}", self.y);
}
}
}
fn main() {
let p = Pair::new(2, 4);
p.cmp_display();
}
// Result
// ๊ฐ์ฅ ํฐ ๋ฉค๋ฒ๋ y = 4
- ์ ๋ค๋ฆญ ํ์
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋
impl
๋ธ๋ก์ ํธ๋ ์ดํธ ๊ฒฝ๊ณ ์ฌ์ฉ ์ ํ์ ์ด ํน์ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋์ง์ ๋ฐ๋ผ ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์์
impl<Display> ToString for T {
// -- ์๋ต --
}
fn main() {
let s = 3.to_string();
}
๋ฎ๊ฐ ๊ตฌํ(blanket implementations)
: ํ์ ์ ํธ๋ ์ดํธ ๊ฒฝ๊ณ๋ฅผ ๋ง์กฑํ๋ ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋ ๊ฒ- ๋ฌ์คํธ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋งค์ฐ ๋น๋ฒํ๊ฒ ์ฌ์ฉ
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋
Display
ํธ๋ ์ดํธ๋ฅผ ๊ตฌํํ๋ ํ์ ์๋ToString
ํธ๋ ์ดํธ๋ ํจ๊ป ๊ตฌํํจ- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฎ๊ฐ ๊ตฌํ ๊ธฐ๋ฒ์ผ๋ก ์ธํด
Display
๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ํ์ ์ ๋ํดToString
ํธ๋ ์ดํธ๊ฐ ์ ์ํto_string
๋ฉ์๋ ํธ์ถ ๊ฐ๋ฅ
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฎ๊ฐ ๊ตฌํ ๊ธฐ๋ฒ์ผ๋ก ์ธํด
4๏ธโฃ ์๋ช ์ ์ด์ฉํด ์ฐธ์กฐ ์ ํจ์ฑ ๊ฒ์ฌํ๊ธฐ
์๋ช (lifetimes)
: ์ฐธ์กฐ๊ฐ ์ ํจํ ๋ฒ์- ์๋ฌต์ ์ด๋ฉฐ, ํ์
์ด ๋๋ถ๋ถ
์ถ๋ก (inferred)
์ ์ํด ๊ฒฐ์ ๋๋ ๊ฒ์ฒ๋ผ ์๋ช ์ญ์ ์ถ๋ก ์ ํ ๋๋ก ๋์ - ์๋ช ์ด ๋ฌ๋ผ์ง ์ ์์ ๋ ์๋ช ์ ๋ ธํ ์ด์ ์ถ๊ฐ
- ์๋ฌต์ ์ด๋ฉฐ, ํ์
์ด ๋๋ถ๋ถ
๐ค ์๋ช ์ ์ด์ฉํด ์ฃฝ์ ์ฐธ์กฐ์ ๋ฐ์ ๋ฐฉ์งํ๊ธฐ
fn main() {
let r;
{
let x = 5;
r = &x;
}
println!("r: {}", r);
}
// Result
// error[E0597]: `x` does not live long enough
- ์๋ช
์ ์ฃผ์ ๋ชฉ์ ์ ์ฃฝ์ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฒ
- ์ฃฝ์ ์ฐธ์กฐ: ํ๋ก๊ทธ๋จ์ด ์๋ ์๋ํ๋ ๋ฐ์ดํฐ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ ๋๋ฅผ ๋ปํจ
- ๋ณ์ x๋ ์์ชฝ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์๊ฐ ๋๋ ์ ํจํ์ง ์๊ธฐ์ ์๋ช ์ด ์ถฉ๋ถ์น ์๋ค๋ ์ค๋ฅ ๋ฐ์
- ๋ฌ์คํธ ์ปดํ์ผ๋ฌ๋
๋์ฌ ๊ฒ์ฌ๊ธฐ
๋ฅผ ํ์ฌํ์ฌ ์ฝ๋๊ฐ ๋ ์ด์ ์ ํจํ์ง ์์์ง ์ ์ ์์
๐ค ๋์ฌ ๊ฒ์ฌ๊ธฐ
๋์ฌ ๊ฒ์ฌ๊ธฐ(borrow checker)
: ๋์ฌํ ๊ฐ์ด ํ์ฌ ๋ฒ์ ๋ด์์ ์ ํจํ์ง ๊ฒ์ฌ
fn main() {
let x = 5;
let r = &x;
println!("r: {r}");
}
- ๋ณ์ x๋ฅผ ๋ณ์ r๋ณด๋ค ์๋ช
์ ๋๋ ค ์ฃฝ์ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ฝ๋
- ๋ณ์ x๊ฐ ์ ํจํ ๋์ ๋ณ์ r์ด ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํญ์ ์ ํจํจ
๐ค ํจ์์ ์ ๋ค๋ฆญ ์๋ช
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let msg1 = String::from("abcd");
let msg2 = "xyz";
println!("longest: {}", longest(msg1.as_str(), msg2));
}
// Result
// error[E0106]: missing lifetime specifier
- ๋ฌ์คํธ ์ ์ฅ์์ ๋ฆฌํด๊ฐ์ด ๋ณ์ x์ y ์ค ์ด๋ค ๊ฒ์ด ๋ฆฌํด๋ ์ง ์ ์ ์์ผ๋ฏ๋ก ๋ฆฌํด ํ์ ์ ์ ๋ค๋ฆญ ์๋ช ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํด์ผ ํจ
- ํจ์์ ์ ๋ฌ๋๋ ์ฐธ์กฐ์ ์ค์ ์๋ช ๋ ์ ์ ์์ผ๋ฏ๋ก ๋ฒ์๋ฅผ ์ด์ฉํด ๋ฆฌํดํ๋ ค๋ ์ฐธ์กฐ๊ฐ ํญ์ ์ ํจํ์ง๋ฅผ ํ์ธํ ์ ์์
๐ค ์๋ช ์ ๋ ธํ ์ด์ ๋ฌธ๋ฒ
- ์๋ช ์ ๋ ธํ ์ด์ ์ ์ฐธ์กฐ์ ์ ํจ ๊ธฐ๊ฐ์ ๋ณ๊ฒฝํ์ง๋ ์์ผ๋ฉฐ ๊ฐ๋ณ ์ฐธ์กฐ์ ์๋ช ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ์ฌ๋ฌ ์ฐธ์กฐ ๊ฐ ์๋ช ์ ๊ด๊ณ๋ฅผ ์์ ํ ์ ์์
- ์ ๋ค๋ฆญ ์๋ช ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๋ฉด ์ด๋ค ์๋ช ์ ์ฐธ์กฐ๋ ์ ๋ฌํ ์ ์์
&i32 // ์ฐธ์กฐ
&'a i32 // ๋ช
์์ ์ธ ์๋ช
์ ๊ฐ์ง ์ฐธ์กฐ
&'a mut i32 // ๋ช
์์ ์ธ ์๋ช
์ ๊ฐ์ง ๊ฐ๋ณ ์ฐธ์กฐ
- ์๋ช ์ ๋ ธํ ์ด์ ๋ฌธ๋ฒ
- ์๋ช
์ ๋
ธํ
์ด์
์ ๊ทธ ์์ฒด๋ก ๋ง์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์์
- ๋ฌ์คํธ์๊ฒ ์ ๋ค๋ฆญ ์๋ช ๋งค๊ฐ๋ณ์๊ฐ ์ง์ ๋ ๊ฐ ์ฐธ์กฐ๊ฐ ์๋ก ์ด๋ค ๊ด๊ณ์ธ์ง ๋ช ์ํ ๋ฟ
๐ค ํจ์ ์๊ทธ๋์ฒ์ ์๋ช ์ ๋ ธํ ์ด์
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let msg1 = String::from("abcd");
let msg2 = "xyz";
println!("longest: {}", longest(msg1.as_str(), msg2));
}
// Result
// longest: abcd
- ์ ๋ค๋ฆญ ํ์ ๋งค๊ฐ๋ณ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ํจ์ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ์ฌ์ด์ ๊บพ์ ๊ดํธ์ ์ ๋ค๋ฆญ ์๋ช ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํด์ผ ํจ
- ๋ชจ๋ ์ฐธ์กฐ ๋งค๊ฐ๋ณ์์ ๋ฆฌํด๊ฐ์ด ๊ฐ์ ์๋ช
์ ๊ฐ์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ช
'a
๋ฅผ ๋ชจ๋ ์ฐธ์กฐ์ ์ง์ ํจ - ์๋ช
๋งค๊ฐ๋ณ์๋ฅผ ํจ์ ์๊ทธ๋์ฒ์ ๋ช
์ํ๋ค๊ณ ํด์ ํจ์์ ์ ๋ฌ๋๊ฑฐ๋ ํจ์๊ฐ ๋ฆฌํดํ๋ ๊ฐ์ ์๋ช
์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋
- ๋์ฌ ๊ฒ์ฌ๊ธฐ๊ฐ ์ด ์ ์ฝ์ ์ผ์นํ์ง ์๋ ๊ฐ์ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ํ ๋ฟ
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let msg1 = String::from("abcd");
{
let msg2 = String::from("xyz");
let result = longest(msg1.as_str(), msg2.as_str());
println!("longest: {result}");
}
}
// Result
// longest: abcd
- ๋ฆฌํด๊ฐ์ ๋ํ ์ฐธ์กฐ์ธ ๋ณ์ result๊ฐ ์์ชฝ ๋ฒ์์์ ์ ํจํ๊ธฐ์ ์ฝ๋๋ ์ปดํ์ผ๋จ
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let msg1 = String::from("abcd");
let result;
{
let msg2 = String::from("xyz");
result = longest(msg1.as_str(), msg2.as_str());
}
println!("longest: {result}");
}
// Result
// error[E0597]: `msg2` does not live long enough
- ๋ณ์ result๊ฐ ์ ํจํ๋ ค๋ฉด ๋ณ์ msg2๊ฐ ๋ฐ๊นฅ์ชฝ ๋ฒ์๊ฐ ๋๋ ๋๊น์ง ์ ํจํด์ผ ํจ
- ๋ณ์ msg2๊ฐ ์ ํจํ์ง ์๊ธฐ์ ์ ํจํ์ง ์์ ์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ ๊ฐ๋ฅ์ฑ์ด ์์ด์ ์ปดํ์ผ๋์ง ์์
๐ค ์๋ช ์ ๊ด์ ์์ ์๊ฐํ๊ธฐ
- ์๋ช ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํด์ผ ํ๋ ์ํฉ์ ํจ์์ ๋์์ ๋ฐ๋ผ ๋ค๋ฆ
- ํจ์๊ฐ ์ฐธ์กฐ๋ฅผ ๋ฆฌํดํ ๋๋ ๋ฆฌํด ํ์ ์ ์๋ช ๋งค๊ฐ๋ณ์๋ ๋งค๊ฐ๋ณ์ ์ค ํ๋์ ์๋ช ๋งค๊ฐ๋ณ์์ ์ผ์นํด์ผ ํจ
- ์๋ช
๋ฌธ๋ฒ์ ํจ์์ ์ฌ๋ฌ ๋งค๊ฐ๋ณ์์ ๋ฆฌํด๊ฐ์ ์๋ช
์ ์ฐ๊ฒฐํจ
- ์๋ช ์ด ์ฐ๊ฒฐ๋๋ฉด ๋ฌ์คํธ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ ์ธ ์์ ์ ํ์ฉํ๊ณ , ์ฃฝ์ ํฌ์ธํฐ๋ ๊ธฐํ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ์๋ฐํ๋ ์์ ์ ์ฐจ๋จํ๋ ๋ฐ ํ์ํ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ป์
๐ค ๊ตฌ์กฐ์ฒด ์ ์์์์ ์๋ช ์ ๋ ธํ ์ด์
struct ImportantExcerpt<'a> {
part: &'a str,
}
fn main() {
let novel = String::from("์ฃ์ ๋ฒ. ๊ฐ๋ํ ๋ํ์ ์ถ์ ์ธ ๋ผ์ค์ฝ๋์ฝํ๋...");
let first_sentence = novel.split('.')
.next().expect(
"๋ฌธ์ฅ์์ '.'๋ฅผ ์ฐพ์ ์ ์์."
);
let i = ImportantExcerpt { part: first_sentence };
println!("first_sentence: {first_sentence}");
println!("i: {}", i.part);
}
// Result
// first_sentence: ์ฃ์ ๋ฒ
// i: ์ฃ์ ๋ฒ
ImportantExcerpt
๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๊ฐpart
ํ๋์ ์ ์ฅ๋ ์ฐธ์กฐ์ ์๋ช ์ ๋ฒ์ด๋ ์ ์์
๐ค ์๋ช ์ ์๋ต
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[0..i];
}
}
&s[..]
}
fn main() {
let msg = String::from("Hello, Rust!");
println!("{}", first_word(msg.as_str()));
}
// Result
// Hello,
- ๋ฌ์คํธ์ ์ด๊ธฐ ๋ฒ์ ์์๋ ๋ชจ๋ ์ฐธ์กฐ๊ฐ ๋ช
์์ ์ผ๋ก ์๋ช
์ด ์์ด์ผ ํ์
- ํน์ ์ํฉ์์ ๊ฐ์ ์๋ช ์ ๋ ธํ ์ด์ ์ ๋ฐ๋ณตํด์ ์ ์ฉํด์ผ ํจ
- ๋๋ฌธ์ ๋ช ๊ฐ์ง ๊ฒฐ์ ์ ์ธ ํจํด์ ์ปดํ์ผ๋ฌ์ ์ฝ๋์ ์ถ๊ฐํด์ ๋์ฌ ๊ฒ์ฌ๊ธฐ๊ฐ ํด๋น ์ํฉ์์๋ ์๋ช ์ ์ถ๋ก ํจ์ผ๋ก์จ ๋ช ์์ ์ธ ์ ๋ ธํ ์ด์ ์ด ํ์์น ์๋๋ก ํ์
์๋ช ์๋ต ๊ท์น(lifetime elision rules)
: ๋ฌ์คํธ์ ์ฐธ์กฐ ๋ถ์์ ์ถ๊ฐ๋ ํจํด- ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค์ํด์ผ ํ ๊ท์น์ด ์๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ณ ๋ คํด์ผ ํ ํน์ ํ ์ํฉ์ ์๋ฏธ
- ์๋ฒฝํ ์ถ๋ก ์ ์ ๊ณตํ์ง๋ ์์
์ ๋ ฅ ์๋ช (input lifetime)
: ํจ์๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์์ ์ ์ฉ๋๋ ์๋ช์ถ๋ ฅ ์๋ช (output lifetime)
: ๋ฆฌํด๊ฐ์ ์ ์ฉ๋๋ ์๋ช- ์ปดํ์ผ๋ฌ๊ฐ ์ธ ๊ฐ์ ๊ท์น์ ๋ชจ๋ ์ ์ฉํ๋๋ฐ๋ ์ฐธ์กฐ์ ์ ์ ํ ์๋ช
์ ํ๋จํ ์ ์์ผ๋ฉด ์๋ฌ ๋ฐ์
fn
ํค์๋๋ก ์ ์ํ ํจ์,impl
๋ธ๋ก์๋ ์ ์ฉ๋จ
- ๊ท์น (1) ๊ฐ ์ฐธ์กฐ ๋งค๊ฐ๋ณ์๋ ๊ฐ๊ฐ์ ์๋ช ๋งค๊ฐ๋ณ์๊ฐ ์์ด์ผ ํจ
- ๊ท์น (2) ๋ช ์์ ์ผ๋ก ํ๋์ ์ ๋ ฅ ์๋ช ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด ์ ๋ ฅ ์๋ช ์ ๋ชจ๋ ์ถ๋ ฅ ์๋ช ๋งค๊ฐ๋ณ์์ ์ ์ฉํจ
- ๊ท์น (3) ์
๋ ฅ ์๋ช
๋งค๊ฐ๋ณ์๊ฐ ํ๋ ์ด์์ด๋ฉฐ ํจ์๊ฐ ๋ฉ์๋๋ก ์ ์ธ๋์ด์ ๋งค๊ฐ๋ณ์ ์ค ํ๋๊ฐ
&self
๋&mut self
์ผ ๋๋self
๋ณ์์ ์๋ช ์ ๋ชจ๋ ์ถ๋ ฅ ์๋ช ๋งค๊ฐ๋ณ์์ ์ ์ฉํจ- ๋ฉ์๋์ ์ ์ธ์ ๋ ์ ์ ์ฌ๋ณผ์ ์ฌ์ฉํ ์ ์์ด ๋ฉ์๋๋ฅผ ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ํจ์ฌ ์ฌ์
๐ค ๋ฉ์๋ ์ ์์์์ ์๋ช ์ ๋ ธํ ์ด์
struct ImportantExcerpt<'a> {
part: &'a str,
}
impl<'a> ImportantExcerpt<'a> {
fn level(&self) -> i32 {
3
}
fn announce_and_return_part(&self, announcement: &str) -> &str {
println!("Attention! {}", announcement);
self.part
}
}
fn main() {
let novel = String::from("์ฃ์ ๋ฒ. ๊ฐ๋ํ ๋ํ์ ์ถ์ ์ธ ๋ผ์ค์ฝ๋์ฝํ๋...");
let first_sentence = novel.split('.')
.next().expect(
"๋ฌธ์ฅ์์ '.'๋ฅผ ์ฐพ์ ์ ์์."
);
let i = ImportantExcerpt { part: first_sentence };
println!("{}", i.level());
println!("{}", i.announce_and_return_part("Everyone!!"));
}
// Result
// 3
// Attention! Everyone!!
// ์ฃ์ ๋ฒ
self
๋ฅผ ์ฐธ์กฐํ๋ ํ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ๋ฉฐ ๋ฆฌํด๊ฐ์ผ๋ก๋ ์๋ฌด๊ฒ๋ ์ฐธ์กฐํ์ง ์๋i32
ํ์ ์ ๋ฆฌํดํ๋level
๋ฉ์๋- ์ฒซ ๋ฒ์งธ ์๋ต ๊ท์น ๋๋ถ์
self
๋งค๊ฐ๋ณ์์ ์๋ช ์ง์ ํ์ ์์
- ์ฒซ ๋ฒ์งธ ์๋ต ๊ท์น ๋๋ถ์
- ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋
announce_and_return_part
๋ฉ์๋- ๋ ๊ฐ์ ์
๋ ฅ ์๋ช
์ด ๋ช
์๋์์ผ๋ฏ๋ก ์ฒซ ๋ฒ์งธ ์๋ช
์๋ต ๊ท์น์ ์ ์ฉํด
&self
์announcement
๋งค๊ฐ๋ณ์์ ๊ฐ๊ฐ์ ์๋ช ๋ถ์ฌ - ๋งค๊ฐ๋ณ์ ์ค ํ๋๊ฐ
&self
์ด๋ฏ๋ก ๋ฆฌํด ํ์ ์ญ์&self
์ ์๋ช ์ ์ด์ด๋ฐ์ ๋ชจ๋ ์ฐธ์กฐ๊ฐ ์๋ช ์ ๊ฐ๊ฒ ๋จ
- ๋ ๊ฐ์ ์
๋ ฅ ์๋ช
์ด ๋ช
์๋์์ผ๋ฏ๋ก ์ฒซ ๋ฒ์งธ ์๋ช
์๋ต ๊ท์น์ ์ ์ฉํด
๐ค ์ ์ ์๋ช
let s: &'static str = "String has a static lifetime.";
์ ์ ์๋ช ('static)
: ํน๋ณํ ์๋ช ์ผ๋ก ์ ์ฒด ํ๋ก๊ทธ๋จ์ ์ ์ฉ๋จ- ํ๋ก๊ทธ๋จ ๋ฐ์ด๋๋ฆฌ์ ์ง์ ์ ์ฅ๋๋ฉฐ ํญ์ ์ฌ์ฉํ ์ ์์
- ์ฐธ์กฐ์
'static
์๋ช ์ ์ ์ฉํ๊ธฐ์ ์์ ์ด ์ฐธ์กฐ๊ฐ ์ค์ ๋ก ํ๋ก๊ทธ๋จ์ ์ ์ฒด ์๋ช ๊ณผ ๊ฐ์์ผ ํ๋์ง ์๊ฐํด ๋ณผ ํ์๊ฐ ์์- ๋ฐ์ํ๋ ๋ฌธ์ ๋๋ถ๋ถ์ ์ฃฝ์ ์ฐธ์กฐ๋ ์๋ช ๋ถ์ผ์น๋ก ์ธํด ๋ฐ์ํ๊ธฐ ๋๋ฌธ
- ์ด๋ฐ ๋ฌธ์ ์ ์ ์ ํ ํด๊ฒฐ์ฑ
์
'static
์๋ช ์ ์ฉ์ด ์๋ ๋ฌธ์ ์ ๊ทผ๋ณธ ์์ธ์ ํด๊ฒฐํ๋ ๊ฒ์
5๏ธโฃ ์ ๋ค๋ฆญ ํ์ ๋งค๊ฐ๋ณ์, ํธ๋ ์ดํธ ๊ฒฝ๊ณ, ๊ทธ๋ฆฌ๊ณ ์๋ช
use std::fmt::Display;
fn longest_with_an_announcement<'a, T>(x: &'a str, y: &'a str, ann: T) -> &'a str
where T: Display
{
println!("Attention! {}", ann);
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let msg1 = String::from("abcd");
let msg2 = String::from("xyz");
let result = longest_with_an_announcement(
msg1.as_str(), msg2.as_str(), "Everyone!!"
);
println!("result: {}", result);
}
- ์ ๋ค๋ฆญ ํ์ ๋งค๊ฐ๋ณ์, ํธ๋ ์ดํธ ๊ฒฝ๊ณ, ์๋ช ์ ํ๋์ ํจ์์ ๋ชจ๋ ์ ์ฉํ ์์ ์ฝ๋
- ํด๋น ํจ์๋ ๋ฌธ์์ด ์ฌ๋ผ์ด์ค์ ๊ธธ์ด๋ฅผ ๋น๊ตํ๊ธฐ ์ ์ ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ถ๋ ฅํ๋ฏ๋ก
Display
ํธ๋ ์ดํธ ๊ฒฝ๊ณ๊ฐ ํ์ํจ
Summary
- ์ ๋ค๋ฆญ ํ์
๋งค๊ฐ๋ณ์
- ๋ค๋ฅธ ํ์ ์ ๋์์ผ๋ก ๊ฐ์ ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ํจ
- ํธ๋ ์ดํธ์ ํธ๋ ์ดํธ ๊ฒฝ๊ณ
- ์ฝ๋์ ํ์ํ ํ์๋ฅผ ์ ์ํ ์ ์๋ ๋ฐฉ๋ฒ
- ์ ๋ค๋ฆญ ํ์ ์๋ ๊ฐ๋ฅํจ
- ์๋ช
์ ๋
ธํ
์ด์
- ์ฃฝ์ ์ฐธ์กฐ์ ๋ํ ๊ฑฑ์ ์์ด ์ ์ฐํ๊ฒ ๋์ํ๋ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
- ์ด์ ๋ํ ๋ถ์์ ๋ชจ๋ ์ปดํ์ผ ํ์์ ์ด๋ฃจ์ด์ง๋ฏ๋ก ๋ฐํ์ ์ฑ๋ฅ์ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์์
728x90
๋ฐ์ํ
'Development Study > Rust' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] Baekjoon - ๋ฌธ์์ด ๋จ๊ณ (0) | 2023.07.31 |
---|---|
[Algorithm] Baekjoon - 1์ฐจ์ ๋ฐฐ์ด ๋จ๊ณ (0) | 2023.07.13 |
[Algorithm] Baekjoon - ๋ฐ๋ณต๋ฌธ ๋จ๊ณ (0) | 2023.05.24 |
[Algorithm] Baekjoon - ์กฐ๊ฑด๋ฌธ ๋จ๊ณ (0) | 2023.04.04 |
[Rust] Start Rust (Day 18) - Error Handling (0) | 2023.03.09 |
Comments