2023. 3. 11. 18:30ㆍLanguage/Rust
매크로란?
Rust에서는 매크로를 지원합니다. 매크로는 메타 프로그래밍이라고 하는데, 내가 만든 Rust 코드가 새로운 Rust 코드를 만드는 것을 매크로라고 합니다.
대표적으로 우리가 많이 사용하는 println!()
이 있습니다.
매크로는 함수와 비슷하지만 런타임 비용이 없습니다. 대시 컴파일 비용은 있습니다.
함수와 비교
Rust에서 매크로와 함수를 구분하는 방법은 호출하는 끝에 !(느낌표)
가 있나 없나로 확인 할 수 있습니다.
println!("hello") // println 끝에 ! 가 붙어 있다.
add(1, 2) // 일반적인 함수
매크로 정의는 함수 정의와 달리 모듈의 네임스페이스에 소속되지 않는다는 것입니다. 이로 인한 외부 크레이트 사용 시 발생하는 예기치 않은 이름 충돌을 막기 위해선, 외부 크레이트를 스코프 내로 가져오는 동시에 #[macro_use]
어노테이션을 사용하여 가져올 매크로를 명시해야 합니다.
#[macro_use]
extern crate serde;
매크로 유형
Rust에는 아래와 같이 두 가지 유형의 매크로가 존재 합니다.
선언적 매크로를
사용하면 인수로 제공하는 Rust 코드에서 작동하는 일치 표현식과 유사한 것을 작성할 수 있습니다. 사용자가 제공한 코드를 사용하여 매크로 호출을 대체하는 코드를 생성합니다.절차적 매크로를
사용하면 주어진 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 |