본문으로 건너뛰기

안동민 개발노트

본문 시작

B - 연산자와 기호

산술·비교·논리·비트·대입 연산자와 경로·참조·범위·제네릭 등에 쓰이는 기호의 문맥별 의미를 빠르게 확인합니다.

이 부록은 러스트 문법에서 자주 등장하는 연산자와 기호를 빠르게 확인할 수 있도록 구성되어 있습니다.

문법을 처음 익힐 때는 의미를 알고 넘어가도, 시간이 지나면 세부 기호 문맥이 다시 헷갈리기 쉽습니다.

특히 연산자 오버로딩 가능 여부나 컨텍스트별 의미 차이는 실수로 이어지기 쉬운 지점입니다.

그래서 이 절은 단순 목록이 아니라, 구현/디버깅 시 바로 참조할 수 있는 실전 용어집으로 활용하는 것이 좋습니다.

표를 읽을 때는 문법 의미만 보지 말고, 어떤 트레이트 구현과 연결되는지까지 함께 확인하는 습관이 중요합니다.

이 기준이 잡히면 연산자 오버로딩을 설계할 때 타입 안정성과 의도 일관성을 더 쉽게 유지할 수 있습니다.

필요한 항목만 빠르게 찾아 쓰되, 자주 쓰는 기호는 반복적으로 참조해 자연스럽게 체화해 보세요.

이렇게 정리해 두면 낯선 문법을 만났을 때도 맥락을 빠르게 복구할 수 있습니다.

기호를 매크로, 패턴, 타입과 바운드, 그 밖의 표현식 순서로 분류하고 경로는 모든 문맥을 가로지르는 보조판에서 확인하는 의사결정 흐름

Rust · symbol context · flowchart

기호 모양보다 먼저 문법 위치를 좁힌다

매크로, 패턴, 타입·바운드를 차례로 확인하고 나머지를 표현식으로 읽습니다. 경로는 독립된 다섯 번째 문맥이 아니라 이 여러 위치를 가로지르므로 ::와 qualified path를 별도 보조판에서 확인합니다.

Rust 기호 문맥 분류 흐름 기호를 발견하면 먼저 매크로 호출이나 규칙인지, 다음으로 패턴 위치인지, 다음으로 타입이나 바운드 위치인지 판단하고, 모두 아니면 표현식으로 읽는다. 경로는 이 네 결과 어디에나 나타날 수 있어 crate:: 현재 크레이트 경로, 명시적 외부 크레이트 경로, turbofish, qualified path를 별도로 대조한다. yes no yes no yes no 낯선 기호 발견 토큰만 떼어 읽지 않기 매크로 위치인가? invocation · macro_rules! 매크로 문법으로 읽기 ! · $ · => · repetition 패턴 위치인가? match · let · parameter 값의 모양 맞추기 _ · @ · | · .. 타입·바운드 위치인가? type · generic · bound 타입 관계 설명 &T · Vec<T> · T: U + 'a 표현식으로 읽기 &expr · *expr · expr? 횡단 보조판 · 경로는 한 문맥이 아니다 :: segment · crate:: current crate · ::crate_name explicit crate method::<T> turbofish · <T as Trait>::item qualified path
context first macro → pattern → type/bound → expression
  1. 매크로 호출·규칙인가?

    ident!(...), macro_rules! 안에서는 !, $, =>, 반복 기호를 매크로 문법으로 읽습니다.

  2. 패턴 위치인가?

    match, let, 함수 매개변수에서는 _, @, |, ..가 값을 계산하지 않고 모양을 맞춥니다.

  3. 타입·바운드 위치인가?

    &T, Vec<T>, T: Trait + 'a처럼 값이 아니라 타입과 제약을 설명합니다.

  4. 그 밖에는 표현식으로 읽는다

    &expr, *expr, expr?, 산술·비교·호출·인덱싱처럼 값을 계산하거나 place를 가리키는지 확인합니다.

cross-cutting path

::는 네 분기를 가로지른다

crate::는 현재 크레이트, ::crate_name은 명시적 크레이트 경로, method::<T>는 표현식의 turbofish, <T as Trait>::item은 qualified path입니다.

위치를 좁힌 뒤 다음 표에서 같은 기호의 의미와 오버로드 범위를 대조합니다. 경로의 시작 규칙은 에디션에 따라 차이가 있으므로 현재 Rust에서는 crate::::crate_name을 구분합니다.


부록 B: 연산자와 기호

Rust의 주요 기호를 표현식, 타입과 바운드, 패턴, 경로, 매크로 문맥에서 비교하고 각 의미의 오버로드 가능 범위를 구분한 표

Rust · symbols · semantic table

