본문 바로가기
Rust

Attribute

by curious week 2026. 6. 1.

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