레이블이 RUST인 게시물을 표시합니다. 모든 게시물 표시
레이블이 RUST인 게시물을 표시합니다. 모든 게시물 표시

[Rust] Ownership, Scope, Transfer Ownership 과 Borrowing

Scope, Ownership, Transfer

Rust에서 사용하는 영역, 소유, 소유권 이전, 복사, 빌림을 요약해 보는 것이 목적이다. 소유(Ownership)은 Java, Go와 같은 백그라운드에서 실행하는 garbage collector가 없다는 것이다.

Rust Ownership의 주요 키워드

  • Move: Trasnferring Ownership
  • Copy
  • Borrowing
  • Mutable Borrowing

Scope와 Ownership, Lifetime

  • 문맥에서 소유와 빌림(borrowing)은 다름을 명심하다.
  • 모든 변수는 반듯이 하나 소유해야 한다. 2개, 3개도 불허한다
    • 영역의 정의
      • 시작은 '{' (대괄호) 시작한다.
      • 끝은 '}' 또는 return 위치이다.
  • 소유 영역에서 벗어나면 파기된다.
  • lifetime은 변수가 생성되고, 삭제되는 기간을 이야기 한다.
  • 소유를 다른 영역으로 전송할 수 있다.

소유권 이전(Transferring Ownership)

  • 한 영역의 변수의 소유권을 다른 영역으로 이전(moving)하는 것이다.

복사(Copying)

  • 원시 타입같은 경우는 소유권 이전보다 복사를 한다.
    • 예) interger, floating-point, bytes(스택의) 
  • Ownership에 의존하지 않는 타입을 Copy trait이 있다.

빌림(Borrowing)

  • 만약 데이터를 이동(moving)한다면, 소유권이 새로운 변수로 바뀐다. 이 것은 다른말로 새로이 받은 변수가 영역이 삭제될 경우, 메모리상의 데이터가 삭제가 된다.
  • 소유권은 이전하지 않고, 값을 참조할 때 사용한다.
    • 참조 형태: 
      • mutable: 
        • 빌림 변수의 영역이 끝나면, 소유한 영역의 변수 값이 바뀔 수 있다.
        • mutable borrowing이 되어 살아 있다면, 다른 영역에서 immutable borrowing을 생성 할 수 없다.
      • immutable(기본): 일기 전용 변수이다.
    • 표현은 '&'를 같이 정의한다
  • 컴파일러는 모든 빌림 변수에 lifetime을 추적한다.

Rust에서 Rc와 Box

박스 변수

개발자는 변수를 스택(stack)에 할당할지, 힙(heap)에 할당할지 변수 타입을 먼저 결정 해야한다. 본 내용은 힙을 사용하는 경우이다. 

Rc<T>, Box<T>는 다음과 같다:

  • 공통
    • 힙 사용: 실제값이 저장되는 공간이다.
    • 힙 포인터 사용(usize): 힙 공간을 참조하는 변수가 스택 공간에 할당된다.
    • 재귀적 정의타입이여서 컴파일 시간에 크기를 알 수 없을 때 사용한다. 예) List
  • 차이점:
    • 데이터 소유권 개수
      • Box<T>는 1개
      • Rc<T>는 여러개
  • Box<T>: 
    • 변수 영역이 벗어나면 자동 해제가 된다. 컴파일 시간에 변수의 생명주기가 계산 가능하다.
    • 힙 내부 데이터 수정이 가능하다.
  • Rc<T>: 
    • 불변 참조(immutable reference): 
      • 힙 내부의 값을 수정할 수는 없다.
    • 여러 영역에서 소유권을 가질 수 있다:
      • 소유권이 동적으로 공유한다. 내부적으로 참조 횟수를 세고 있어서, 0이되면 할당된 메모리가 해제가 된다.
    • 순환 참조를 조심해야 한다. 대안으로 Weak<T>를 쓸 수 있다.

스택

부연하면, 스택을 사용할 경우, 짧은 생의 작은 크기를 보통 사용하기 위해서 활용한다. 그리고 FILO(first-in, last-out)의 특성을 가진다. 스택에 변수를 조작하면, 사용하는 변수의 크기를 이미 알 고 있어야 한다. 스택에 있는 변수를 함수의 인자로 넘길경우, 보통 값으로 주고 받는다. 즉, 스택에 값을 복제한다. 

큰 크기를 공간을 할당할때 사용하고, 순서가 없다. 또한 힙의 접근은 주소를 사용해서 한다. 보통 이 주소를 가지고 있는 변수를 포인터라고 한다. 하지만, 힙에 접근하기위한 포인터(레퍼런스)는 스택에 저장된다. 그러므로 컴파일 시간에 포인터 변수 자체의 크기는 알 수 있다. 다만, 힙에 저장된 데이터의 크기는 런타임 시간에 알 수 밖에 없다.

Mean-Shifted Contrastive Loss 이상 탐지 방법

Mean-Shifted Contrastive Loss 이상 탐지 방법 Mean-Shifted Contrastive Loss 이상 탐지 방법 서론: 이상 탐지의 도전과제 이상 탐지(Anomaly Detecti...