부록 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, |
연관 상수, 함수, 타입이에요. 타입에 묶여 있는 아이템들을 가리켜요. |
| 직접 이름을 못 붙이는 타입의 연관 아이템이에요. <&T>::... 같은 형태로 써요. | |
| trait::method(...) | method를 정의한 트레잇을 명시해서 호출을 구분해요. |
| type::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을 '인덱스'로 사용해요. |