같은 기호도 문맥과 오버로드 범위가 다르다

먼저 문법 위치를 고정하고, 그 위치의 의미만 읽습니다. 한 기호의 특정 연산이 트레이트로 오버로드되더라도 타입·패턴·매크로에서 같은 모양이 자동으로 오버로드되는 것은 아닙니다.

기호 × 문맥 × 의미 × 오버로드 범위
기호 대표 문맥 문맥별 의미 오버로드
& &expr; &T; 참조 패턴; a & b 빌림을 만들거나 참조 타입·참조 패턴을 나타내고, 이항 위치에서는 비트 AND를 계산합니다. a & bBitAnd; 빌림·타입·패턴은 해당 없음
* a * b; *expr; *const T, *mut T 곱셈, 역참조, 원시 포인터 타입을 위치에 따라 구분합니다. 곱셈은 Mul; 비포인터 역참조는 Deref/DerefMut; 포인터 타입 표기는 해당 없음
.. 범위 표현식; 구조체 업데이트; 튜플·구조체 패턴의 나머지 범위를 구성하거나 남은 필드를 채우거나, 패턴에서 나머지를 무시합니다. 범위·rest 자체는 직접 오버로드하지 않음; 컬렉션 인덱싱은 Index/IndexMut
! !expr; ident!(...); 타입 ! 비트·논리 NOT, 매크로 호출, 반환하지 않는 never 타입이라는 서로 다른 역할입니다. prefix NOT은 Not; 매크로 호출·never 타입은 해당 없음
? expr?; T: ?Sized; 매크로 반복 $(...)? 계속값을 꺼내거나 residual을 호출자에게 반환하고, 암시적 Sized 바운드를 완화하거나, 매크로 반복을 0회 또는 1회로 지정합니다. expr?Try 기반이며 Result/Option이 대표적; stable 사용자 Try 구현을 오버로드 수단으로 간주하지 않음
_ 패턴; 타입 추론 자리; 구조분해 discard; 숫자 리터럴 값을 바인딩하지 않는 wildcard, 추론할 타입 자리, 구조분해 대입 왼쪽에서 값을 버리는 자리, 읽기 쉬운 숫자 구분자로 쓰입니다. 해당 없음
:: 경로 세그먼트; method::<T>; <T as Trait>::item crate::는 현재 크레이트, ::crate_name은 명시적 크레이트 경로이며, 표현식의 generic 인수와 qualified path도 구분합니다. 해당 없음
<...> / ::<...> Vec<u8>; parse::<i32>(); qualified path 타입 위치에서는 generic 인수, 표현식에서는 turbofish, <T as Trait>에서는 연관 아이템 경로를 명확히 합니다. 구분 기호는 해당 없음; 비교 연산자 </>로 쓰일 때는 PartialOrd
: / + T: U + 'a; 타입 표기; 구조체 필드; 루프 라벨; a + b 바운드와 라이프타임을 조합하고, 타입·필드·라벨을 구분하며, 표현식에서는 덧셈을 수행합니다. 표현식의 +Add; 바운드 결합과 콜론 문법은 해당 없음
=> pat => expr; macro_rules! 규칙 match arm에서 패턴과 결과를, 선언형 매크로에서 matcher와 transcriber를 구분합니다. 해당 없음

오버로드가 가능한 부분만 좁혀 읽기

&, *, !, +는 특정 표현식 연산에서만 트레이트와 연결됩니다. 같은 기호의 타입·패턴·매크로 역할은 별도 문법입니다.

컴파일러 진단으로 최종 문맥 확인

기호 후보가 둘 이상이면 피연산자 타입, 기대 타입, 이름이 해석된 경로를 진단과 함께 확인해 의미를 확정합니다.

이 비교표는 본문의 전체 연산자·기호 색인을 대체하지 않습니다. 낯선 기호를 발견했을 때 어느 표와 Reference 절로 이동할지 빠르게 좁히는 판독판입니다.

이 부록은 연산자와 기호를 컨텍스트별로 모아둔 러스트 문법 용어집입니다.

경로, 제네릭, 트레이트 바운드, 매크로, 속성, 주석, 튜플, 괄호 문맥에서 자주 만나는 항목을 빠르게 찾을 수 있게 구성했습니다.

연산자

표 B-1은 러스트 연산자의 등장 문맥, 간단한 설명, 그리고 오버로드 가능 여부를 함께 제공합니다.

오버로드가 가능한 연산자에는 필요한 트레이트도 같이 적어 두었습니다.

