콘텐츠로 이동

Rust 연산자

연산자(operator)는 계산을 하고, 값을 비교하고, 조건을 조합할 때 쓰는 기호예요. C 계열 언어를 써 본 적이 있다면 대부분 익숙해 보일 거예요.

fn main() {
let a = 10;
let b = 3;
println!("{}", a + b); // 13
println!("{}", a - b); // 7
println!("{}", a * b); // 30
println!("{}", a / b); // 3 (정수 나눗셈, 나머지는 버려요)
println!("{}", a % b); // 1 (나머지)
}
▶ 직접 실행해 보기

비교 연산자는 두 값을 비교해서 bool을 돌려줘요.

fn main() {
let a = 5;
let b = 8;
println!("{}", a == b); // false
println!("{}", a != b); // true
println!("{}", a < b); // true
println!("{}", a > b); // false
println!("{}", a <= b); // true
println!("{}", a >= b); // false
}

비교 연산자는 if 조건 안에서 계속 쓰게 될 거예요. if…else 페이지에서 다뤄요.

논리 연산자는 불리언 값을 조합하거나 뒤집어요.

fn main() {
let is_logged_in = true;
let is_admin = false;
println!("{}", is_logged_in && is_admin); // false: 둘 다 true여야 해요
println!("{}", is_logged_in || is_admin); // true: 적어도 하나가 true예요
println!("{}", !is_admin); // true: false를 true로 뒤집어요
}
▶ 직접 실행해 보기
  • &&: 그리고(and). 양쪽이 모두 true일 때만 true예요.
  • ||: 또는(or). 적어도 한쪽이 true면 true예요.
  • !: 아님(not). true는 false로, false는 true로 뒤집어요.

평범한 = 말고도, Rust에는 변수의 현재 값을 바탕으로 값을 갱신하는 축약 연산자가 있어요.

fn main() {
let mut score = 10;
score += 5; // score = score + 5 와 같아요
score -= 2; // score = score - 2
score *= 3; // score = score * 3
score /= 2; // score = score / 2
println!("{score}");
}
▶ 직접 실행해 보기

변수의 값을 바꾸는 것이니, 이 연산자들을 쓰려면 변수에 mut가 있어야 컴파일된다는 걸 기억하세요.

식에 연산자가 여러 개 있으면 Rust는 그냥 왼쪽에서 오른쪽으로 계산하지 않아요. 학교 수학처럼 *, /, %가 +, -보다 먼저 계산돼요. 같은 단계의 연산자끼리는 왼쪽에서 오른쪽으로 계산해요. 괄호는 항상 가장 먼저 계산되니까, 다른 순서를 원할 때는 괄호를 쓰세요.

fn main() {
let a = 2 + 3 * 4; // *가 먼저: 2 + 12
let b = (2 + 3) * 4; // 괄호가 먼저: 5 * 4
let c = 10 - 4 - 3; // 같은 단계, 왼쪽부터: (10 - 4) - 3
let d = 17 % 5 * 2; // 같은 단계, 왼쪽부터: (17 % 5) * 2
let ok = 1 + 1 == 2 && 3 > 2; // 계산, 그다음 비교, 그다음 &&
println!("{a} {b} {c} {d} {ok}");
}

실행 결과:

14 20 3 4 true
▶ 직접 실행해 보기

전체 순서를 먼저 계산되는 것부터 대략 정리하면 이래요. 산술(* / %, 그다음 + -), 그다음 비교(== != < > <= >=), 그다음 &&, 그다음 ||, 마지막으로 대입 연산자(= += -= 등)예요. 그래서 1 + 1 == 2 && 3 > 2가 괄호 없이도 동작해요. 그래도 순서를 따져 보느라 잠깐이라도 멈칫하게 된다면 괄호를 넣으세요. 괄호는 비용이 전혀 없고, 코드를 더 읽기 쉽게 만들어 줘요.

어떤 동영상의 길이가 125초예요. 이 값을 변수에 저장한 다음, 2분 5초처럼 몇 분 몇 초인지 출력해 보세요. 힌트: 정수 나눗셈 /로 분을 구하고, %로 남은 초를 구할 수 있어요.

정답 보기
fn main() {
let total_seconds = 125;
let minutes = total_seconds / 60; // 2 (나머지는 버려요)
let seconds = total_seconds % 60; // 5 (나머지)
println!("{minutes}분 {seconds}초");
}

실행 결과:

2분 5초
▶ 직접 실행해 보기

게임 점수 score를 10에서 시작하세요. 축약 대입 연산자를 써서 25를 더하고, 5를 빼고, 두 배로 만드세요. 그리고 점수, 점수가 50 이상인지, 점수가 50 이상이면서 동시에 짝수인지를 출력해 보세요. 힌트: score % 2 == 0이면 짝수예요.

정답 보기
fn main() {
let mut score = 10;
score += 25; // 35
score -= 5; // 30
score *= 2; // 60
println!("점수: {score}");
println!("레벨 통과? {}", score >= 50);
println!("통과했고 짝수? {}", score >= 50 && score % 2 == 0);
}

실행 결과:

점수: 60
레벨 통과? true
통과했고 짝수? true
▶ 직접 실행해 보기
  • 산술: + - * / %. 정수 나눗셈은 소수점 아래를 버려요.
  • 비교: == != < > <= >=. 모두 bool을 돌려줘요.
  • 논리: &&(그리고), ||(또는), !(아님).
  • 축약 대입: += -= *= /=는 mut 변수의 값을 그 자리에서 갱신해요. ++는 없어요.
  • * / %가 + -보다 먼저 계산되고, 산술이 비교와 &&/||보다 먼저 계산돼요. 헷갈리면 괄호를 쓰세요.

이해도 점검

1. 양쪽이 모두 정수일 때 10 / 3의 결과는 무엇일까요?

2. ==나 < 같은 비교 연산자는 항상 어떤 타입을 돌려줄까요?

3. score += 5;가 컴파일되려면 무엇이 필요할까요?

점수: 0 / 3