선언적 매크로(`macro_rules!`)
반복적인 코드 패턴을 추상화하고 컴파일 시점에 코드를 생성하는 선언적 매크로를 작성하는 방법을 배웁니다.
선언적 매크로(`macro_rules!`)은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 3개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 3개의 강의가 포함되어 있습니다.
Rust 매크로란 무엇인가요?
매크로는 코드를 작성하는 코드를 작성하는 방법입니다! 매크로는 함수와 비슷하지만 값이 아니라 구문 트리(코드의 구조)를 대상으로 동작합니다.
- 반복적인 코드를 추상화하는 데 도움이 됩니다.
- Rust 안에서 도메인 특화 언어(DSL)를 사용할 수 있게 합니다.
- 컴파일 시간에 실행되어 컴파일 전에 일반 Rust 코드로 확장됩니다.
선언적 매크로 구문
Rust의 선언적 매크로는 macro_rules! 키워드를 사용합니다. 이 매크로는 특정 Rust 코드 패턴과 일치하는 규칙 집합을 정의합니다.
코드 조각에 패턴 매칭을 적용하는 것이라고 생각하시면 됩니다. 컴파일러는 매크로 호출을 보면 입력이 정의된 규칙 중 하나와 일치하는지 확인합니다.
첫 번째 `macro_rules!`
인사말을 출력하는 아주 간단한 매크로를 만들어 보겠습니다. macro_rules! 키워드와 입력 패턴이 없는 규칙을 정의하는 () => {} 구문에 주목하세요.
이 예제를 실행해 보세요.
macro_rules! greet {
() => {
println!("Hello from a macro!");
};
}
fn main() {
greet!(); // Call our macro!
}지정자로 입력 캡처하기
매크로는 "지정자"를 사용해 입력을 받을 수 있습니다. 지정자는 매크로가 캡처할 것으로 예상되는 Rust 구문의 종류를 알려 줍니다.
$expr: 표현식(예:1 + 2,"hello")$ident: 식별자(예: 변수 이름, 함수 이름)$ty: 타입(예:i32,String)$block: 코드 블록(예:{ ... })- 그 밖에도 다양한 종류가 있습니다!
인수를 받는 매크로
표현식($e:expr)을 받아 그 값을 출력하는 매크로입니다. 여기서 :expr이 지정자입니다.
캡처된 $e는 매크로 본문에서 사용할 수 있게 됩니다. stringify! 매크로는 표현식을 문자열 표현으로 변환합니다.
macro_rules! debug_print {
($e:expr) => {
println!("Debug: {} = {:?}", stringify!($e), $e);
};
}
fn main() {
let x = 10;
debug_print!(x + 5);
debug_print!("Rust macros are fun");
}여러 입력 처리하기
매크로가 같은 유형의 인수를 여러 개 받도록 하려면 어떻게 해야 할까요? 반복 연산자인 $()*를 사용할 수 있습니다.
$(): 내부의 내용은 반복할 패턴입니다.*: 0회 이상 반복합니다.+: 1회 이상 반복합니다.- 구분 기호를 지정할 수도 있습니다. 예를 들어
$(...),*는 항목을 쉼표로 구분합니다.
반복 인수를 사용하는 매크로
여러 표현식을 쉼표로 구분해 받고 각각을 개별적으로 출력하는 매크로를 만들어 보겠습니다. 이러한 방식은 목록과 비슷한 구조를 만들 때 강력합니다.
macro_rules! print_all {
( $( $x:expr ),* ) => {
$( // This $(...)* repeats the `println!` call
println!("Item: {:?}", $x);
)*
};
}
fn main() {
print_all!(1, "hello", true, 3.14);
print_all!("Just one item");
}매크로 위생 이해하기
Rust의 매크로는 "위생적"입니다. 즉, 매크로 내부에서 정의한 variable은 외부의 variable과 이름이 같더라도 우연히 충돌하지 않습니다.
컴파일러는 의도하지 않은 부작용을 방지하기 위해 확장 과정에서 내부적으로 이름을 바꾸므로, 매크로를 더 안전하고 예측 가능하게 사용할 수 있습니다.
매크로 디버깅 방법
때로는 매크로가 예상대로 확장되지 않을 수 있습니다. Rust에서는 확장된 코드를 확인할 수 있는 방법을 제공합니다.
cargo expand를 실행합니다(cargo-expand도구를 설치해야 합니다).- 소스 file에 직접
rustc --pretty expanded를 사용합니다.
이렇게 하면 매크로가 생성한 가공되지 않은 Rust 코드를 확인할 수 있으므로, 복잡한 매크로 동작을 디버깅하고 이해하는 데 매우 유용합니다!
매크로 패턴 매칭 퀴즈
다음 매크로 정의를 살펴보세요.
macro_rules! make_tuple {
( $x:expr, $y:expr ) => {
($x, $y)
};
}다음 중 성공적으로 컴파일되고 make_tuple! 매크로를 사용하는 line은 무엇일까요?
복습: 선언적 매크로
이 lesson에서는 macro_rules!를 사용하는 선언적 매크로를 배웠습니다.
- 컴파일 시 코드를 생성하여 반복적인 패턴을 추상화합니다.
- 구문을 기반으로 input을 캡처하기 위해 패턴 매칭을 사용합니다.
$expr,$ident와 같은 지정자는 어떤 종류의 구문을 예상하는지 지정합니다.$()*와 같은 반복 연산자는 유연한 구분 기호를 사용해 여러 인수를 처리합니다.- 매크로는 위생적이므로 우연한 이름 충돌을 방지합니다.
매크로는 반복적인 보일러플레이트를 줄이고 Rust에서 유연하고 사용하기 편한 API를 만드는 강력한 도구입니다!
자주 묻는 질문
“선언적 매크로(`macro_rules!`)” 강의는 무료인가요?
네 — “선언적 매크로(`macro_rules!`)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 3개의 강의가 포함되어 있습니다.
“선언적 매크로(`macro_rules!`)”에서 뭘 배우나요?
반복적인 코드 패턴을 추상화하고 컴파일 시점에 코드를 생성하는 선언적 매크로를 작성하는 방법을 배웁니다. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 1번째 강의입니다.
“선언적 매크로(`macro_rules!`)” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 선언적 매크로(`macro_rules!`)
- 절차적 매크로: Derive, Function
- 안전하지 않은 Rust와 상호 작용하기