초급 문법 : 6. 소유권 (Ownership) 개념 – Rust의 가장 중요한 메모리 관리 개념
Rust의 소유권(Ownership) 개념
Rust에서 가장 중요한 개념 중 하나가 소유권(Ownership)입니다. Rust는 자동으로 메모리를 관리하기 위해 소유권 시스템을 사용합니다. 이를 이해하면 메모리 안전성을 유지하면서 성능도 최적화할 수 있습니다.
1. 소유권(Ownership)이란?
Rust에서는 모든 값은 하나의 변수만 소유할 수 있습니다.
값을 다른 변수로 이동하면, 원래 변수는 더 이상 사용할 수 없습니다.
이 개념은 메모리 중복 해제 문제를 방지하기 위해 존재합니다.
Rust는 이 규칙을 지켜서 자동으로 메모리를 관리합니다.
2. 소유권의 3가지 규칙
Rust의 소유권 시스템은 3가지 규칙을 따릅니다.
- 각 값은 한 번에 하나의 변수만 소유할 수 있다.
- 소유자가 범위를 벗어나면, 값은 자동으로 삭제된다.
- 값을 다른 변수에 할당하면, 소유권이 이동(이전)된다.
이제 직접 예제를 실행해 보면서 이해해 보겠습니다.
3. VS Code에서 직접 실습하기
(1) 새 프로젝트 만들기
1️⃣ 터미널 열기
- VS Code를 실행하고, Ctrl + ~ (물결표) 키를 눌러 터미널을 엽니다.
- 또는 메뉴에서 [터미널] → [새 터미널] 선택하세요.
2️⃣ 새 Rust 프로젝트 생성
- 새로운 Rust 프로젝트를 만들 폴더로 이동 (예: C:\RustProjects)
cd C:\RustProjects
- 터미널에 아래 명령을 입력하고 Enter 키를 누릅니다.
- ownership_demo이라는 폴더가 생성됩니다.
cargo new ownership_demo
3️⃣ 프로젝트 열기
- VS Code에서 [파일] → [폴더 열기] 선택 후 ownership_demo 폴더를 엽니다.
4️⃣ 메인 파일 열기
- 왼쪽 src 폴더에서 main.rs 파일을 클릭하여 엽니다.
(2) 소유권 이동(Move) 예제
다음 코드를 src/main.rs 파일에 입력하세요.
fn main() {
let s1 = String::from("Hello"); // s1이 "Hello"를 소유함
let s2 = s1; // 소유권이 s1에서 s2로 이동 (Move)
println!("{}", s1); // ❌ 에러! (이전 변수 s1은 더 이상 사용할 수 없음)
}
Ctrl + S를 눌러 파일을 저장합니다. (메뉴 -> 파일 -> 저장)
(3) 실행하기
VS Code 터미널에서 아래 명령어를 실행합니다.
cargo run
🚨 결과: 컴파일 에러가 발생합니다!
error[E0382]: borrow of moved value: `s1`
이유:
s1의 데이터가 s2로 이동하면서, s1은 더 이상 유효하지 않습니다.
4. 해결 방법 1: clone() 사용
만약 원본을 유지하면서 복사하고 싶다면 .clone()을 사용하면 됩니다.
fn main() {
let s1 = String::from("Hello");
let s2 = s1.clone(); // 데이터를 복사해서 새로운 메모리를 만듦
println!("s1: {}", s1); // ✅ 정상 동작
println!("s2: {}", s2); // ✅ 정상 동작
}
✔️ 실행하면 정상적으로 출력됩니다:
s1: Hello
s2: Hello
✔️ .clone()을 사용하면 새로운 메모리를 할당하여 값이 복제됩니다.
따라서 s1도 그대로 사용할 수 있습니다.
5. 해결 방법 2: 정수형은 복사(Copy) 가능
소유권 이동은 String 같은 Heap(힙) 메모리 사용 변수에서 발생합니다.
하지만 정수형(i32 같은)은 Stack(스택)에서 복사(Copy) 되므로 문제가 없습니다.
fn main() {
let x = 10;
let y = x; // 정수형(i32)은 복사됨 (Copy)
println!("x: {}", x); // ✅ 정상 동작
println!("y: {}", y); // ✅ 정상 동작
}
✔️ 실행하면 정상적으로 출력됩니다:
x: 10
y: 10
✔️ 정수, 부동소수점, 불리언, 문자 등 기본 타입은 복사(Copy) 가능하므로 소유권 이동이 일어나지 않습니다.
6. 소유권이 자동 반환되는 범위(Scope)
변수가 범위를 벗어나면 자동으로 메모리가 해제됩니다.
fn main() {
{
let s = String::from("Hello");
println!("{}", s);
} // 여기서 s는 자동 삭제됨
// println!("{}", s); // ❌ 에러 발생! (s는 범위를 벗어남)
}
✔️ Rust는 범위(Scope)에서 벗어나는 순간, 자동으로 메모리를 해제합니다.
7. 소유권 개념 정리
- 변수는 하나의 값만 소유할 수 있다.
- 소유권을 다른 변수로 이동하면, 원래 변수는 사용할 수 없다.
- .clone()을 사용하면 데이터를 복사할 수 있다.
- 정수형 등 기본 타입은 Copy가 되어 소유권 이동이 없다.
- 범위를 벗어나면, Rust가 자동으로 메모리를 해제한다.
이상으로 소유권에 대해 알아보았습니다.
[ Rust ] 러스트 프로그래밍 언어 관련 글 목록입니다.
러스트 컴퓨터 프로그래밍 언어를 아이들에게 알려주기 위해 글을 작성하고 있습니다.가능한 쉽고 자세하게 그리고 잘 따라할 수 있도록 작성해 보려고 합니다.글이 작성되는 대로 계속 추가하
hb-love-each-other.tistory.com
한국 러스트 사용자 그룹
rust-kr.org
Rust Programming Language
A language empowering everyone to build reliable and efficient software.
www.rust-lang.org
'컴퓨터에서는' 카테고리의 다른 글
[ 자바스크립트 ] 문자열과 숫자의 형식을 변경해 보았습니다. (2) | 2025.03.31 |
---|---|
[ Rust ] 초급 문법 : 0. 주석 처리 (0) | 2025.03.31 |
CSS 프레임워크를 살펴보았습니다. (4) | 2025.03.21 |
[ Rust ] 초급 문법 : 5. 반복문 (loop, while, for) – 반복 실행하는 방법 (2) | 2025.03.18 |
[ Rust ] 초급 문법 : 4. 조건문 (if, else, else if) – 조건에 따라 코드 실행 (2) | 2025.03.16 |
댓글