본문 바로가기
Languages/RUST

[RUST] TRPL : Chapter 4 - Ownership

by odaebum 2024. 11. 27.
728x90

소유권

규칙

  1. Rust의 각 값에는 소유자가 있다.
  2. 한 번에 한 명의 소유자만 있을 수 있다.
  3. 소유자가 범위를 벗어나면 가치가 떨어진다.
    1. → Rust는 중괄호로 범위가 정해져 있다.

스택 : 후입 선출

  • 스택에 저장된 모든 데이터는 알려진 고정된 크기를 가져야 한다.

  • 크기를 알 수 없는 데이터나 크기가 변경될 수 있는 데이터는 대신 힙에 저장해야한다.

  • copy 특성 구현 목록

    image.png

  • trait ?

힙 :

  • 힙에 데이터를 넣을 때 특정 양의 공간을 요청한다.
  • 메모리 할당자는 힙에서 충분히 큰 빈 공간을 찾아서 사용중이라고 표시하고, 해당 위치의 주소인 포인터를 반환한다. (힙 할당)
  • 힙에 대한 포인터는 고정 크기

힙 vs 스택

  • 힙은 할당하는 것이므로, 단순 푸쉬인 스택보다 느리다.

메모리

  • 기존의 GC 언어들은 자동으로 추적 및 정리함, GC가 없는 언어는 명시적으로 직접 호출 및 해제해야함

  • Rust는 변수가 범위를 벗어나면 자동으로 반환됨

  • 참고) C++에서 항목의 수명이 끝날 때 리소스를 할당 해제하는 패턴 : RAII

          let s1 = String::from("hello");
          let s2 = s1;
    
          println!("{s1}, world!");

    Rust는 복사를 진행할때 s1을 범위 밖으로 벗어났다고 간주한다. 즉, 복사의 개념이 아닌 move의 개념이다.

    실제로 s1은 사용할 수 없다. (String 기준)

  • 복사를 진행하려면 let s2 = s1.clone(); 으로 진행해야 한다.

문자열

  • 리터럴 : 직접 하드 코딩됨
  • String::from() 구현이 필요한 메모리 요청

참조

  • 소유권을 이전하지 않고 값을 사용하기 위함

  • 변수가 기본적으로 불변인 것처럼 Rust의 참조는 수정할 수 없다.

      fn main() {
          let s = String::from("hello");
    
          change(&s);
      }
    
      fn change(some_string: &String) {
          some_string.push_str(", world");
      }
  • 마지막으로 사용되면 drop

가변 참조

  • 그러나 참조한 값을 수정하기 위해서는 (&mut s)와 같이 &mut을 이용하면 된다.

  • 값에 대한 참조가 있는 경우 해당 값에 대한 다른 참조가 있을 수 없다.

    • 즉 한번에 두개 이상의 가변 참조로 빌려줄 수 없다, But 불변 참조는 가능

        let mut s = String::from("hello");
      
            let r0 = &s; //ok
            let r1 = &s; //ok
        let r2 = &mut s; //err
        let r3 = &mut s; //err
      
        println!("{}, {}", r1, r2);

Dangling 참조 (매달린 참조)

→ 포인터가 있는 언어에서는 일부 메모리를 해제하면서 해당 메모리에 대한 포인터를 실수로 남겨놓을 수 있다.

  • Rust에서는 Dangling 참조가 발생할 수 없음.

슬라이스

→ 슬라이스는 전체 컬렉션이 아닌 컬렉션의 연속된 요소 시퀀스를 참조할 수 잇게 해줌.

  • 슬라이스는 참조의 일종이므로, 소유권이 없음.
let a = &s[0..2];
let a = &s[..2];

let len = s.len();

let b = &s[3..len];
let b = &s[3..];
  • ? &String과 &str 의 차이점이 무엇인가.

      fn first_word(s: &String) -> &str {
    
      fn first_word(s: &str) -> &str {
    
728x90

'Languages > RUST' 카테고리의 다른 글

[RUST] TRPL : Chapter5 - Method & Implement  (0) 2024.11.27
[RUST] &String vs &str  (0) 2024.11.27
[RUST] TRPL : Chapter3 - Programming  (0) 2024.11.26
[RUST] TRPL : Chapter2 - Coding  (0) 2024.11.26
[RUST] Rust 명명법  (1) 2024.11.26