부록 B: 연산자와 기호

부록 B: 연산자와 기호

Rust 문법을 이루는 연산자와 기호를 한 장의 용어집으로 모아봤어요. 코드를 읽다가 낯선 기호를 만나면 여기서 바로 찾아보면 돼요. 연산자 표 하나와, 연산자가 아닌 기호들을 문맥별로 묶은 표 여러 개로 구성되어 있어요.

출처: Rust 공식문서

본문

이 부록에는 Rust 문법 전체를 한눈에 정리한 용어집이 들어 있어요. 연산자는 물론이고, 경로(path), 제네릭, 트레잇 바운드, 매크로, 속성, 주석, 튜플, 괄호 같은 문맥 안에서 따로 또는 함께 등장하는 기호들을 전부 다뤄요. 코드를 읽다가 '이 기호가 뭐지?' 싶을 때 찾아보면 되는 참고용 장이라고 생각하면 돼요.

연산자 (Operators)

표 B-1: 연산자

표 B-1에는 Rust의 연산자들이 정리되어 있어요. 연산자가 실제 코드에서 어떻게 쓰이는지에 대한 예시, 짧은 설명, 그리고 오버로드(연산자 재정의)가 가능한지가 함께 나와요. 오버로드가 가능한 연산자라면, 그 연산자를 오버로드할 때 쓰는 트레잇도 같이 알려줘요.

Table B-1: Operators

연산자 예시 설명 오버로드 가능?
! ident!(...), ident!{...}, ident![...] 매크로 확장이에요. 이름 뒤에 !를 붙여서 매크로를 불러요.
! !expr 비트 반전 또는 논리 부정이에요. 값을 뒤집는 연산이에요. Not
!= expr != expr 같지 않은지를 비교해요. != 좌우가 다르면 true를 돌려줘요. PartialEq
% expr % expr 산술 나머지 연산이에요. 나눗셈의 나머지를 구해요. Rem
%= var %= expr 나머지를 구해서 그 값을 다시 변수에 담아줘요. RemAssign
& &expr, &mut expr 빌림(참조)이에요. &를 붙이면 값을 빌려오는 거예요.
& &type, &mut type, &'a type, &'a mut type 빌림 포인터 타입이에요. &type, &mut type 같은 참조형 타입을 말해요.
& expr & expr 비트 단위 AND 연산이에요. BitAnd
&= var &= expr 비트 AND를 계산해 다시 변수에 담아줘요. BitAndAssign
&& expr && expr 단락 평가 논리 AND예요. 앞이 false면 뒤는 계산하지 않아요.
* expr * expr 산술 곱셈 연산이에요. Mul
*= var *= expr 곱셈을 계산해 다시 변수에 담아줘요. MulAssign
* *expr 역참조예요. 참조가 가리키는 실제 값을 꺼내요. Deref
* *const type, *mut type 원시 포인터 타입이에요. *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.ident(expr, ...) 메서드 호출이에요. 점 뒤에 함수를 호출해요.
. expr.0, expr.1, and so on 튜플 인덱싱이에요. 튜플의 n번째 요소를 .n으로 꺼내요.
.. .., expr.., ..expr, expr..expr 오른쪽이 배타적인 범위 리터럴이에요. .. 끝 값은 포함하지 않아요. PartialOrd
..= ..=expr, expr..=expr 오른쪽이 포함되는 범위 리터럴이에요. ..= 끝 값까지 포함해요. PartialOrd
.. ..expr 구조체 리터럴 업데이트 문법이에요. ..expr로 나머지 필드를 같은 값으로 채워요.
.. variant(x, ..), struct_type { x, .. } '그 나머지'를 바인딩하는 패턴이에요. 나머지 필드를 ..로 묶어요.
... expr...expr (더 이상 안 쓰는 문법. ..=를 쓰세요) 패턴 안에서의 포함 범위 패턴이에요.
/ expr / expr 산술 나눗셈 연산이에요. Div
/= var /= expr 나눗셈을 계산해 다시 변수에 담아줘요. DivAssign
: pat: type, ident: type 제약이에요. 패턴이나 식별자에 타입/라이프타임을 붙일 때 써요.
: ident: expr 구조체 필드 초기화예요. 필드 이름: 값 형태로 초기화해줘요.
: 'a: loop {...} 루프 라벨이에요. 라벨을 붙여서 중첩 루프를 특정할 수 있어요.
; expr; 문장과 아이템 마무리 세미콜론이에요.
; [...; len] 고정 크기 배열 문법의 일부예요. [...; len] 형태로 길이를 지정해요.
<< expr << expr 왼쪽 시프트 연산이에요. 비트를 왼쪽으로 밀어요. Shl
<<= var <<= expr 왼쪽 시프트 후 다시 변수에 담아줘요. ShlAssign
< expr < expr 보다 작은지 비교해요. PartialOrd
<= expr <= expr 작거나 같은지 비교해요. PartialOrd
= var = expr, ident = type 할당/동치예요. 값을 넣거나 타입 동치를 표시해요.
== expr == expr 같은지 비교해요. PartialEq
=> pat => expr match 분기 문법의 일부예요. 패턴 => 실행식 형태로 써요.
> expr > expr 보다 큰지 비교해요. PartialOrd
>= expr >= expr 크거나 같은지 비교해요. PartialOrd
>> expr >> expr 오른쪽 시프트 연산이에요. 비트를 오른쪽으로 밀어요. Shr
>>= var >>= expr 오른쪽 시프트 후 다시 변수에 담아줘요. ShrAssign
@ ident @ pat 패턴 바인딩이에요. ident @ pat로 매칭된 부분을 이름으로 묶어요.
^ expr ^ expr 비트 단위 배타적 OR(XOR) 연산이에요. BitXor
^= var ^= expr 비트 XOR을 계산해 다시 변수에 담아줘요. BitXorAssign
| pat | pat 패턴 대안이에요. |로 여러 패턴 중 하나에 매칭해요.
| expr | expr 비트 단위 OR 연산이에요. BitOr
|= var |= expr 비트 OR을 계산해 다시 변수에 담아줘요. BitOrAssign
|| expr || expr 단락 평가 논리 OR이에요. 앞이 true면 뒤는 계산하지 않아요.
? expr? 에러 전파예요. ?를 붙이면 실패 시 호출부로 에러를 올려보내요.

