r7
| 1 | [[분류:프로그래밍 언어]] |
|---|
r2
| 2 | {{{#!syntax rust |
|---|
| 3 | fn main() { |
|---|
| 4 | println!("hello, world!"); |
|---|
| 5 | } |
|---|
r10
| 6 | }}}[[https://crates.io|[[파일:Crates.io logo.png|width=25px]]]],,crates.io,,[* rust계의 npm] [[https://docs.rs|[[파일:Docs.rs logo.png|size=25px]]]],,docs.rs,,[[https://github.com/rust-lang/rust|[[파일:GitHub 아이콘 light.svg|width=25px&theme=light]]]][[https://github.com/rust-lang/rust|[[파일:GitHub 아이콘 dark.svg|width=25px&theme=dark]]]],,github,, |
|---|
r2
| 7 | 메모리 안전성을 중요시 여기는 언어이다. 모질라 제단에서 관리하다가 러스트 제단으로 넘어왔다. |
|---|
| 8 | |
|---|
r8
| 9 | 원래는 모질라 직원의 개인 프로젝트였으나, Servo를 만들게 되면서 새 언어를 찾다가 Rust를 발견하고 밀어주게 되었다. |
|---|
| 10 | |
|---|
r2
| 11 | 페리스라는 마스코트가 있다. |
|---|
r7
| 12 | |
|---|
r2
| 13 | == 특징 == |
|---|
r3
| 14 | === 소유권 === |
|---|
r11
| 15 | 러스트를 배울 때 나오면 가장 때려치고 싶게 만드는 원흉. 메모리를 바로바로 해지하는 언어 특성상 소유권은 메우 중요한 계념이다. |
|---|
r7
| 16 | |
|---|
r3
| 17 | ==== 스코프 ==== |
|---|
| 18 | 가장 중요한 계념 중 하나는 스코프[* {랑 }사이] 밖을 벗어나면 스코프 안에서 정의된 변수는 사용할 수 없다인데 예를들어{{{#!syntax rust |
|---|
| 19 | fn main () { |
|---|
| 20 | { |
|---|
r12
| 21 | let a:u8 = 0; |
|---|
r3
| 22 | } |
|---|
| 23 | println!("{a}"); |
|---|
r12
| 24 | } }}}를 실행하면 컴파일 에러가 난다.[* 런타임 에러가 아니다!] 왜냐하면 스코프 안에서 선언 된 a를 밖에서 값을 조회하였기 때문이다. |
|---|
r7
| 25 | |
|---|
r3
| 26 | ==== 함수에 넘기기 ==== |
|---|
r4
| 27 | 또한 어떤 함수에 인자로 값을 넘기면 그 값의 소유권은 만료된다.{{{#!syntax rust |
|---|
| 28 | fn main () { |
|---|
r13
| 29 | let a:u8 = 0; |
|---|
| 30 | take_ownership(a); |
|---|
r4
| 31 | println("{a}"); |
|---|
r3
| 32 | } |
|---|
r14
| 33 | fn take_ownership (a:u8) { |
|---|
r13
| 34 | } }}}이를 실행해도 컴파일 에러가 나는데 a를 함수에 넘긴 다음에 사용하려 하였기 때문이다. 이럴 때는 to_owned(), clone()등을 써서 값을 복사함으로서 해결할 수 있지만[* clone은 벡터, String등 실제 값을 가리키는 포인터를 복사하는 반면(shallow copy), toowned는 그 메모리 내용까지 복사한다.(deep copy)] 더 좋은 방법이 있다. |
|---|
r7
| 35 | |
|---|
r15
| 36 | 또한 Copy trait이 구현되어있다면, 함수에 넣을 시에 자동으로 값이 복사되어서 딱히 값을 복사하거나 할 필요가 없다.[* 그래서 사실 위의 예제를 실행해도 에러는 안난다. u8 type이 Copy trait을 구현하였기 때문] |
|---|
r9
| 37 | |
|---|
| 38 | |
|---|
r16
| 39 | ==== 참조자 ==== |
|---|
r3
| 40 | 어떤 함수의 값을 넘길 때 |
|---|
r4
| 41 | {{{#!syntax rust |
|---|
r3
| 42 | fn main() { |
|---|
r16
| 43 | let a:u8 = 0 |
|---|
| 44 | borrow_me(&a); |
|---|
r3
| 45 | println("{a}") |
|---|
| 46 | } |
|---|
r16
| 47 | fn borrow_me (a:&u8) { |
|---|
r3
| 48 | } |
|---|
r17
| 49 | }}}이렇게 함수에 넘길 때 참조자(&)를 사용하면 소유권을 유지할 수 있다. |
|---|
r5
| 50 | ==== lifetime ==== |
|---|
r18
| 51 | '''러스트의 난이도를 높히는 주범''' 포인터가 혜지된 메모리를 가리키는 것을 방지하려 만들었다. 러스트라는 언어 자체가 null pointer exception을 피하려고 설계되었기 때문이다. |
|---|
r3
| 52 | == 그 외 == |
|---|
r2
| 53 | * 컴파일 언어이다. |
|---|
| 54 | * 컴파일 시간에 대부분의 런타임 에러를 잡아낸다. |
|---|