본문 바로가기

반응형

언어/Rust

(24)
[ Rust ] tuples - 다른 데이터 타입을 하나로 묶음으로 결학하기 튜플은 러스트에서 서로 다른 데이터 타입들을 하나의 묶음으로 결합할 수 있는 데이터 타입입니다. 튜플은 고정된 길이를 가지며, 각 요소의 타입이 다를 수 있습니다. 튜플은 소괄호 ()를 사용하여 정의하고, 각 요소는 쉼표로 구분됩니다.튜플의 특징서로 다른 타입의 값을 가질 수 있습니다.길이가 고정되어 있습니다. 즉, 한 번 정의된 튜플의 길이는 변경할 수 없습니다.튜플의 요소는 인덱스로 접근할 수 있습니다.예제 코드fn main() { // 튜플 정의 let person: (&str, i32, f64) = ("Alice", 30, 65.5); // 튜플의 요소에 접근 println!("Name: {}", person.0); // "Alice" println!("Age: {}",..
[ Rust ] 유리수, 복소수, 없는 값 (null) 타입 Rust는 기본적으로 정수형과 부동 소수점형의 스칼라 타입을 제공하지만, 유리수(분수)나 복소수와 같은 수학적인 데이터 타입은 표준 라이브러리에서 직접 지원하지 않습니다. 대신 이러한 타입을 사용하기 위해서는 외부 크레이트를 활용하거나 직접 구현해야 합니다. 또한, Rust에서는 "없는 값"을 표현할 때 사용하는 특별한 타입들도 있습니다.1. 유리수 (Rational Numbers)유리수(분수)를 Rust에서 사용하려면, 외부 라이브러리인 num-rational 크레이트를 사용하는 것이 일반적입니다. 이 크레이트는 유리수를 표현하고 계산할 수 있는 기능을 제공합니다.유리수 예제 (using num-rational crate):# Cargo.toml에 다음을 추가합니다.[dependencies]num-ra..
[ Rust ] 러스트는 비교시 타입이 달라서 에러가 난 경우 Rust에서는 서로 다른 데이터 타입을 비교할 수 없도록 엄격한 타입 시스템을 사용합니다. 이로 인해 서로 다른 타입 간의 직접적인 비교는 컴파일 오류를 발생시키며, 이는 프로그래머가 의도하지 않은 실수를 방지하는 데 도움이 됩니다. 예를 들어, 정수형(i32)과 실수형(f32)은 서로 다른 타입이므로 직접 비교할 수 없습니다.이러한 타입 안전성은 Rust의 주요 특징 중 하나로, 잘못된 타입 간의 비교로 인한 논리적 오류를 사전에 방지해 줍니다.비교 불가 예시:아래 코드는 i32 타입의 정수와 f32 타입의 부동 소수점을 비교하려고 시도하지만, 컴파일 시 오류가 발생합니다.fn main() { let int_val: i32 = 10; let float_val: f32 = 10.0; //..
[ Rust ] 숫자 타입 - 스칼라 수를 표현할 수 있는 러스트 타입 Rust에서 스칼라 수를 나타내는 타입은 다음과 같은 네 가지 주요 범주로 나눌 수 있습니다. 각 범주 내에서 다양한 타입이 존재하며, 그들은 모두 단일 값을 표현합니다.1. 정수 (Integers)정수는 부호가 있는 타입과 부호가 없는 타입으로 나눌 수 있으며, 각각 저장할 수 있는 값의 범위가 다릅니다.부호 있는 정수 (Signed integers): i8, i16, i32, i64, i128, isize부호가 있으므로 음수와 양수를 모두 표현할 수 있습니다.예: i32는 -2,147,483,648부터 2,147,483,647까지의 값을 가질 수 있습니다.부호 없는 정수 (Unsigned integers): u8, u16, u32, u64, u128, usize부호가 없으므로 0 이상의 양수만을 표현..
[ Rust ] 2, 8, 16 진수 - 정수 변수 선언하기 Rust에서는 숫자 변수를 선언할 때 2진수, 8진수, 16진수 등의 진수를 사용할 수 있습니다. 각각의 진수는 특정 접두사를 통해 표현할 수 있으며, 기본적으로 정수 타입은 i32 또는 u32로 선언됩니다. 원하는 타입을 명시하려면 타입 어노테이션을 사용할 수도 있습니다.아래는 2진수, 8진수, 16진수로 숫자를 선언하는 방법과 간단한 예제입니다:진수별 접두사:2진수: 0b8진수: 0o16진수: 0x예제 코드:fn main() { // 2진수 선언 (0b) let bin: u32 = 0b1010; // 10진수로 10 // 8진수 선언 (0o) let oct: u32 = 0o12; // 10진수로 10 // 16진수 선언 (0x) let hex: u32 = 0xA; ..
[ Rust ] 숫자 변수 선언하기 러스트에서 숫자 변수를 선언하는 방법은 간단합니다. 러스트는 정적 타입 언어이기 때문에 변수의 타입을 명시적으로 선언하거나, 러스트가 자동으로 추론하게 할 수 있습니다. 숫자 변수는 여러 종류가 있으며, i32, u32, f64 등 다양한 타입이 있습니다.예제 1: 정수형 변수 선언fn main() { // i32 타입의 정수형 변수 선언 let x: i32 = 10; // 타입을 명시하지 않고 선언 (i32로 추론) let y = 20; println!("x: {}, y: {}", x, y);}예제 2: 부호 없는 정수형 변수 선언fn main() { // u32 타입의 부호 없는 정수형 변수 선언 let x: u32 = 30; // 타입을 명시하지 않고 선언..
[ Rust ] 반복자 무효화(iterator invalidation)에 대해서 알아보기 반복자 무효화(Iterator Invalidations)는 데이터 구조를 순회하는 동안, 그 데이터 구조가 변경될 때 발생하는 문제입니다. 일반적으로 배열, 벡터, 링크드 리스트 같은 자료 구조에서 반복자를 사용해 요소들을 순회하는 도중에 해당 자료 구조에 요소를 추가하거나 제거하면, 반복자가 가리키는 위치가 잘못되어 예상치 못한 동작을 초래할 수 있습니다. 이 상황을 반복자 무효화라고 합니다.반복자 무효화의 예시 (C++)C++에서 벡터(std::vector)를 사용할 때, 반복자 무효화가 어떻게 발생할 수 있는지 살펴보겠습니다.#include #include int main() { std::vector numbers = {1, 2, 3, 4, 5}; auto it = numbers.begi..
[ Rust ] 버퍼 오버플로우(buffer overflow)에 대해서 알아 보기 버퍼 오버플로우(Buffer Overflow)는 메모리 안전성 문제 중 하나로, 프로그램이 고정된 크기의 메모리 버퍼에 더 많은 데이터를 기록하려고 할 때 발생합니다. 이로 인해 버퍼를 초과한 메모리 영역이 덮어쓰여질 수 있으며, 이는 프로그램의 비정상 종료, 데이터 손상, 심지어 악의적인 코드 실행과 같은 심각한 문제를 초래할 수 있습니다.버퍼 오버플로우 예제 (C 언어)C 언어는 메모리 관리를 프로그래머에게 맡기기 때문에, 버퍼 오버플로우 문제가 발생하기 쉽습니다. 아래는 C에서 발생할 수 있는 버퍼 오버플로우의 예입니다:#include #include int main() { char buffer[10]; strcpy(buffer, "This is a very long string that..

반응형