본문 바로가기
 

하나성경

읽기 쉬운 성경, 하나성경을 소개합니다.

www.hbible.co.kr

컴퓨터에서는

[ Rust ] 초급 문법 : 6. 소유권 (Ownership) 개념 – Rust의 가장 중요한 메모리 관리 개념

by 컴 여행자 2025. 3. 24.
728x90
반응형

 

러스트
러스트

 

 

초급 문법 : 6. 소유권 (Ownership) 개념 – Rust의 가장 중요한 메모리 관리 개념

 


Rust의 소유권(Ownership) 개념

Rust에서 가장 중요한 개념 중 하나가 소유권(Ownership)입니다. Rust는 자동으로 메모리를 관리하기 위해 소유권 시스템을 사용합니다. 이를 이해하면 메모리 안전성을 유지하면서 성능도 최적화할 수 있습니다.

 


1. 소유권(Ownership)이란?

Rust에서는 모든 값은 하나의 변수만 소유할 수 있습니다.
값을 다른 변수로 이동하면, 원래 변수는 더 이상 사용할 수 없습니다.

이 개념은 메모리 중복 해제 문제를 방지하기 위해 존재합니다.
Rust는 이 규칙을 지켜서 자동으로 메모리를 관리합니다.


2. 소유권의 3가지 규칙

Rust의 소유권 시스템은 3가지 규칙을 따릅니다.

  1. 각 값은 한 번에 하나의 변수만 소유할 수 있다.
  2. 소유자가 범위를 벗어나면, 값은 자동으로 삭제된다.
  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. 소유권 개념 정리

  1. 변수는 하나의 값만 소유할 수 있다.
  2. 소유권을 다른 변수로 이동하면, 원래 변수는 사용할 수 없다.
  3. .clone()을 사용하면 데이터를 복사할 수 있다.
  4. 정수형 등 기본 타입은 Copy가 되어 소유권 이동이 없다.
  5. 범위를 벗어나면, Rust가 자동으로 메모리를 해제한다.

 

 

이상으로 소유권에 대해 알아보았습니다.

 

 


 

러스트 프로그래밍 언어 관련 글 목록입니다.

 

[ Rust ] 러스트 프로그래밍 언어 관련 글 목록입니다.

러스트 컴퓨터 프로그래밍 언어를 아이들에게 알려주기 위해 글을 작성하고 있습니다.가능한 쉽고 자세하게 그리고 잘 따라할 수 있도록 작성해 보려고 합니다.글이 작성되는 대로 계속 추가하

hb-love-each-other.tistory.com

 

 


 

https://rust-kr.org/

 

한국 러스트 사용자 그룹

 

rust-kr.org

 

 

https://www.rust-lang.org/

 

Rust Programming Language

A language empowering everyone to build reliable and efficient software.

www.rust-lang.org

 

 

728x90
반응형

댓글