Rust Professional Code
Rust-Professional-Code ์ฑ ์ ๋ํ ๋ด์ฉ์ ๋ฆฌ, ๊ฐ๋จํ๊ณ ํ์ํ ๋ถ๋ถ๋ง ์ ๋ฆฌํ์ฌ ๊ฐ์ธ ์ฐธ๊ณ ์ฉ
- ์ง๊ธ ๋์๊ฒ๋ ์ค์ํ ๋ด์ฉ๋ค๋ ๋ง์ง๋ง, ๋น์ฅ ๋์๊ฒ ํ์ํ์ง๋ ์์ ํฐ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ, ๋ค๋ฅธ ์ธ์ด ๋ฐ์ด๋๋ฆฌ์์ ํตํฉ๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ๋ง๋ค.
 - ์ธ์ ๊ฐ๋ ํ์ํด์ง๊ฒ ์ง๋ง ๊ทธ๋ฌํ ๋ด์ฉ๋ค์ ๊ทธ ์ฆ์์ ์ฝ์ด๊ฐ๋๊ฒ ๋ซ๋ค๋ ์๊ฐ์ด ๋ค์ด ํ์ํ ๋ถ๋ถ๋ง ๋ฆฌ๋ง์ธ๋์ฉ์ผ๋ก ๋ฐ์ทํด์ ์ ๋ฆฌํ๋ ค ํ๋ค.
 
Chapter 4 ๋ฐ์ดํฐ ๊ตฌ์กฐ
String, str, &str, &โsatic str์ ๋ํ ์ค๋ช
๋ฌธ์์ด ํ์ ๋ค์ด ๋ง์ ํผ๋์ค๋ฝ์ง๋ง, ๊ธฐ๋ณธ๋ฐ์ดํฐ(์ฐ์์ ์ธ ๋ฌธ์์ ์ด)์ ์ํธ์์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋๋ ์ ์๊ฐํ๋ ๊ฒ์ด ์ค์ํ๋ค. ๋ฌ์คํธ์๋ ํ ์ข ๋ฅ์ ๋ฌธ์์ด๋ง ์์ง๋ง, ๋ฌธ์์ด์ ํ ๋นํ๊ณ ํด๋น ๋ฌธ์์ด์ ์ฐธ์กฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
String๊ณผ str
- ์ด ๋์ ๊ธฐ์ ์ ์ผ๋ก๋ ๋ค๋ฅธ ํ์ ์ด์ง๋ง, ์๋์ ๋ชฉ์  ๋ฉด์์๋ ๋๋์์ดํ๋ค.
 - ์ ์ผํ ์ค์ง์ ์ธ ์ฐจ์ด์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ด๋ค.
 - str : โ์คํโ์ ํ ๋น๋ utf-8 ๋ฌธ์์ด, ๋์ฌํ ์ ์์ง๋ง ์ด๋ํ๊ฑฐ๋ ๋ณ๊ฒฝ ํ ์ ์์
 - String: โํโ์ ํ ๋น๋ utf-8 ๋ฌธ์์ด, ๋์ฌ์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํจ
 
