불리언 타입
불리언 타입
참과 거짓, 둘 중 하나만 표현하고 싶을 때가 있어요. Rust에서는 그럴 때 불리언 타입(boolean type), 줄여서 bool을 사용해요. 이 타입은 true와 false라는 두 값 중 하나를 가질 수 있는 기본 데이터 타입(primitive data type) 이야.
출처: Rust Reference
본문
#![allow(unused)]
fn main() {
let b: bool = true;
}
bool 타입의 값은 true와 false 키워드를 쓰는 리터럴 표현식(literal expression) 으로 만들 수 있어요. 이름에서도 드러나듯 각 키워드는 같은 이름의 값에 대응해요.
이 타입은 언어 프렐류드(prelude) 의 일부로 bool이라는 이름으로 등록되어 있어요. 그래서 따로 가져오지 않아도 바로 쓸 수 있죠.
메모리 관점에서 보면, 불리언 타입을 가진 객체는 크기(size)와 정렬(alignment)이 각각 1이에요. 값의 비트 패턴도 정해져 있는데, false는 0x00, true는 0x01이에요. 그리고 불리언 타입의 객체가 이 외의 다른 비트 패턴을 갖는 것은 정의되지 않은 동작(undefined behavior) 이에요.
불리언 타입은 여러 표현식에서 다양한 피연산자(operand) 의 타입으로 쓰여요. 대표적으로 두 경우가 있어요.
if표현식과while표현식의 조건(condition) 피연산자- 지연 불리언 연산자(lazy boolean operator) 표현식의 피연산자
여기서 한 가지 짚고 넘어갈 점이 있어요. 불리언 타입은 열거형과 비슷하게 생겼지만 열거형은 아니에요. 실제로는 그게 무슨 의미냐면, 타입에 생성자(constructor)가 붙지 않는다는 거예요. 예를 들어 bool::true 같은 건 쓸 수 없다는 뜻이죠.
모든 기본 타입이 그렇듯, 불리언 타입도 Clone, Copy, Sized, Send, Sync 트레이트를 구현해요. 라이브러리 연산에 대한 더 자세한 내용은 표준 라이브러리 문서를 참고하면 돼요.
불리언 값에 대한 연산
특정 연산자 표현식을 불리언 타입의 피연산자와 함께 쓰면, 그 연산들은 불리언 논리(boolean logic) 의 규칙에 따라 평가돼요.
논리 NOT — !b
| b | !b |
|---|---|
| true | false |
| false | true |
논리 OR — a | b
| a | b | a | b |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
논리 AND — a & b
| a | b | a & b |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
논리 XOR — a ^ b
| a | b | a ^ b |
|---|---|---|
| true | true | false |
| true | false | true |
| false | true | true |
| false | false | false |
비교 — a == b
| a | b | a == b |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | true |
그리고 몇 가지 비교 연산은 다른 연산으로 환원해서 생각할 수 있어요.
a != b는!(a == b)와 같아요.a >= b는a == b | a > b와 같아요.a < b는!(a >= b)와 같아요.a <= b는a == b | a < b와 같아요.
비트 유효성 (Bit validity)
bool의 한 바이트는 항상 초기화됨이 보장돼요. 다시 말해 transmute::<bool, u8>(...)는 항상 sound(안전) 해요. 다만 일부 비트 패턴은 유효한 bool이 아니기 때문에, 그 역방향(u8 → bool)이 항상 sound한 것은 아니라는 점만 주의하면 돼요.
더 알아보기 (Learn more)
- Rust Reference - Boolean type — 본문 원문
- 러스트 표준 라이브러리 - bool — 불리언 타입의 라이브러리 연산