리터럴과 연산자

리터럴:코드에직접 적어두고 한눈에 값을 알 수 있는상수 데이터로 프로그램의 가장 기본적인 데이터 표현 방식입니다.

값이 고정되어 바뀌지 않고코드에 하드코딩되어 실행 중 변경할 수 없습니다. 별도 연산이나 변수 해석이 필요 없으며 글자 그대로 “문자 그대로의 값”이라는 뜻입니다.

예시:아래 13, 3.14가 리터럴이며 다른 언어에서는 값 리터럴이라고 부르기도 합니다.

fn main() {
    println!("{}", 13);
    println!("{}", 3.14);
}Code language: JavaScript (javascript)

학습 편의를 위해 공식에서 온라인 Rust 편집 툴을 제공합니다. 로컬 환경 설치 없이 웹에서 Rust 기본 문법을 연습할 수 있으며 아래 링크를 클릭하세요.

Rust Playground

리터럴

Rust는정수, 부동소수점, 문자, 문자열, 불리언, 유닛(unit) 타입리터럴을 지원합니다.

  • 정수:11
  • 문자:'a'(작은 따옴표)
  • 문자열:"abc"(큰 따옴표)
  • 불리언:true / false
  • 유닛 타입:()

정수 다양한 진법 표기법

접두사로 진법을 구분하며 정수에만 사용합니다.

  • 16진수:0x로 시작, 예:0x1F
  • 8진수:0o로 시작, 예:0o77
  • 2진수:0b로 시작, 예:0b1010

숫자 구분자

숫자 리터럴 안에밑줄 _을 삽입해 가독성을 높일 수 있으며실제 숫자 값에는 영향을 주지 않습니다.

  • 정수:1_000 = 1000
  • 부동소수점:0.000_001 = 0.000001

과학적 표기법

부동소수점은 E 과학 표기법을 지원하며 기본 타입은f64입니다.

  • 1e6 = 1000000
  • 7.6e-4 = 0.00076

리터럴 타입 접미사(핵심)

Rust는 리터럴 타입을 명확히 지정해야 하며 자주 사용하는 접미사는 다음과 같습니다.

  • u32:32비트부호 없는정수(음수 불가)
  • i32:32비트부호 있는정수(양수 음수 모두 지원)

주의:부호 있는 정수와 부호 없는 정수를 혼합 연산하면 바로 컴파일 오류가 발생합니다.

예시 코드:

fn main() {
    // 1. 일반 정수 리터럴
    println!("정수: {}", 13);
    // 2진수, 8진수, 16진수 정수
    println!("2진수: {}", 0b1010);
    println!("8진수: {}", 0o77);
    println!("16진수: {}", 0x2A);
    // 구분자 포함 정수(가독성 향상)
    println!("밑줄 포함 정수: {}", 1_000_000);
    // 타입 접미사가 붙은 정수
    println!("u32 부호 없는 정수: {}", 100u32);
    println!("i32 부호 있는 정수: {}", -50i32);

    // 2. 부동소수점 리터럴
    println!("부동소수점: {}", 3.14);
    // 밑줄 포함 부동소수점
    println!("밑줄 포함 부동소수점: {}", 0.000_001);
    // 과학적 표기법 부동소수점
    println!("과학적 표기법: {}", 1e6);
    println!("음수 과학 표기법: {}", 7.6e-4);

    // 3. 문자열 리터럴(큰 따옴표)
    println!("문자열: {}", "hello world");

    // 4. 문자 리터럴(작은 따옴표, 한 글자만 입력 가능)
    println!("문자: {}", 'a');
    println!("한자 문자: {}", '中');

    // 5. 불리언 리터럴
    println!("불리언 true: {}", true);
    println!("불리언 false: {}", false);

    // 6. 유닛 리터럴 ()(Rust 유닛 타입)
    println!("유닛 타입: {:?}", ());
}Code language: JavaScript (javascript)

연산자

Rust 연산자의 규칙과 우선순위는 C 계열 언어와 거의 동일합니다.

1. 산술 연산자

덧셈, 뺄셈 등 기본 숫자 연산이며 정수 타입 접미사와 함께 사용합니다.

  • 덧셈:+
  • 뺄셈:-

2. 불리언 논리 연산자(단락 회로 논리)

오직 true/false 불리언 값에만 적용할 수 있습니다.

  • 논리곱 &&:양쪽 모두 true일 때 결과가 true
  • 논리합 ||:한쪽만 true여도 결과가 true
  • 부정 !:불리언 값 반전
표현식 연산 결과
true && true true
true && false false
false && true false
false && false false
true || true true
true || false true
false || true true
false || false false
!true false
!false true

3. 비트 연산(2진 비트 조작)

