숫자, 텍스트 및 true/false 값에 대한 데이터 형식 탐색

완료됨

Rust는 정적으로 형식화된 언어입니다. 컴파일러는 프로그램이 컴파일하고 실행할 코드에 있는 모든 변수의 정확한 데이터 형식을 알아야 합니다. 컴파일러는 일반적으로 바인딩된 값에 따라 변수의 데이터 형식을 유추할 수 있습니다. 코드에 형식을 항상 명시할 필요는 없습니다. 여러 형식을 사용할 수 있는 경우 형식 주석을 사용하여 컴파일러에 특정 형식을 알려야 합니다.

다음 예에서는 number 변수를 32비트 정수로 만들도록 컴파일러에 지시합니다. 변수 이름 뒤에 데이터 형식 u32를 지정합니다. 변수 이름 뒤에 콜론 :을 사용합니다.

let number: u32 = 14;
println!("The number is {}.", number);

변수 값을 큰따옴표로 묶으면 컴파일러가 값을 숫자가 아닌 텍스트로 해석합니다. 유추된 값의 데이터 형식이 변수에 지정된 u32 데이터 형식과 일치하지 않으므로 컴파일러가 오류를 발생시킵니다.

let number: u32 = "14";

컴파일러 오류:

   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
 --> src/main.rs:2:23
  |
2 |     let number: u32 = "14";
  |                 ---   ^^^^ expected `u32`, found `&str`
  |                 |
  |                 expected due to this

error: aborting due to previous error

Rust Playground에서 위 코드와 상호 작용할 수 있습니다.

기본 제공 데이터 형식

Rust에는 숫자, 텍스트 및 진위 여부를 표현하는 몇 가지 기본 제공 데이터 형식이 제공됩니다. 이러한 형식 중 일부는 단일 값을 나타내므로 스칼라라고 합니다.

  • 정수
  • 부동 소수점 숫자
  • 부울
  • 문자

Rust에는 문자열과 튜플 값 같은 데이터 계열에서 작동하는 더 복잡한 데이터 형식도 제공됩니다.

숫자: 정수 및 부동 소수점 값

Rust의 정수는 비트 크기와 부호 있는 속성으로 식별됩니다. 부호 있는 정수는 양수 또는 음수일 수 있습니다. 부호 없는 정수는 양수만 될 수 있습니다.

길이 서명 부호 없음    
8비트 i8 u8    
16비트 i16 u16    
32비트 i32 u32    
64비트 i64 u64    
128비트 i128 u128    
아키텍처 종속 isize usize    

isizeusize 형식은 프로그램을 실행하는 컴퓨터의 종류에 따라 달라집니다. 64비트 형식은 64비트 아키텍처에서 사용되고 32비트 형식은 32비트 아키텍처에서 사용됩니다. 정수에 대한 형식을 지정하지 않고 시스템에서 형식을 유추할 수 없는 경우 기본적으로 i32 형식(32비트의 부호 있는 정수)이 할당됩니다.

Rust에는 10진수 값 f32(32비트)와 f64(64비트)의 두 가지 부동 소수점 데이터 형식이 있습니다. 기본 부동 소수점 형식은 f64 입니다. 최신 CPU에서 f64 형식은 f32 형식과 속도가 거의 같지만 더 정밀합니다.

let number_64 = 4.0;      // compiler infers the value to use the default type f64
let number_32: f32 = 5.0; // type f32 specified via annotation

Rust의 모든 기본 숫자 형식은 더하기, 빼기, 곱하기, 나누기 같은 수학 연산을 지원합니다.

// Addition, Subtraction, and Multiplication
println!("1 + 2 = {} and 8 - 5 = {} and 15 * 3 = {}", 1u32 + 2, 8i32 - 5, 15 * 3);

// Integer and Floating point division
println!("9 / 2 = {} but 9.0 / 2.0 = {}", 9u32 / 2, 9.0 / 2.0);

참고

println 매크로를 호출할 때 각 리터럴 숫자에 데이터 형식 접미사를 추가하여 Rust에 데이터 형식을 알립니다. 구문 1u32는 값이 숫자 1이며 이 값을 부호 없는 32비트 정수로 해석하라고 컴파일러에 지시합니다.

형식 주석을 제공하지 않으면 Rust가 컨텍스트에서 형식 유추를 시도합니다. 컨텍스트가 모호한 경우 기본적으로 i32 형식(부호 있는 32비트 정수)을 할당합니다.

Rust Playground에서 이 예제를 실행할 수 있습니다.

부울: true 또는 False

Rust의 부울 형식으로 진위 여부를 저장합니다. bool 형식에는 두 가지 가능한 값(true 또는 false)이 있습니다. 부울 값은 조건식에서 많이 사용됩니다. bool 문 또는 값이 true이면 이 작업을 수행하고, 아니면(문 또는 값이 false) 다른 작업을 수행합니다. 부울 값은 종종 비교 검사에서 반환됩니다.

다음 예에서는 > 이상의 연산자를 사용하여 두 값을 테스트합니다. 연산자는 테스트 결과를 나타내는 부울 값을 반환합니다.

// Declare variable to store result of "greater than" test, Is 1 > 4? -- false
let is_bigger = 1 > 4;
println!("Is 1 > 4? {}", is_bigger);  

텍스트: 문자 및 문자열

