상세 컨텐츠

본문 제목

42. 복사(Copy)와 클론(Clone)

RUST 온보딩/러스트를 배우고 만들자_초보자

by 러스트코리아 2026. 9. 14. 16:42

본문

반응형

 

오늘은 러스트의 독특한 규칙인 '소유권' 때문에 꼭 알아야 하는 두 친구, **복사(Copy)**와 **클론(Clone)**에 대해 알아볼 거예요. 처음에는 조금 낯설 수 있지만, 비유를 통해 하나씩 살펴보면 정말 쉽답니다. 시작해 볼까요?

---

### 1. 왜 이런 게 필요한가요? (소유권 이야기)

 

러스트에는 **소유권(Ownership: 데이터의 주인은 오직 하나여야 한다는 규칙)**이라는 아주 엄격한 규칙이 있어요.

 

예를 들어, 여러분이 아주 소중한 '황금 열쇠'를 친구에게 주면, 이제 그 열쇠는 친구의 것이고 여러분에겐 없죠? 러스트의 데이터도 기본적으로는 이렇게 **'이동(Move)'**하는 성질을 가지고 있어요. 하지만 때로는 똑같은 물건을 하나 더 만들어서 나도 갖고 친구도 주고 싶을 때가 있죠. 이때 등장하는 것이 바로 **복사**와 **클론**입니다!

 

---

### 2. 복사(Copy): "종이 메모지처럼 가벼운 복제

 

" **복사(Copy)**는 아주 작고 가벼운 데이터를 다룰 때 일어납니다.

 

* **비유:** 여러분의 손바닥에 적힌 '숫자 7'을 친구가 보고 자기 손바닥에 똑같이 적는 것과 같아요. 너무 쉽고 빨라서 러스트가 여러분 몰래 **자동으로** 해준답니다.

* **특징:** 주로 숫자(`i32`), 참/거짓(`bool`)처럼 크기가 정해진 작은 데이터들이 이 능력을 갖추고 있어요.

* **전문 용어:** 이런 데이터들은 메모리의 **스택(Stack: 빨리 쓰고 버리는 작은 바구니)**이라는 공간에 저장됩니다.

fn main() {
    let x = 5;          // x라는 방에 5를 넣어요.
    let y = x;          // x를 복사(Copy)해서 y에 넣어요. (자동으로 일어남!)
    
    println!("{}", x);  // x도 여전히 사용할 수 있어요! (값이 가벼우니까요)
    println!("{}", y);  // y도 당연히 5를 가지고 있어요.
}

 

---

### 3. 클론(Clone): "무거운 가구처럼 힘든 복제"

 

**클론(Clone)**은 크기가 크거나 복잡한 데이터를 다룰 때 사용해요.

 

* **비유:** 아주 크고 무거운 '원목 책상'을 똑같이 하나 더 만드는 것과 같아요. 재료도 많이 들고 시간도 오래 걸리겠죠? 그래서 러스트는 주인에게 **"이건 힘든 작업이니까, 정말 할 건지 명확하게 말해줘!"**라고 요청합니다.

* **특징:** 글자 뭉치(`String`)나 목록(`Vec`)처럼 크기가 변할 수 있는 데이터들이 해당됩니다. 우리가 직접 `.clone()`이라고 명령어를 써줘야 해요.

* **전문 용어:** 이런 데이터들은 메모리의 **힙(Heap: 크고 복잡한 짐을 쌓아두는 창고)**이라는 공간을 사용합니다.

 

fn main() {
    let s1 = String::from("안녕"); // s1이라는 이름의 무거운 상자를 만들어요.
    let s2 = s1.clone();           // .clone()을 써서 똑같은 상자를 하나 더 만들라고 명령해요!
    
    println!("{}", s1);            // 명령을 했기 때문에 s1도 무사히 남아있어요.
    println!("{}", s2);            // 새로 만든 s2도 잘 나오네요!
}

---

### 4. 한눈에 비교하기

| 구분 | 복사 (Copy) | 클론 (Clone) |

| :--- | :--- | :--- |

| **속도** | 매우 빠름 (순식간!) | 상대적으로 느림 (에너지가 들어요) |

| **방법** | 자동으로 일어남 | `.clone()`이라고 직접 써야 함 |

| **대상** | 숫자, 불리언 등 작은 데이터 | 문자열, 리스트 등 큰 데이터 |

| **능력(Trait)** | **카피 트레이트(Copy Trait: 복사 능력을 갖췄다는 표시)** | **클론 트레이트(Clone Trait: 복제 능력을 갖췄다는 표시)** |

 

---

### 🌟 마무리하며

 

러스트가 왜 이렇게 까다롭게 구는지 궁금하실 수 있어요. 그건 바로 여러분의 프로그램이 **메모리를 낭비하지 않고 안전하게 돌아가게 하기 위해서**랍니다. - "가벼운 건 내가 알아서 복사해줄게! (Copy)" - "무거운 건 네가 직접 결정해! (Clone)" 이 마음만 기억하신다면 여러분은 이미 러스트 전문가로 한 걸음 더 다가선 거예요. 처음엔 `.clone()`을 붙이는 게 귀찮을 수 있지만, 나중에는 이 덕분에 내 프로그램이 얼마나 튼튼해지는지 느끼게 될 거예요.

반응형

관련글 더보기