Boolean 부울형

Boolean 부울형 데이터타입

  • 참(true) 혹은 거짓(false) 값을 나타내는 Boolean 데이터타입

사용 예시

기본적인 변수 선언

  • 보통 타입을 명시하지 않고, 아래 예시의 첫 번째처럼 선언하여 사용한다.
1
2
3
// bool 변수 선언
let the_true = true;
let the_false : bool = false; // 명시적 타입 어노테이션

연산

bool 논리 연산

  • && : AND 연산
  • || : OR 연산
  • ! : NOT 연산
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// bool 논리 연산

let bool_and = true && false;
let bool_or = true || false;
let bool_not = !true;

println!("AND: {}", bool_and);
>> AND: false

println!("OR: {}", bool_or);
>> OR: true

println!("NOT: {}", bool_not);
>> NOT: false

단락 평가

  • bool 연산은 단락평가(short-circuit evaluation) 을 수행한다.
  • 단락평가란, 두 개 이상의 bool 값을 이용한 논리연산에서 결과가 정해지면, 나머지 연산을 생략하는 것이다.
  • 예를 들어, 거짓인 a 와 참인 b를 AND 연산을 하면, a 만 연산을 하고, b는 연산을 하지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn some_func()-> bool{
	println!("This is some func!!"); // 이 함수가 실행되면 문구 출력
	true // true 값을 반환
}

fn main() {

	/* try 1 */
	let short_circuit_eval = true && some_func();
	println!("short circuit eval : {}", short_circuit_eval);
	// >> This is some func!!
	// >> short circuit eval : true

	/* try 2 */
	let short_circuit_eval = false && some_func();
	println!("short circuit eval : {}", short_circuit_eval);
	// >> short circuit eval : false
}
  • 위 예시를 살펴보자
  • some_func()"This is some func!!"을 출력하고 true를 반환한다.
  • try 1에서는 출력이 발생한 것으로 보아, some_func()가 실행되었다.
  • try 2에서는 출력이 없으므로, 함수가 실행되지 않은 것을 알 수 있다.
  • 이는 AND 연산에서 앞 항이 false면 뒷 항을 평가하지 않기 때문이다.
  • 이에 some_func()는 생략되었고, 출력도 없었던 것이다.

비트 연산

  • boolean 값들도 비트연산이 가능하다.
  • 그 이유는, ture 와 false 가 각각 0b000001, 0b000000 값을 가지기 때문이다.
  • 기본적으로 0과 1의 연산이기 때문에 논리연산과 같은 결과를 가진다.
  • 하지만 분명한 이유가 없다면, 목적에 맞는 연산을 하는 걸 권장한다.
  • 또한 비트 연산은 논리 연산과 달리 단락평가를 하지 않는다는 점을 참고.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// bool 비트 연산
let bool_and = true & false;
let bool_or = true | false;

println!("AND: {}", bool_and);
>> AND: false
// 0b00000001
// 0b00000000
// ---------- AND
// 0b00000000

println!("OR: {}", bool_or);
>> OR: true
// 0b00000001
// 0b00000000
// ---------- OR
// 0b00000001

🔍 Rust에서 bool은 왜 1바이트인가?

✅ 결론 먼저

  • Rust의 bool 타입은 1비트 정보만 필요하지만, 내부적으로는 1바이트(8비트)를 사용함.
  • -> 이는 성능, 메모리 정렬, 안전성 측면에서 의도된 설계이다.

1 바이트에 들어가는 값은?

  • Rust에서 bool 타입은 다음과 같이 값이 정의된다.
의미
false 0x00 (00000000)
true 0x01 (00000001)

왜 1비트가 아닌 1바이트인가?

💡 정렬(alignment) 문제

  • CPU는 보통 1바이트 단위로 메모리를 읽고 씀
  • 만약 여러 개의 bool 값을 1비트씩 저장하려면 비트 단위로 조작해야 함
  • -> 이는 성능과 구현 난이도 측면에서 불리

💡 구조체 패딩(padding) 이슈

  • Rust 구조체에서는 정렬 규칙 때문에 패딩이 자동으로 삽입됨
  • bool이 1바이트 단위여야 다른 필드들과의 정렬도 자연스럽
  • 메모리 낭비를 줄이기 쉬움

💡 안전성(safety)

  • Rust는 명확하고 예측 가능한 동작을 추구함.
  • 만약 bool이 1비트라면, 비트 연산 실수나 포인터 연산에서 문제가 생길 가능성 큼.
  • 1바이트로 고정하면 이런 모호성이 사라짐.

Reference

https://doc.rust-kr.org/ch03-02-data-types.html
https://doc.rust-lang.org/book/

Comments