Rust 매크로

2023. 3. 11. 18:30Language/Rust

매크로란?

Rust에서는 매크로를 지원합니다. 매크로는 메타 프로그래밍이라고 하는데, 내가 만든 Rust 코드가 새로운 Rust 코드를 만드는 것을 매크로라고 합니다.

대표적으로 우리가 많이 사용하는 println!()이 있습니다.

매크로는 함수와 비슷하지만 런타임 비용이 없습니다. 대시 컴파일 비용은 있습니다.

함수와 비교

Rust에서 매크로와 함수를 구분하는 방법은 호출하는 끝에 !(느낌표)가 있나 없나로 확인 할 수 있습니다.

println!("hello") // println 끝에 ! 가 붙어 있다.
add(1, 2) // 일반적인 함수

매크로 정의는 함수 정의와 달리 모듈의 네임스페이스에 소속되지 않는다는 것입니다. 이로 인한 외부 크레이트 사용 시 발생하는 예기치 않은 이름 충돌을 막기 위해선, 외부 크레이트를 스코프 내로 가져오는 동시에 #[macro_use] 어노테이션을 사용하여 가져올 매크로를 명시해야 합니다.

#[macro_use]
extern crate serde;

매크로 유형

Rust에는 아래와 같이 두 가지 유형의 매크로가 존재 합니다.

  1. 선언적 매크로를 사용하면 인수로 제공하는 Rust 코드에서 작동하는 일치 표현식과 유사한 것을 작성할 수 있습니다. 사용자가 제공한 코드를 사용하여 매크로 호출을 대체하는 코드를 생성합니다.
  2. 절차적 매크로를 사용하면 주어진 Rust 코드의 추상 구문 트리(AST)에서 작업 할 수 있습니다.

Rust에서 가장 많이 사용되는 매크로 유형인 선언적 매크로에 대해서만 알아보도록 하겠습니다.

선언적 매크로

macros by example, macro_rules! macros, macros 라고 불립니다.

macro_rules! add{
    ($a:expr, $b:expr) => {
        {
            $a + $b
        }
    };

    ($a:expr)=>{
        {
            $a
        }
    };
}


fn main()
{
    println!("{}", add!(1,2));
    println!("{}", add!(3));
}

위 add 매크로는 두 개의 파라미터를 받아 더해서 결과를 리턴하는 매크로입니다.

파라미터에 따라 오버로딩이 가능합니다.

매크로를 만들기 위해서는 macro_rules! 를 통해 만들어집니다. $a:expr은 Rust 표현식과 매칭되어 $a라는 이름을 지정해 줍니다.

매크로 인자의 타입

위 예제어서 $a:expr에서 expr 부분에 어떤 인자를 받을 지 지정할 수 있습니다.

  • item : 함수, 구조체, 모듈 등과 같은 항목입니다.
  • block : 블록({}) 즉 중괄호로 둘러싸인 문장 블록 및 표현식
  • stmt : 성명서
  • pat : 패턴
  • expr : 표현식
  • ty : 유형
  • ident : 식별자
  • path : 경로 (ex, ::std::mem:replace)
  • meta : 메타항목, 안으로 들어가는 속성 들( ex, #[...], #![...])
  • tt : 단일 토큰 트리
  • vis : 비어있을 수 있음, 한정자 (Visibility)

'Language > Rust' 카테고리의 다른 글

Rust 열거형(Enum)  (0) 2023.03.20
Rust Struct(구조체)  (1) 2023.03.12
Rust gRPC 사용하기  (0) 2023.03.06
Rust로 폴더 감시자 만들기  (0) 2023.03.05
Rust 마스코트로 콘솔 메시지 출력  (1) 2023.03.05