char *stack_string = "stack-allocated string";
char *heap_string = strndup("heap-allocated string);
- ๋น์ ํ์๋ฉด str์ ์ ์, String์ ํ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
 
๋ฌ์คํธ์์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋ช ์์ ์ด๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ํ์ ์์ฒด๊ฐ ์์์ ์์ ํจ๊ป ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ๋ฒ๋ ์ ์ํ๋ค.
ํจ์จ์ ์ผ๋ก ๋ฌธ์์ด ์ฌ์ฉํ๊ธฐ
- ๋ฌ์คํธ์์ ์์ ํ ๋ ๋๋ถ๋ถ String, &str์ ์ฌ์ฉํ๊ณ str์ ์ฌ์ฉํ์ง ์๋๋ค.
 - ๋ฌ์คํธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์
- ๋ถ๋ณ ๋ฌธ์์ด ํจ์๋ &str ํ์ ์ ๋ํด ๊ตฌํ๋๋ค.
 - ๊ฐ๋ณ ๋ฌธ์์ด ํจ์๋ String ํ์ ์์๋ง ๊ตฌํ๋๋ค.
 
 - str์ ์ง์  ์์ฑํ ์๋ ์์ผ๋ฉฐ, ๊ทธ์ ๋ํ ์ฐธ์กฐ๋ง ๋น๋ฆด ์ ์๋ค.
 - ํจ์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์ฒ๋ผ String์ ํญ์ &str๋ก ๋น๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ &str ํ์ ์ ์ต์ ๊ณตํต ๋ถ๋ชจ ์ญํ ์ ํ๋ค.
 - static์ ๊ฒฝ์ฐ๋ ํ๋ก์ธ์ค์ ์ ์ฒด ์๋ช ๋์ ์ ํจํ ์ฐธ์กฐ๋ฅผ ์ ์ํ๋ ํน์ํ ์๋ช ์ง์ ์์ด๋ค.
 - ์ฐธ๊ณ ๋ก &str๋ก 
&'static str์ ๋น๋ฆด ์ ์๋ค. 
| ํน์ฑ | str | 
&str | 
String | 
&'static str | 
|---|---|---|---|---|
| ์ข ๋ฅ | ์ฌ๋ผ์ด์ค | ๋ฌธ์์ด ์ฌ๋ผ์ด์ค ์ฐธ์กฐ | ์์ ๊ถ์ด ์๋ ๋ฌธ์์ด | ์ ์  ์๋ช ์ ๊ฐ์ง ๋ฌธ์์ด ์ฌ๋ผ์ด์ค | 
| ํฌ๊ธฐ | ๋์  | 2*ํฌ์ธํฐ ํฌ๊ธฐ (16๋ฐ์ดํธ) | 24๋ฐ์ดํธ (ํฌ์ธํฐ, ๊ธธ์ด, ์ฉ๋) | 2*ํฌ์ธํฐ ํฌ๊ธฐ (16๋ฐ์ดํธ) | 
| ์๋ช | N/A (๋จ๋ ์ฌ์ฉ ๋ถ๊ฐ) | ์ฐธ์กฐ ์๋ช ์ ์ข ์ | ์์ ๊ถ ๊ธฐ๋ฐ, ๋ช ์์  ์๋ช ์์ | ํ๋ก๊ทธ๋จ ์ ์ฒด ์๋ช | 
| ์์  ๊ฐ๋ฅ์ฑ | ๋ถ๋ณ | ๋ถ๋ณ | ๊ฐ๋ณ | ๋ถ๋ณ | 
| ํ ๋น | ์คํ (์ผ๋ฐ์ ์ผ๋ก) | ์์ (์ฐธ์กฐ๋ง) | ํ | ์ ์  ๋ฉ๋ชจ๋ฆฌ ์์ญ | 
| ์์ฑ ๋ฐฉ๋ฒ | ์ง์  ์์ฑ ๋ถ๊ฐ | &"hello", ์ฌ๋ผ์ด์ฑ | 
String::from("hello"), "hello".to_string() | 
"hello", const S: &'static str = "hello" | 
| ์ฃผ์ ์ฉ๋ | ํ์ ์ ์์ฉ | ๋ฌธ์์ด ์ฐธ์กฐ ๋ฐ ์ฝ๊ธฐ | ๋ฌธ์์ด ์์  ๋ฐ ์์ | ์ปดํ์ผ ํ์ ์์ ๋ฌธ์์ด | 
| ์์ | fn f(s: str) (๋ถ๊ฐ๋ฅ) | 
fn f(s: &str) | 
let s = String::from("hello") | 
const VERSION: &'static str = "1.0" | 
| ๋ณํ | N/A | &String โ &str ์๋ ๋ณํ | 
.as_str() โ &str | 
&'static str โ &str ๊ฐ๋ฅ | 
| ์ฐ๊ฒฐ | ๋ถ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ (์ String ํ์) | + ์ฐ์ฐ์, push_str() | 
๋ถ๊ฐ๋ฅ (์ String ํ์) | 
| ๋ฌธ์์ด ๋ฆฌํฐ๋ด | N/A | ๋ฆฌํฐ๋ด์ &'static str | 
to_string() ์ผ๋ก ๋ณํ ํ์ | 
๋ฌธ์์ด ๋ฆฌํฐ๋ด ์์ฒด | 
- str๊ณผ String์ ๋ ๋ค๋ฅธ ์ฐจ์ด์ ์ String์ ์ด๋ํ ์ ์์ง๋ง, str์ ์๋๋ค๋ ๊ฒ์ด๋ค.
 
fn print_String(s: String) {
	println!("print_String: {}", s);
}
fn print_str(s: &str) {
	println!("print_String: {}", s);
}
fn main() {
	// let s: str = "impossible str"; <- ์ปดํ์ผ ์๋จ
	print_String(String::from("String")); // ๊ฐ๋ฅ, value๋ ์ด๋ํ๋ค.
	print_str(&String::from("String")); // ์ฐธ์กฐ๋ฅผ ๋ฐํํ๊ธฐ์ ๊ฐ๋ฅ
	print_str("str"); // main ์คํ์ str ์์ฑํ๊ณ , ์ด๋ฅผ ์ฐธ์กฐ๋ก ์ ๋ฌํ๊ธฐ์ ๊ฐ๋ฅํ๋ค
}