표 B-1: 연산자
연산자예시설명오버로드 가능
!ident!(...), ident!{...}, ident![...]매크로 전개
!!expr비트 단위 혹은 논리적 보수Not
!=expr != expr불일치 비교PartialEq
%expr % expr나머지 연산Rem
%=var %= expr나머지 연산 후 대입RemAssign
&&expr, &mut expr대여
&&type, &mut type, &'a type, &'a mut type대여 포인터 타입
&expr & expr비트 단위 ANDBitAnd
&=var &= expr비트 단위 AND 후 대입BitAndAssign
&&expr && expr논리적 AND
*expr * expr산술 곱셈Mul
*=var *= expr산술 곱셈 후 대입MulAssign
**expr역참조Deref
**const type, *mut type원시 포인터
+trait + trait, 'a + trait타입 제약 조건 조합
+expr + expr산술 덧셈Add
+=var += expr산술 덧셈 후 대입AddAssign
,expr, expr인수 및 요소 구분자
-- expr산술 부정 연산Neg
-expr - expr산술 뺄셈Sub
-=var -= expr산술 뺄셈 후 대입SubAssign
->fn(...) -> type, |...| -> type함수 및 클로저 반환 타입
.expr.ident멤버 접근
...., expr.., ..expr, expr..expr상한 배제 범위 리터럴PartialOrd
..=..=expr, expr..=expr상한 포함 범위 리터럴PartialOrd
....expr구조체 리터럴 업데이트 문법
..variant(x, ..), struct_type { x, .. }‘나머지’ 패턴 바인딩
...expr...expr(사용 중단됨, 대신 ..=를 사용) 패턴 내에서: 경계를 포함하는 범위 패턴
/expr / expr산술 나눗셈Div
/=var /= expr산술 나눗셈 후 대입DivAssign
:pat: type, ident: type제약
:ident: expr구조체 필드 초기화
:'a: loop {...}루프 라벨
;expr;구문 및 아이템 종결자
;[...; len]고정 크기 배열 문법의 일부분
<<expr << expr좌측 쉬프트Shl
<<=var <<= expr좌측 쉬프트 후 대입ShlAssign
<expr < expr미만 비교PartialOrd
<=expr <= expr이하 비교PartialOrd
=var = expr, ident = type대입/동등성
==expr == expr일치 비교PartialEq
=>pat => expr매치 갈래 문법의 일부분
>expr > expr초과 비교PartialOrd
>=expr >= expr이상 비교PartialOrd
>>expr >> expr우측 쉬프트Shr
>>=var >>= expr우측 쉬프트 후 대입ShrAssign
@ident @ pat패턴 바인딩
^expr ^ expr비트 단위 배타적 ORBitXor
^=var ^= expr비트 단위 배타적 OR 후 대입BitXorAssign
|pat | pat다중 패턴
|expr | expr비트 단위 ORBitOr
|=var |= expr비트 단위 OR 후 대입BitOrAssign
||expr || expr논리적 OR
?expr?에러 전파

비연산자 기호

다음 목록에는 연산자로 동작하지 않는 모든 기호를 수록했습니다; 즉, 이 기호들은 함수 또는 메서드 호출처럼 동작하지 않습니다.

표 B-2는 자체적으로 나타나는 기호들을 보여주며, 다양한 위치에서 유효합니다.

표 B-2: 독립형 문법
기호설명
'ident기명 라이프타임 혹은 루프 라벨
...u8, ...i32, ...f64, ...usize, etc.특정 타입의 수치 값 리터럴
"..."문자열 리터럴
r"...", r#"..."#, r##"..."##, etc.이스케이프 문자가 처리되지 않는 원시 문자열 리터럴
b"..."바이트 문자열 리터럴; 문자열 대신 바이트 배열 구성하기
br"...", br#"..."#, br##"..."##, etc.원시 바이트 문자열 리터럴, 원시 문자열과 바이트 문자열 리터럴의 조합
'...'문자 리터럴
b'...'ASCII 바이트 리터럴
|...| expr클로저
!발산 함수를 위한 항상 비어있는 하단 타입
_값을 바인딩하지 않는 wildcard 패턴; 타입 추론 자리; 숫자 리터럴 구분자

표 B-3는 모듈 계층을 통해 아이템에 도달하는 경로의 컨텍스트에서 나타나는 기호들을 보여줍니다.

표 B-3: 경로 관련 문법
기호설명
ident::ident네임스페이스 경로
crate::path현재 크레이트 루트에서 시작하는 경로
::crate_name::pathextern prelude의 크레이트 이름에서 시작하는 명시적 경로
self::path현재 모듈 기준 상대 경로(즉, 명시적인 상대 경로)
super::path현재 모듈의 부모 기준 상대 경로
type::ident, <type as trait>::ident연관 상수, 함수, 타입
<type>::...직접 명명될 수 없는 타입에 대한 연관 아이템(예: <&T>::..., <[T]>::..., 기타 등등.)
trait::method(...)해당 메서드를 정의한 트레이트 이름으로 메서드 호출을 명확하게 하기
type::method(...)해당 메서드가 정의된 타입의 이름으로 메서드 호출을 명확하게 하기
<type as trait>::method(...)트레이트와 타입 이름으로 메서드 호출을 명확하게 하기

