레슨 1 부터 매크로를 썼어 — println!, vec!, format! 다 ! 로 끝나. 이 트랙이 그 ! 가 무슨 뜻인지, 언제 직접 쓰는지 안개를 걷어.
매크로는 코드를 쓰는 코드야
매크로는 컴파일 타임 에 돌며 진짜 컴파일 전에 Rust 소스를 생성해. 런타임에 값에 작동하는 함수랑 근본적으로 달라. 매크로는 문법 자체에 작동해 — 토큰을 보고 토큰을 만들어. ! 가 매크로 호출을 함수 호출과 구분하는 법이야.
매크로가 함수는 못 하는 것
세 가지. 가변 인자: println! 은 인자를 몇 개든 받아 — 함수는 못 해. 임의 문법: vec![1, 2, 3] 이랑 vec![0; 100] 은 어떤 함수 시그니처도 표현 못 하는 문법을 써. 컴파일 타임 생성: #[derive(Debug)] 가 trait impl 전체를 써줘. 함수는 런타임 값; 매크로는 컴파일 타임 코드 생성기야.
함수는 값을 추상화; 매크로는 문법을 추상화. 인자 수를 바꾸거나, 임의 문법을 받거나, 컴파일 타임에 코드를 생성해야 하면 매크로가 필요해. 그 외 전부 — 그게 대부분 — 엔 함수가 더 단순하고, 명확하고, 디버깅 쉬워.
아껴 써
매크로는 강력하지만 함수보다 읽고, 쓰고, 디버깅하기 어려워. Rust 커뮤니티 지침은 명확해: 먼저 함수로 손 뻗고, 함수가 진짜 필요한 걸 표현 못 할 때만 매크로를 써. 네가 쓰는 코드 대부분은 커스텀 매크로 0 개야 — 그게 맞아.