Rust는 두 개의 기본 문자열 형식과 하나의 문자 형식을 갖는 텍스트 값을 지원합니다. 문자가 단일 항목이라면 문자열은 일련의 문자입니다. 모든 텍스트 형식은 유효한 UTF-8 표현입니다.

문자

char 형식은 가장 기본적인 텍스트 형식입니다. 그 값은 항목을 작은 따옴표로 묶어 지정합니다.

let uppercase_s = 'S';
let lowercase_f = 'f';
let smiley_face = '😃';

참고

일부 언어에서는 해당 char 형식을 부호 없는 8비트 정수(Rust u8 형식에 해당)로 처리합니다. Rust의 char 형식은 유니코드 코드 포인트를 포함하지만 UTF-8 인코딩을 사용하지 않습니다. Rust의 char는 너비가 32비트가 되도록 채워지는 21비트 정수입니다. char는 일반 코드 포인트 값을 직접 포함합니다. Rust의 char 형식은 Rust 설명서에서 자세히 알아볼 수 있습니다.

문자열

문자열 조각이라고도 하는 str 형식은 문자열 데이터의 보기입니다. 대부분의 경우 앰퍼샌드 &str가 있는 형식 앞의 참조 스타일 구문을 사용하여 이러한 형식을 참조합니다. 다음 모듈에서는 참조를 다룹니다. 지금은 &str을 변경할 수 없는 문자열 데이터에 관한 포인터로 생각하면 됩니다. 문자열 리터럴은 모두 &str 형식입니다.

문자열 리터럴은 소개 Rust 예제에서 편리하게 사용할 수 있지만 텍스트를 사용하려는 모든 상황에 적합한 것은 아닙니다. 컴파일 시간에 모든 문자열을 알 수 있는 것은 아닙니다. 런타임 동안 사용자가 프로그램과 상호 작용하고 터미널을 통해 텍스트를 전송하는 경우를 예로 들 수 있습니다.

이러한 시나리오의 경우 Rust에는 String이라는 두 번째 문자열 형식이 있습니다. 이 형식은 힙에 할당됩니다. String 형식을 사용하면 코드가 컴파일되기 전에 문자열의 길이(문자 수)를 알 필요가 없습니다.

참고

가비지 수집 언어에 익숙하다면 Rust에 두 개의 문자열 형식이 있는 이유가 궁금할 것입니다.1 문자열은 매우 복잡한 데이터 형식입니다. 대부분의 언어는 가비지 수집기를 사용하여 이러한 복잡성에 대한 주석을 제공합니다. 시스템의 언어로서의 Rust에는 문자열에 내재된 복잡성을 공개됩니다. 복잡성이 가중되면 프로그램에서 메모리가 사용되는 방식을 세부적으로 제어할 수 있습니다.

1 실제 Rust에는 두 개의 문자열 형식이 있습니다. 이 모듈에서는 String&str 형식만 다룹니다. 제공되는 문자열 형식은 Rust 설명서에서 자세히 알아볼 수 있습니다.

String&str 간의 차이점을 완전히 이해하려면 Rust의 소유권 및 대여 시스템에 대해 알아보아야 합니다. 그때까지는 String 형식 데이터를 프로그램이 실행될 때 변경될 수 있는 텍스트 데이터로 생각할 수 있습니다. &str 참조는 프로그램이 실행될 때 변하지 않는 텍스트 데이터에 대한 변경 불가능한 보기입니다.

텍스트 예

다음 예는 Rust에서 char&str 데이터 형식을 사용하는 방법을 보여줍니다.

  • : char 주석 구문으로 두 개의 문자 변수를 선언합니다. 값은 작은따옴표를 사용하여 지정합니다.
  • 세 번째 문자 변수가 선언되고 단일 이미지에 바인딩됩니다. 이 변수는 컴파일러로 데이터 형식을 유추할 수 있습니다.
  • 두 개 문자열 변수가 선언되고 해당 값에 바인딩됩니다. 문자열은 큰따옴표로 묶입니다.
  • 문자열 변수 중 하나는 : &str 주석 구문으로 선언하여 데이터 형식을 지정합니다. 나머지 변수의 데이터 형식은 지정되지 않은 상태입니다. 컴파일러는 컨텍스트에 따라 이 변수의 데이터 형식을 유추합니다.

string_1 변수에는 일련의 문자 끝에 빈 공간이 포함됩니다.

// Specify the data type "char"
let character_1: char = 'S';
let character_2: char = 'f';
   
// Compiler interprets a single item in quotations as the "char" data type
let smiley_face = '😃';

// Compiler interprets a series of items in quotations as a "str" data type and creates a "&str" reference
let string_1 = "miley ";

// Specify the data type "str" with the reference syntax "&str"
let string_2: &str = "ace";

println!("{} is a {}{}{}{}.", smiley_face, character_1, string_1, character_2, string_2);

다음은 예제의 출력입니다.

😃 is a Smiley face.

이 예제에서 str 앞에 앰퍼샌드 &를 지정하지 않으면 어떻게 되나요? Rust Playground에서 이 예제를 실행해보면 알 수 있습니다.

지식 점검

다음 질문에 대답하여 배운 내용을 확인하세요. 각 질문에 대해 하나의 대답을 선택한 다음, 답변 확인을 선택합니다.

1.

Rust에서 정수 값이 정의되는 방식을 설명하는 문장은 무엇인가요?

2.

Rust에서 텍스트 문자 값을 지원하는 방법을 올바르게 설명하는 문장은 무엇인가요?