표 B-4는 제네릭 타입 매개변수를 사용하는 컨텍스트에서 나타나는 기호들을 보여줍니다.

표 B-4: 제네릭
기호설명
path<...>타입에서 제네릭 타입에 대한 매개변수 지정하기(예: Vec<u8>)
path::<...>, method::<...>표현식에서 제네릭 타입, 함수, 메서드에 대한 매개변수 지정하기; 종종 터보피쉬(turbofish) 라고도 불림(예: "42".parse::<i32>())
fn ident<...> ...제네릭 함수 정의하기
struct ident<...> ...제네릭 구조체 정의하기
enum ident<...> ...제네릭 열거형 정의하기
impl<...> ...제네릭 구현체 정의하기
for<...> type고랭크 트레이트 바운드(HRTB)
type<ident=type>하나 이상의 연관 타입이 특정한 인수를 갖는 제네릭 타입(예: Iterator<Item=T>)

표 B-5는 트레이트 바운드를 사용하여 제네릭 타입 매개변수를 제한하는 컨텍스트에서 나타나는 기호들을 보여줍니다.

표 B-5: 트레이트 바운드 제약 조건
기호설명
T: U제네릭 매개변수 TU를 구현하는 타입으로 제한됨
T: 'a제네릭 타입 T'a보다 긴 라이프타임을 가져야 함(즉 해당 타입은 일시적으로 'a보다 짧은 라이프타임을 가진 어떤 참조자도 가질 수 없습니다)
T: 'static제네릭 타입 T'static 이외의 빌린 참조자를 포함하지 않음
'b: 'a제네릭 라이프타임 'b'a보다 긴 라이프타임을 가져야 함
T: ?Sized제네릭 타입 매개변수에 동적 크기 타입 사용이 가능하도록 허용하기
'a + trait, trait + trait타입 제약 조건 조합

표 B-6은 매크로를 호출하거나 정의하는 컨텍스트 및 아이템에 속성을 지정하는 컨텍스트에서 나타나는 기호들을 보여줍니다.

표 B-6: 매크로와 속성
기호설명
#[meta]외부 속성
#![meta]내부 속성
$ident매크로 치환
$ident:kind매크로 캡처
$(…)…매크로 반복
ident!(...), ident!{...}, ident![...]매크로 호출

표 B-7은 주석을 생성하는 기호들을 보여줍니다.

표 B-7: 주석
기호설명
//한 줄 주석
//!내부 한 줄 문서화 주석
///외부 한 줄 문서화 주석
/*...*/블록 주석
/*!...*/내부 블록 문서화 주석
/**...*/외부 블록 문서화 주석

표 B-8은 튜플을 사용하는 컨텍스트에서 나타나는 기호들을 보여줍니다.

표 B-8: 튜플
기호설명
()빈 튜플(일명 유닛), 리터럴이자 타입
(expr)괄호로 묶인 표현식
(expr,)단일 요소 튜플 표현식
(type,)단일 요소 튜플 타입
(expr, ...)튜플 표현식
(type, ...)튜플 타입
expr(expr, ...)함수 호출 표현식; 튜플 struct와 튜플 enum 배리언트의 초기화에도 사용됨
expr.0, expr.1, etc.튜플 인덱싱

표 B-9는 중괄호를 사용하는 컨텍스트를 보여줍니다.

표 B-9: 중괄호
컨텍스트설명
{...}블록 표현식
Type {...}struct 리터럴

표 B-10은 대괄호를 사용하는 컨텍스트를 보여줍니다.

표 B-10: 대괄호
컨텍스트설명
[...]배열 리터럴
[expr; len]expr 값을 len개 복사한 배열 리터럴
[type; len]type의 인스턴스를 len개만큼 담는 배열 타입
expr[expr]컬렉션 인덱싱. 오버로드 가능(Index, IndexMut)
expr[..], expr[a..], expr[..b], expr[a..b]컬렉션 슬라이싱 모양의 컬렉션 인덱싱. ‘인덱스’로 Range, RangeFrom, RangeTo, 혹은 RangeFull 사용

연산자와 기호 부록은 낯선 문법을 만났을 때 표현식, 타입·바운드, 패턴, 경로, 매크로 맥락으로 빠르게 되돌아가는 색인입니다.