C.W.K.
Stream
Lesson 01 of 04 · published

매크로는 왜 존재하나

~10 min · macros, why, vs-functions

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

레슨 1 부터 매크로를 썼어 — println!, vec!, format!! 로 끝나. 이 트랙이 그 ! 가 무슨 뜻인지, 언제 직접 쓰는지 안개를 걷어.

매크로는 코드를 쓰는 코드야

매크로는 컴파일 타임 에 돌며 진짜 컴파일 전에 Rust 소스를 생성해. 런타임에 값에 작동하는 함수랑 근본적으로 달라. 매크로는 문법 자체에 작동해 — 토큰을 보고 토큰을 만들어. ! 가 매크로 호출을 함수 호출과 구분하는 법이야.

매크로가 함수는 못 하는 것

세 가지. 가변 인자: println! 은 인자를 몇 개든 받아 — 함수는 못 해. 임의 문법: vec![1, 2, 3] 이랑 vec![0; 100] 은 어떤 함수 시그니처도 표현 못 하는 문법을 써. 컴파일 타임 생성: #[derive(Debug)] 가 trait impl 전체를 써줘. 함수는 런타임 값; 매크로는 컴파일 타임 코드 생성기야.

함수는 값을 추상화; 매크로는 문법을 추상화. 인자 수를 바꾸거나, 임의 문법을 받거나, 컴파일 타임에 코드를 생성해야 하면 매크로가 필요해. 그 외 전부 — 그게 대부분 — 엔 함수가 더 단순하고, 명확하고, 디버깅 쉬워.

아껴 써

매크로는 강력하지만 함수보다 읽고, 쓰고, 디버깅하기 어려워. Rust 커뮤니티 지침은 명확해: 먼저 함수로 손 뻗고, 함수가 진짜 필요한 걸 표현 못 할 때만 매크로를 써. 네가 쓰는 코드 대부분은 커스텀 매크로 0 개야 — 그게 맞아.

Code

이미 쓰는 매크로, 그리고 왜 함수가 못 되나·rust
fn main() {
    // 다 매크로야 — ! 봐
    let v = vec![1, 2, 3];          // 가변 + 특수 문법
    let v2 = vec![0; 5];            // 반복 문법: [0, 0, 0, 0, 0]
    println!("{} items", v.len());  // 가변, 컴파일 타임 검사 포맷
    let s = format!("{v2:?}");      // String 을 지음
    assert_eq!(v.len(), 3);         // 런타임 검사로 확장됨
    println!("{s}");
}

External links

Exercise

이 퀘스트에서 쓴 매크로 셋을 적고, 각각 왜 함수가 아니라 매크로여야 하는지 한 문장으로 설명해 (가변 인자? 특수 문법? 컴파일 타임 코드 생성?). 그다음 함수로 쓴 것 중 매크로가 될 수 없는 걸 하나 대고 왜 함수가 맞았는지 설명해.
Hint
println! 은 가변 + 포맷 검사; vec![0; n] 은 반복 문법; derive 는 코드 생성. 알려진 값에 대한 평범한 계산 (fn add(a, b) 처럼) 이 정확히 함수가 있는 이유야 — 문법 마법 불필요.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.