연산자가 아닌 기호 (Non-operator Symbols)

아래 표들은 연산자로서 기능하지 않는 기호들을 모아놓은 거예요. 다시 말해 함수나 메서드 호출처럼 동작하지 않는 기호들이에요.

표 B-2: 단독 문법

표 B-2는 단독으로 등장하면서 여러 위치에서 쓰일 수 있는 기호들이에요.

Table B-2: Stand-alone Syntax

기호 설명
'ident 이름 붙은 라이프타임이나 루프 라벨이에요.
Digits immediately followed by u8, i32, f64, usize, and so on 특정 타입의 숫자 리터럴이에요. u8, i32 같은 타입 접미사를 붙여요.
"..." 문자열 리터럴이에요.
r"...", r#"..."#, r##"..."##, and so on 원시 문자열 리터럴이에요. 이스케이프 문자를 처리하지 않아요.
b"..." 바이트 문자열 리터럴이에요. 문자열 대신 바이트 배열을 만들어요.
br"...", br#"..."#, br##"..."##, and so on 원시 바이트 문자열 리터럴이에요. 원시 + 바이트 문자열의 조합이에요.
'...' 문자 리터럴이에요.
b'...' ASCII 바이트 리터럴이에요.
|…| expr 클로저예요. |인자| 형태로 익명 함수를 만들어요.
! 발산 함수의 바닥 타입이에요. 절대 값이 없는 타입이에요.
_ '무시' 패턴 바인딩이에요. 값 대신 _를 써서 무시하고, 숫자 리터럴을 읽기 좋게 하는 데도 써요.

표 B-3: 경로 관련 문법

표 B-3은 모듈 계층 구조를 따라 어떤 아이템까지 이어지는 경로(path) 문맥에서 등장하는 기호들이에요.

Table B-3: Path-Related Syntax

기호 설명
ident::ident 네임스페이스 경로예요. 모듈 안의 아이템을 ::로 가리켜요.
::path 크레이트 루트 기준 경로예요. 명시적으로 절대 경로를 나타내요.
self::path 현재 모듈 기준 경로예요. 명시적으로 상대 경로를 나타내요.
super::path 현재 모듈의 부모 기준 경로예요.
type::ident, ::ident 연관 상수, 함수, 타입이에요. 타입에 묶여 있는 아이템들을 가리켜요.
::... 직접 이름을 못 붙이는 타입의 연관 아이템이에요. <&T>::... 같은 형태로 써요.
trait::method(...) method를 정의한 트레잇을 명시해서 호출을 구분해요.
type::method(...) method가 정의된 타입을 명시해서 호출을 구분해요.
::method(...) 트레잇과 타입을 함께 명시해서 호출을 구분해요.

