불리언 타입

불리언 타입

참과 거짓, 둘 중 하나만 표현하고 싶을 때가 있어요. Rust에서는 그럴 때 불리언 타입(boolean type), 줄여서 bool을 사용해요. 이 타입은 truefalse라는 두 값 중 하나를 가질 수 있는 기본 데이터 타입(primitive data type) 이야.

출처: Rust Reference

본문

#![allow(unused)]
fn main() {
let b: bool = true;
}

bool 타입의 값은 truefalse 키워드를 쓰는 리터럴 표현식(literal expression) 으로 만들 수 있어요. 이름에서도 드러나듯 각 키워드는 같은 이름의 값에 대응해요.

이 타입은 언어 프렐류드(prelude) 의 일부로 bool이라는 이름으로 등록되어 있어요. 그래서 따로 가져오지 않아도 바로 쓸 수 있죠.

메모리 관점에서 보면, 불리언 타입을 가진 객체는 크기(size)와 정렬(alignment)이 각각 1이에요. 값의 비트 패턴도 정해져 있는데, false0x00, true0x01이에요. 그리고 불리언 타입의 객체가 이 외의 다른 비트 패턴을 갖는 것은 정의되지 않은 동작(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

논리 ORa | b

a b a | b
true true true
true false true
false true true
false false false

논리 ANDa & b

a b a & b
true true true
true false false
false true false
false false false

논리 XORa ^ 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 >= ba == b | a > b와 같아요.
  • a < b!(a >= b)와 같아요.
  • a <= ba == b | a < b와 같아요.

비트 유효성 (Bit validity)

bool의 한 바이트는 항상 초기화됨이 보장돼요. 다시 말해 transmute::<bool, u8>(...)는 항상 sound(안전) 해요. 다만 일부 비트 패턴은 유효한 bool이 아니기 때문에, 그 역방향(u8bool)이 항상 sound한 것은 아니라는 점만 주의하면 돼요.

더 알아보기 (Learn more)