콘텐츠로 이동

Rust 불리언

불리언(boolean)은 가장 단순한 타입이에요. 값은 true(참) 아니면 false(거짓), 딱 두 가지뿐이에요. Rust에서는 bool이라고 부르고, 코드에서 무언가를 결정해야 하는 곳이라면 어디서든 쓰게 돼요.

fn main() {
let is_active = true;
let has_error: bool = false;
println!("활성: {is_active}, 에러: {has_error}");
}
▶ 직접 실행해 보기

Rust는 true나 false를 보고 거의 항상 bool 타입을 스스로 추론해요. 그래서 타입을 직접 적어 줄 일은 별로 없어요.

불리언은 보통 비교에서 나와요

섹션 제목: “불리언은 보통 비교에서 나와요”

실제 코드에서 true나 false를 직접 적는 일은 생각보다 드물어요. 대부분은 무언가를 비교한 결과로 만들어져요.

fn main() {
let age = 20;
let can_vote = age >= 18;
println!("투표 가능: {can_vote}");
}

실행 결과:

투표 가능: true
▶ 직접 실행해 보기

bool의 가장 중요한 역할은 if의 어느 쪽 분기를 실행할지 정하는 거예요.

fn main() {
let is_raining = true;
if is_raining {
println!("우산을 챙기세요");
} else {
println!("우산은 두고 가도 돼요");
}
}

if는 if…else 페이지에서 제대로 다뤄요. 여기서는 불리언이 왜 중요한지 맛만 보는 거예요.

&&(그리고), ||(또는), !(아님)은 연산자 페이지에서 이미 만나 봤어요. 여기에 하나만 더 알아 두면 좋아요. 이 연산자들은 답이 이미 정해지면 중간에 멈춰요. 이것을 단락 평가(short-circuit evaluation)라고 해요.

  • a && b에서 a가 false라면 전체 결과는 무조건 false예요. 그래서 Rust는 b를 아예 보지 않아요.
  • a || b에서 a가 true라면 전체 결과는 무조건 true예요. 그래서 Rust는 b를 아예 보지 않아요.

이건 단순히 속도를 위한 요령이 아니에요. 왼쪽 조건이 오른쪽 조건을 보호해 줄 수 있어요.

fn main() {
let count = 0;
let total = 50;
// count가 0이므로 Rust는 `count != 0`에서 멈추고 나눗셈을 하지 않아요.
let big_average = count != 0 && total / count > 10;
println!("평균이 큰가요: {big_average}");
let is_weekend = true;
let has_homework = true;
// is_weekend가 true이므로 `!has_homework`는 확인하지 않아요.
let can_relax = is_weekend || !has_homework;
println!("쉴 수 있나요: {can_relax}");
}

실행 결과:

평균이 큰가요: false
쉴 수 있나요: true
▶ 직접 실행해 보기

0으로 나누면 프로그램이 멈춰 버려요. 하지만 count != 0이 먼저 오고 그 값이 false이기 때문에 나눗셈은 아예 실행되지 않아요. 두 쪽의 순서를 바꾸면(total / count > 10 && count != 0) 나눗셈이 먼저 실행돼요. 이 예제에서는 컴파일러가 이를 알아채고 빌드를 거부해요(“this operation will panic at runtime”, 즉 실행하면 패닉이 일어난다는 뜻이에요). 하지만 값이 프로그램 실행 중에야 정해진다면 그대로 프로그램이 멈추게 돼요. 그러니 “안전 확인” 조건은 항상 왼쪽에 두세요.

어떤 놀이기구는 키가 120 cm 이상이거나, 또는 나이가 8살 이상이면서 그리고 어른과 함께 타면 탈 수 있어요. 키 115, 나이 9, with_adult = true를 저장하고, 이 아이가 탈 수 있는지 출력해 보세요. 힌트: “나이와 어른” 부분은 괄호로 묶어 주세요.

정답 보기
fn main() {
let height_cm = 115;
let age = 9;
let with_adult = true;
let tall_enough = height_cm >= 120;
let can_ride = tall_enough || (age >= 8 && with_adult);
println!("키가 충분한가요: {tall_enough}");
println!("탈 수 있나요: {can_ride}");
}

실행 결과:

키가 충분한가요: false
탈 수 있나요: true
▶ 직접 실행해 보기

어떤 해가 4로 나누어떨어지지만 100으로는 나누어떨어지지 않거나, 또는 400으로 나누어떨어지면 윤년이에요. 2024에 대해 불리언 is_leap을 계산해서 출력하고, 1900에 대해서도 똑같이 해 보세요. 힌트: “4로 나누어떨어진다”는 year % 4 == 0이에요. 그리고 두 번째 let으로 year와 is_leap을 섀도잉할 수 있어요.

정답 보기
fn main() {
let year = 2024;
let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
println!("{year}년은 윤년인가요: {is_leap}");
let year = 1900;
let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
println!("{year}년은 윤년인가요: {is_leap}");
}

실행 결과:

2024년은 윤년인가요: true
1900년은 윤년인가요: false
▶ 직접 실행해 보기
  • bool은 true 또는 false, 딱 두 가지 값만 가져요.
  • 비교 연산(==, <, >=, …)은 불리언을 만들어요.
  • if의 조건은 진짜 bool이어야 해요. 숫자나 문자열이 자동으로 변환되지 않아요.
  • &&와 ||는 단락 평가를 해요. 답이 정해지면 오른쪽을 건너뛰니까, 안전 확인은 왼쪽에 두세요.

이해도 점검

1. age >= 18 같은 비교는 어떤 타입의 값을 만드나요?

2. 다른 몇몇 언어처럼, Rust에서도 0 같은 정수를 if의 조건으로 바로 쓸 수 있나요?

3. count != 0 && total / count > 10에서 count가 0이면 어떻게 되나요?

점수: 0 / 3