표 B-4: 제네릭

표 B-4는 제네릭 타입 매개변수를 쓸 때 등장하는 기호들이에요.

Table B-4: Generics

기호 설명
path<...> 타입에 제네릭 인자를 지정해요. Vec 처럼 써요.
path::<...>, method::<...> 표현식에서 제네릭 타입/함수/메서드의 인자를 지정해요. 보통 터보피시라고 불러요.
fn ident<...> ... 제네릭 함수를 정의해요.
struct ident<...> ... 제네릭 구조체를 정의해요.
enum ident<...> ... 제네릭 열거형을 정의해요.
impl<...> ... 제네릭 구현을 정의해요.
for<...> type 더 높은 등급(HRTB)의 라이프타임 제약이에요.
type<ident=type> 연관 타입에 특정 할당이 있는 제네릭 타입이에요. Iterator<Item=T>처럼 써요.

표 B-5: 트레잇 바운드 제약

표 B-5는 제네릭 타입 매개변수를 트레잇 바운드로 제약할 때 등장하는 기호들이에요.

Table B-5: Trait Bound Constraints

기호 설명
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은 매크로를 호출하거나 정의할 때, 그리고 아이템에 속성을 지정할 때 등장하는 기호들이에요.

Table B-6: Macros and Attributes

기호 설명
#[meta] 바깥쪽 속성이에요. 아이템 밖에 붙는 #[...] 형태예요.
#![meta] 안쪽 속성이에요. 아이템 안에 붙는 #![...] 형태예요.
$ident 매크로 치환이에요. $ident로 매크로에서 받은 값을 넣어요.
$ident:kind 매크로 메타변수예요. $ident:kind 형태로 인자 종류를 지정해요.
$(...)... 매크로 반복이에요. $(...)...로 패턴을 반복해요.
ident!(...), ident!{...}, ident![...] 매크로 호출이에요. 이름 뒤에 !를 붙여 호출해요.

표 B-7: 주석

표 B-7은 주석을 만드는 기호들이에요.

Table B-7: Comments

기호 설명
// 한 줄 주석이에요.
//! 안쪽 한 줄 문서 주석이에요.
/// 바깥쪽 한 줄 문서 주석이에요.
/.../ 블록 주석이에요.
/!.../ 안쪽 블록 문서 주석이에요.
/**...*/ 바깥쪽 블록 문서 주석이에요.

표 B-8: 소괄호 ( )

표 B-8는 소괄호 ( )가 쓰이는 여러 문맥이에요.

Table B-8: Parentheses

기호 설명
() 빈 튜플(유닛)이에요. 리터럴이자 타입이에요.
(expr) 괄호로 감싼 표현식이에요. 우선순위를 조절해요.
(expr,) 요소 하나짜리 튜플 표현식이에요.
(type,) 요소 하나짜리 튜플 타입이에요.
(expr, ...) 튜플 표현식이에요.
(type, ...) 튜플 타입이에요.
expr(expr, ...) 함수 호출 표현식이에요. 튜플 구조체와 튜플 enum 변형 초기화에도 써요.

표 B-9: 중괄호 { }

표 B-9는 중괄호 { }가 쓰이는 여러 문맥이에요.

Table B-9: Curly Brackets

문맥 설명
{...} 블록 표현식이에요. 문장들을 묶는 중괄호 블록이에요.
Type {...} 구조체 리터럴이에요. Type { ... } 형태로 구조체를 만들어요.

표 B-10: 대괄호 [ ]

표 B-10은 대괄호 [ ]가 쓰이는 여러 문맥이에요.

Table B-10: Square Brackets

문맥 설명
[...] 배열 리터럴이에요.
[expr; len] expr을 len개 담은 배열 리터럴이에요.
[type; len] type을 len개 담은 배열 타입이에요.
expr[expr] 컬렉션 인덱싱이에요. Index, IndexMut로 오버로드할 수 있어요.
expr[..], expr[a..], expr[..b], expr[a..b] 컬렉션 슬라이싱처럼 쓰는 인덱싱이에요. Range, RangeFrom, RangeTo, RangeFull을 '인덱스'로 사용해요.

더 알아보기