최근 변경
최근 토론
특수 기능
파일 올리기
작성이 필요한 문서
고립된 문서
고립된 분류
분류가 되지 않은 문서
편집된 지 오래된 문서
내용이 짧은 문서
내용이 긴 문서
차단 내역
RandomPage
라이선스
IP 사용자
216.73.216.170
설정
다크 모드로 전환
로그인
Rust
(r21 RAW)
[[분류:프로그래밍 언어]] {{{#!syntax rust fn main() { println!("hello, world!"); } }}}[[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,, 메모리 안전성을 중요시 여기는 언어이다. 모질라 제단에서 관리하다가 러스트 제단으로 넘어왔다. 원래는 모질라 직원의 개인 프로젝트였으나, Servo를 만들게 되면서 새 언어를 찾다가 Rust를 발견하고 밀어주게 되었다. 페리스라는 마스코트가 있다. == 특징 == === 소유권 === 러스트를 배울 때 나오면 가장 때려치고 싶게 만드는 원흉. 메모리를 바로바로 해지하는 언어 특성상 소유권은 메우 중요한 계념이다. ==== 함수에 넘기기 ==== 또한 어떤 함수에 인자로 값을 넘기면 그 값의 소유권은 만료된다.{{{#!syntax rust fn main () { let a:u8 = 0; take_ownership(a); println("{a}"); } fn take_ownership (a:u8) { } }}}이를 실행해도 컴파일 에러가 나는데 a를 함수에 넘긴 다음에 사용하려 하였기 때문이다. 이럴 때는 to_owned(), clone()등을 써서 값을 복사함으로서 해결할 수 있지만[* clone은 벡터, String등 실제 값을 가리키는 포인터를 복사하는 반면(shallow copy), toowned는 그 메모리 내용까지 복사한다.(deep copy)] 더 좋은 방법이 있다. 또한 Copy trait이 구현되어있다면, 함수에 넣을 시에 자동으로 값이 복사되어서 딱히 값을 복사하거나 할 필요가 없다.[* 그래서 사실 위의 예제를 실행해도 에러는 안난다. u8 type이 Copy trait을 구현하였기 때문] ==== 참조자 ==== 어떤 함수의 값을 넘길 때 {{{#!syntax rust fn main() { let a:u8 = 0 borrow_me(&a); println("{a}") } fn borrow_me (a:&u8) { } }}}이렇게 함수에 넘길 때 참조자(&)를 사용하면 소유권을 유지할 수 있다. === lifetime === '''러스트의 난이도를 높히는 주범''' 포인터가 혜지된 메모리를 가리키는 것을 방지하려 만들었다. 러스트라는 언어 자체가 null pointer exception[* dangling pointer라고 많이 불리는듯]을 피하려고 설계되었기 때문이다. ==== 스코프 ==== 가장 중요한 계념 중 하나는 스코프[* {랑 }사이] 밖을 벗어나면 스코프 안에서 정의된 변수는 사용할 수 없다인데 예를들어{{{#!syntax rust fn main () { { let a:u8 = 0; } println!("{a}"); } }}}를 실행하면 컴파일 에러가 난다.[* 런타임 에러가 아니다!] 왜냐하면 스코프 안에서 선언 된 a를 수명이 끝난 스코프 밖에서 값을 조회하였기 때문이다. ==== 제내릭 라이프타임 ==== '''지옥의 시작''' {{{#!syntax rust fn longest<'a> (s1:&`a str,s2:&`a str) -> &`a str { if s1.len() > s2.len() { s1 } else { s2 } } }}} 함수 뒤에 꺽쇠 괄호가 있는 것을 볼 수 있는데 이렇게 생각하면 된다. {{{#!syntax rust fn any<T> (input:T) { //input은 어떤 타입이든 될 수 있음 } }}} 위의 예시처럼 `a는 어느 라이프타임이든 될 수 있다는 것이다. 다시 longest로 돌아가보자. 아하 longest 함수의 s1과 s2는 공통된 생명 주기를 가져야하고 리턴값의 생명주기도 같아야하구나.라는 사실을 알수 있다. 왜냐? {{{#!syntax rust fn main () { let s1 = String::new(); let result; { s2 = String::new(); result = longest(s1, s2); } println!("{result}"); } }}} 만약 위 코드에서 함수가 s2를 리턴한다면 참조가 가리키는 원본인 s2가 죽었는데 result를 조회해서 null pointer가 생겼기 때문이다. 그러면 의문이 들 것이다. "아니 그러면 런타임 에러를 발생시키면 되잖아." 그런데 러스트는 그걸 하지 말라 만든 언어다. 언어 설계에 모순이 생긴다. "아니 그러면 애초부터 result를 longest의 리턴으로 못넣게 하면 되잖아." 그게 수명주기 명시다. == 그 외 == * 컴파일 언어이다. * 컴파일 시간에 대부분의 런타임 에러를 잡아낸다.
사용자
216.73.216.170
IP 사용자
로그인
회원가입
최근 변경
[불러오는 중...]
최근 토론
[불러오는 중...]