주로 정수에 사용하며 예시에서 {:04b}4자리 2진수를 포맷 출력합니다.

  1. 비트곱 &:같은 자리 둘 다 1일 때 결과가 1
  2. 비트합 |:같은 자리 하나라도 1이면 결과가 1
  3. 배타적 논리합 ^:같은 자리 값이 다르면 1, 같으면 0
  4. 왼쪽 시프트 <<:2진수를 통째로 왼쪽 이동(×2ⁿ 동일)
  5. 오른쪽 시프트 >>:2진수를 통째로 오른쪽 이동(÷2ⁿ 동일)
  0 0 1 1
& 0 1 0 1
-----------
  0 0 0 1  

  0 0 1 1
| 0 1 0 1
-----------
  0 1 1 1

  0 0 1 1
^ 0 1 0 1
-----------
  0 1 1 0

왼쪽 시프트 <<
2진수:00000001
5비트 왼쪽 이동 → 00100000, 결과 = 32

오른쪽 시프트 >>
0x80 2진수:10000000
2비트 오른쪽 이동 → 00100000(16진수 0x20), 결과 = 32
fn main() {
    // ========== 산술 연산자 ==========
    // 정수 덧셈:u32 32비트 부호 없는 정수
    // 실행 결과:1 + 2 = 3
    println!("1 + 2 = {}", 1u32 + 2);

    // 정수 뺄셈:i32 32비트 부호 있는 정수, 음수 지원
    // 1u32로 변경하면 오류 발생, 부호 없는 정수는 음수 표현 불가
    // 실행 결과:1 - 2 = -1
    println!("1 - 2 = {}", 1i32 - 2);

    // ========== 부동소수점 리터럴 - 과학적 표기법 ==========
    // 실행 결과:1e4 는 10000, -2.5e-3 는 -0.0025
    println!("1e4 는 {}, -2.5e-3 는 {}", 1e4, -2.5e-3);

    // ========== 불리언 논리 연산자(단락 회로 연산) ==========
    // 논리곱 &&:양쪽 모두 true여야 결과 true
    // 실행 결과:true 논리곱 false = false
    println!("true 논리곱 false = {}", true && false);

    // 논리합 ||:한쪽만 true여도 결과 true
    // 실행 결과:true 논리합 false = true
    println!("true 논리합 false = {}", true || false);

    // 부정 !:불리언 값 반전
    // 실행 결과:부정 true = false
    println!("부정 true = {}", !true);

    // ========== 비트 연산자(2진 비트 조작) ==========
    // {:04b} 4자리 2진수 고정 출력, 자릿수 부족시 왼쪽 0 채움
    // 비트곱 &:같은 자리 모두 1이어야 결과 1
    // 실행 결과:0011 비트곱 0101 = 0001
    println!("0011 비트곱 0101 = {:04b}", 0b0011u32 & 0b0101);

    // 비트합 |:같은 자리 하나라도 1이면 결과 1
    // 실행 결과:0011 비트합 0101 = 0111
    println!("0011 비트합 0101 = {:04b}", 0b0011u32 | 0b0101);

    // 배타적 논리합 ^:같은 자리 값 다르면 1, 같으면 0
    // 실행 결과:0011 배타적 논리합 0101 = 0110
    println!("0011 배타적 논리합 0101 = {:04b}", 0b0011u32 ^ 0b0101);

    // 왼쪽 시프트 <<:2진수 전체 5비트 왼쪽 이동
    // 실행 결과:1 을 5비트 왼쪽 시프트 = 32
    println!("1 을 5비트 왼쪽 시프트 = {}", 1u32 << 5);

    // 오른쪽 시프트 >>:2진수 전체 2비트 오른쪽 이동, {:x} 16진수 출력
    // 실행 결과:0x80 을 2비트 오른쪽 시프트 = 0x20
    println!("0x80 을 2비트 오른쪽 시프트 = 0x{:x}", 0x80u32 >> 2);

    // ========== 숫자 구분 밑줄 _ ==========
    // 밑줄은 가독성 향상만 목적, 숫자 값 변경 X
    // 실행 결과:백만 표기:1000000
    println!("백만 표기:{}", 1_000_000u32);
}Code language: JavaScript (javascript)

3. 코드 실행 보충 설명

  1. 1i321u32로 바꿔 뺄셈 1u32 - 2을 실행하면 오류가 발생합니다. 부호 없는 정수는 음수를 표현할 수 없기 때문입니다.
  2. {:04b}:포맷 출력 문법, b는 2진수를 의미하며 04는 자릿수가 4자리 미만일 경우 왼쪽을 0으로 채웁니다.
  3. 큰 수는 밑줄로 구분하는 것을 추천(예:1_000_000u32)코드 가독성이 더 좋아집니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다