[번역] [Rust 언어 공부 ~소유권에 대하여~]

A
arkjun

Back-End2026.02.05

Kanau_Kato - 2026-01-30T17:06:30.000+09:00



시작하며

이 글은 Rust 언어를 공부하는 사람이라면 반드시 마주하게 된다고 해도 과언이 아닌 Rust 언어 특유의 '소유권(Ownership)'에 대해 초보자분들을 위해 가볍게 정리한 글입니다. 전체적인 분위기를 이해하시는 데 도움이 되었으면 좋겠습니다.

Rust 언어란?

Rust(러스트)는 성능, 메모리 안전성, 안전한 병행성을 목표로 설계된 멀티 패러다임 프로그래밍 언어이다. C 언어, C++를 대체하는 시스템 프로그래밍 언어를 지향하고 있으며, 구문적으로는 C++와 유사하지만, '빌려오기 검사기(borrow checker)'로 참조의 유효성을 검증함으로써 메모리 안전성을 보장할 수 있다. Rust는 가비지 컬렉션(Garbage Collection) 없이 메모리 안전성을 달성했으며, 필요한 상황에서 참조 카운팅(Reference Counting)을 사용할 수도 있다. — 위키백과 Rust (프로그래밍 언어)
Rust 언어는 간단히 말해 다음과 같은 세 가지 특징을 겸비한 언어입니다.
  • 빠르다
  • 안전하다
  • 메모리가 안전하다
이 세 가지 중 '안전'을 뒷받침하는 핵심 개념이 바로 소유권입니다. 이번 글에서는 이 소유권에 대해 간단히 정리해 보겠습니다.

소유권이란?

대부분의 언어에서는 보통 변수에서 변수로 값을 전달할 때 복사(Copy)가 이루어지지만, Rust 언어에서는 여기에 더해 소유권과 **이동(Move)**이라는 개념으로 이 부분을 제어합니다.
Rust에서는 변수 하나하나에 '주인'이 있습니다. 그 주인이 데이터의 소유권을 가짐으로써 데이터를 조작할 수 있게 됩니다. 왜 이런 메커니즘이 있느냐 하면, 다른 언어에서 종종 발생하는 다음과 같은 사고들을 컴파일 시점에 방지하기 위해서입니다.
  • 사용해서는 안 되는 메모리를 사용해 버렸다.
  • 이미 삭제되었어야 할 데이터를 참조해 버렸다.
이러한 사고를 막기 위해 소유권이라는 시스템을 사용합니다.
그럼, 간단한 예시를 통해 구체적으로 살펴보겠습니다.
let s = "hello";
이 코드에서는 "hello"라는 문자열 데이터의 소유권을 변수 's'(주인)가 갖는 관계가 형성됩니다.

소유권이 이동한다

Rust에서는 변수에서 변수로 값을 전달할 때 소유권이 이동하는 경우가 있습니다. 이를 **무브(Move)**라고 부릅니다.
예를 들어, 다음과 같은 코드를 보겠습니다.
let s1 = String::from("hello");
let s2 = s1;
겉보기에는 s1s2에 대입한 것처럼 보이지만, 이 시점에서 "hello"라는 데이터의 소유권이 s1에서 s2로 이동합니다.
즉, 상태는 다음과 같이 변합니다.
  • s2 → 주인
  • s1 → 더 이상 주인이 아님

무브 후에는 원래 변수를 사용할 수 없다

앞선 코드에 내용을 추가하면 어떻게 될까요?
let s1 = String::from("hello");
let s2 = s1;
println!("{}", s1);
결과는 컴파일 에러가 발생합니다. 이유는 간단합니다. s1은 더 이상 "hello"의 주인이 아니기 때문입니다. Rust는 주인이 아닌 사람이 데이터를 다루는 것은 안 된다는 규칙을 철저히 지킵니다. 이 또한 '안전'을 위한 메커니즘입니다.

왜 이렇게까지 제한하는가?

만약 s1s2가 모두 같은 데이터의 소유권을 가지고 있다면 다음과 같은 문제가 생길 수 있습니다.
  • 어느 쪽이 먼저 데이터를 조작할지 알 수 없다.
  • 이미 해제된 데이터를 참조하거나 수정해 버릴 가능성이 있다.
이러한 사고를 컴파일할 때 방지하기 위해 규칙을 엄격하게 적용하는 것입니다.

요약

이번에는 소유권과 그 특성에 대해 다음 내용을 알아보았습니다.
  • 변수(주인)와 데이터의 관계
  • 소유권은 무브(이동)된다
이러한 개념이 있다는 것을 멘탈 모델(Mental model)로서 어느 정도 이해하셨으리라 생각합니다. 또한 Rust가 왜 안전하다고 하는지에 대한 이유도 알게 되셨을 것입니다.

마치며

이번에는 Rust에서 흔히들 어려워하는 소유권의 입문 단계만을 다루었습니다. 이후에는 다음과 같은 개념들이 이어집니다.
  • clone
  • 빌려오기(Borrowing, 참조)
  • 가변 참조(Mutable Borrowing)
  • 라이프타임(Lifetime)
이 모든 개념에는 소유권이 밀접하게 연관되어 있습니다. 이 글이 그 기초를 다지는 토대가 되었기를 바랍니다.
0
4

댓글

?

아직 댓글이 없습니다.

첫 번째 댓글을 작성해보세요!

유사한 내용의 글