Rust Attribute
Attribute는 Rust에서 컴파일러에게 추가 정보를 전달하는 메타데이터(Metadata)이다. 자바의 @어노테이션과 유사하다.
#[attribute]
#[test]
fn add_test() {}
또는
#[attribute(option)]
#[derive(Debug)]
struct User {}
또는
#[attribute(key = "value")]
#[cfg(target_os = "linux")]
fn linux_only() {}
와 같은 형태로 사용된다.
Attribute가 붙을 수 있는 곳
함수
#[test]
fn test_add() {}
구조체(Struct)
#[derive(Debug)]
struct User {
name: String,
}
Enum
#[derive(Debug)]
enum Color {
Red,
Blue,
}
모듈
#[cfg(test)]
mod tests {
}
필드
struct User {
#[allow(dead_code)]
name: String,
}
Attribute의 종류
1. Derive Attribute
컴파일러가 코드를 자동으로 생성한다.
#[derive(Debug)]
struct User {
name: String,
}
를 하면 내부적으로
impl Debug for User {
...
}
를 생성한다.
2. Conditional Compilation
조건부 컴파일
#[cfg(target_os = "linux")]
fn linux_only() {}
Linux에서만 컴파일
#[cfg(windows)]
fn windows_only() {}
Windows에서만 컴파일
#[cfg(feature = "pcre2")]
pcre2 기능이 켜졌을 때만 컴파일
3. Compiler Hint
컴파일러에게 지시
allow
경고 무시
#[allow(dead_code)]
fn temp() {}
deny
경고를 에러로 승격
#[deny(warnings)]
deprecated
사용 중단 (사용하면 warning: deprecated 발생)
#[deprecated]
fn old_function() {}
inline
인라인 힌트
#[inline]
fn add(a: i32, b: i32) -> i32 {
a + b
}
4. Procedural Macro Attribute
매크로가 코드를 생성
#[tokio::main]
async fn main() {}
#[get("/users")]
#[post("/login")]
웹 개발 시 자주 보게 된다.
Derive 상세
Debug
#[derive(Debug)]
가 있으면,
println!("{:?}", value);
가능
#[derive(Debug)]
struct User {
name: String,
}
Clone
복사
#[derive(Clone)]
let b = a.clone();
가능해 진다.
#[derive(Clone)]
struct User {
name: String,
}
Copy
얕은 복사
#[derive(Copy, Clone)]
#[derive(Copy, Clone)]
struct Point {
x: i32,
y: i32,
}
let p2 = p1;
소유권 이동이 없으므로 가능해진다.
Default
기본값 생성
#[derive(Default)]
#[derive(Default)]
struct Config {
port: u16,
}
let config = Config::default();
사용하면 u16의 기본값이 지정됨.
Config {
port: 0
}
PartialEq
일부 값은 이상해도 됨.
"같은가?" 비교 (a == b나 a != b를 사용할 수 있게 해준다.)
#[derive(PartialEq)]
Eq
모든 값이 자기 자신과 같아야 함.
완전 동등성 "완전하게 같은가?" 비교 (구현 시 PartialEq도 반드시 필요)
#[derive(Eq, PartialEq)]
PartialOrd
부분 정렬 (크기 비교 가능(일부 값은 비교 실패 가능))
<, >, <=, >= 비교 가능하지만 일부 값은 비교 실패할 수 있음
#[derive(PartialOrd)]
이 있으면,
a < b
가능해짐.
Ord
전체 정렬 (크기 비교 가능(모든 값이 반드시 비교 가능해야 함))
PartialOrd, Eq, PartialEq 모두 구현 필요.
#[derive(Ord, PartialOrd)]
vec.sort();
가능해짐.
Hash
HashMap 키 사용 가능
#[derive(Hash)]
#[derive(Hash, Eq, PartialEq)]
struct UserId(u32);
1. 해시값이 같고
2. 실제 값도 같은지 비교
하기 위해서 보통 Eq (구현 시 PartialEq) 같이 구현
HashMap<UserId, String>
매크로 생성
1. macro_rules!
옛날 방식
macro_rules! hello {
() => {
println!("hello");
};
}
사용
hello!();
2. Procedural Macro
요즘 방식
#[proc_macro]
#[proc_macro_attribute]
#[proc_macro_derive]
이렇게 만들고 아래처럼 사용한다.
#[derive(Debug)]
#[tokio::main]
#[serde(rename = "name")]
사용 형태에 따라 다르게 쓴다.
#[proc_macro]
↓
my_macro!() 형태로 사용
--------------------------------
#[proc_macro_attribute]
↓
#[my_attribute] 형태로 사용
--------------------------------
#[proc_macro_derive(MyTrait)]
↓
#[derive(MyTrait)] 형태로 사용
'Rust' 카테고리의 다른 글
| Code & Doc Coverage (0) | 2026.06.20 |
|---|---|
| Cargo.toml (0) | 2026.06.01 |
| 00 Installation (0) | 2026.01.14 |