오늘은 우리가 만든 설계도를 가지고 실제로 물건을 만들어내는 '마법의 주문'인 **연관 함수**와 **생성자**에 대해 알아볼 거예요.
---
우리가 앞서 배운 **구조체(데이터를 담는 주머니)**가 '스마트폰 설계도'라고 상상해 보세요.
스마트폰에는 두 가지 종류의 기능이 필요합니다.
1. **내 폰으로 하는 기능:** 전화 걸기, 문자 보내기 (이미 만들어진 스마트폰이 있어야 가능하죠?)
2. **공장에서 하는 기능:** 스마트폰 새로 만들기, 전체 스마트폰 생산 개수 확인하기 (개별 스마트폰이 없어도 '스마트폰 공장' 자체에서 하는 일이죠.)
여기서 2번처럼 **"구체적인 물건(인스턴스)이 없어도, 그 종류(타입) 자체와 연결되어 실행되는 함수"**를 **연관 함수(연관 함수)**라고 불러요.
---
**생성자(생성자)**는 연관 함수 중에서도 가장 특별한 친구예요. 바로 **"새로운 물건을 만들어내는 주문"**이기 때문이죠.
러스트에서는 보통 이 주문의 이름을 `new`(새로운 것)라고 지어줍니다. "자, 여기 재료 줄 테니까 새로운 스마트폰 하나 만들어줘!"라고 공장에 요청하는 것과 같아요.
---
자, 아주 간단한 '강아지' 설계도를 만들어 보겠습니다.
struct Dog {
name: String, // 강아지의 이름
}
impl Dog {
// 1. 이것이 바로 '생성자'이자 '연관 함수'입니다!
fn new(name: &str) -> Dog {
Dog { name: name.to_string() } // 새 강아지를 만들어서 돌려줍니다.
}
// 2. 이것은 일반적인 함수(메서드)입니다.
fn bark(&self) {
println!("{}가 멍멍! 하고 짖어요.", self.name); // 강아지가 짖는 소리를 냅니다.
}
}
fn main() {
// '::' 기호를 사용해 공장(Dog)에 직접 주문을 넣습니다.
let my_dog = Dog::new("초코"); // "초코"라는 이름의 새 강아지를 만듭니다.
my_dog.bark(); // 만들어진 강아지가 짖게 합니다.
}
---
1. **`::` (더블 콜론):** 이건 "공장에 직접 전화하기" 버튼이에요. `Dog::new()`처럼 구조체 이름 뒤에 붙여서 연관 함수를 호출할 때 사용합니다.
2. **`new` 함수:** 러스트에서 관습적으로 사용하는 생성자 이름이에요. "새로운 객체(물건)를 만들어서 나에게 줘!"라는 뜻입니다.
3. **`self`가 없어요:** 연관 함수(생성자)는 아직 물건이 만들어지기 전이거나 물건 자체가 필요 없는 기능이라서, 함수 괄호 안에 `&self`라는 글자가 들어가지 않아요.
처음에는 `::`는 뭐고 `impl`은 뭔지 낯설게 느껴질 수 있어요. 하지만 이건 마치 **"붕어빵 틀(구조체)에서 붕어빵을 찍어내는 방법(생성자)"**을 배우는 과정과 같답니다.
한 번 익혀두면 여러분은 코드 속에서 무엇이든 만들어낼 수 있는 전능한 제작자가 될 거예요!
| 55. 메서드 정의하기: impl 블록 (0) | 2026.10.06 |
|---|---|
| 54. 튜플 구조체 활용하기 (0) | 2026.10.06 |
| 53. 필드 초기화 축약법 (0) | 2026.10.01 |
| 52. 구조체 정의와 인스턴스 생성 (0) | 2026.10.01 |
| 51. 구조체란 무엇인가? (0) | 2026.10.01 |