0Pricing
Learn Rust Coding · 강의

선언적 매크로(`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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 선언적 매크로(`macro_rules!`)
  2. 절차적 매크로: Derive, Function
  3. 안전하지 않은 Rust와 상호 작용하기
← Learn Rust Coding(으)로 돌아가기