B - 연산자와 기호
이 부록은 러스트 문법에서 자주 등장하는 연산자와 기호를 빠르게 확인할 수 있도록 구성되어 있습니다. 문법을 처음 익힐 때는 의미를 알고 넘어가도, 시간이 지나면 세부 기호 문맥이 다시 헷갈리기 쉽습니다. 특히 연산자 오버로딩 가능 여부나 컨텍스트별 의미 차이는 실수로 이어지기 쉬운 지점입니다. 그래서 이 절은 단순 목록이 아니라, 구현/디버깅 시 바로 참조할 수 있는 실전 용어집으로 활용하는 것이 좋습니다. 표를 읽을 때는 문법 의미만 보지 말고, 어떤 트레이트 구현과 연결되는지까지 함께 확인하는 습관이 중요합니다. 이 기준이 잡히면 연산자 오버로딩을 설계할 때 타입 안정성과 의도 일관성을 더 쉽게 유지할 수 있습니다. 필요한 항목만 빠르게 찾아 쓰되, 자주 쓰는 기호는 반복적으로 참조해 자연스럽게 체화해 보세요. 이렇게 정리해 두면 낯선 문법을 만났을 때도 맥락을 빠르게 복구할 수 있습니다.
부록 B: 연산자와 기호
이 부록은 연산자와 기호를 컨텍스트별로 모아둔 러스트 문법 용어집입니다. 경로, 제네릭, 트레이트 바운드, 매크로, 속성, 주석, 튜플, 괄호 문맥에서 자주 만나는 항목을 빠르게 찾을 수 있게 구성했습니다.
연산자
표 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 | 비트 단위 AND | BitAnd |
&= | 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 | 비트 단위 배타적 OR | BitXor |
^= | var ^= expr | 비트 단위 배타적 OR 후 대입 | BitXorAssign |
| | pat | pat | 다중 패턴 | |
| | expr | expr | 비트 단위 OR | BitOr |
|= | 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 | 클로저 |
! | 발산 함수를 위한 항상 비어있는 하단 타입 |
_ | ‘무시되는’ 패턴 바인딩; 정수형 리터럴을 읽기 편하게 만드는 데도 사용됨 |
표 B-3는 모듈 계층을 통해 아이템에 도달하는 경로의 컨텍스트에서 나타나는 기호들을 보여줍니다.
표 B-3: 경로 관련 문법| 기호 | 설명 |
|---|---|
ident::ident | 네임스페이스 경로 |
::path | 크레이트 루트 기준 상대 경로(즉, 명시적인 절대 경로) |
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 | 고수준 라이프타임 바운드 |
type<ident=type> | 하나 이상의 연관 타입이 특정한 인수를 갖는 제네릭 타입(예: Iterator<Item=T>) |
표 B-5는 트레이트 바운드를 사용하여 제네릭 타입 매개변수를 제한하는 컨텍스트에서 나타나는 기호들을 보여줍니다.
표 B-5: 트레이트 바운드 제약 조건| 기호 | 설명 |
|---|---|
T: U | 제네릭 매개변수 T는 U를 구현하는 타입으로 제한됨 |
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 사용 |