소소한 개발 공부

[Rust] 보편적인 프로그래밍 개념(데이터 타입 / 함수 / 주석 / 제어문) 본문

프로그래밍/Rust

[Rust] 보편적인 프로그래밍 개념(데이터 타입 / 함수 / 주석 / 제어문)

이내내 2023. 7. 26. 00:21

1. 데이터 타입

러스트는 타입이 고정된 강타입 언어로, 데이터 타입은 스칼라, 컴파운드(복합타입) 로 나뉜다.

* 강타입(strongly-type): 컴파일 타임에 타입 체크를 하며, 묵시적 형변환이 금지되는 언어

 

1) 스칼라

하나의 값으로 표현되는 타입

- 정수형 / 부동 소수점 숫자형 / boolean / 문자(char) 가 있음

정수형

정수 타입
bit size signed unsigned
8-bit i8 u8
16-bit i16 u16
32-bit i32 (일반적으로 사용) u32
64-bit i64 u64
128-bit i128 u128
32-bit / 64-bit 아키텍처에 따라 다름
- 포인터 타입
isize usize

정수 리터럴 :

- Decimal -> 100_000 가능

- Hex -> 0xff

- Octal -> 0o77

- Binary -> 0b0010

- Byte(u8 only) -> b'A'

fn main() {
    let tmp = 100_000;
    println!("{}", tmp); // output: 100000
}

부동 소수점 숫자형

- f32 / f64(기본 타입)

아래와 같이 명시적으로 타입을 적지 않은 상태라면 f64로 64bit 의 크기를 갖는다.

fn main() {
    let tmp = 32.2 / 6.5; // -> f64타입
    println!("{}", tmp); // output: 4.953846153846154

    let tmp2 : f32 = 32.2 / 6.5;
    println!("{}", tmp2); // output: 4.9538465
}

Boolean형

true, false 값을 가짐

 

문자형

char로 작은 따옴표로 표기

Unicode scalar 를 표현하는 값으로 아스키보다 많은 표현 가능

fn main() {
    let c = 'z';
    let z = 'ℤ';
    let heart_eyed_cat = '😻';

    println!("{} {} {}", c, z, heart_eyed_cat); // z ℤ 😻
 }

 

2) 컴파운드(복합 타입)

러스트는 복합 타입으로 튜플과 배열을 사용한다.

 

튜플

서로 다른 타입의 변수를 묶어서도 사용 가능하고, 0, 1, ... n 으로 인덱스를 사용해 원소를 사용할 수도 있다.

fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
    println!("{} {} {}", tup.0, tup.1, tup.2); // 500 6.4 1
    
    let (tmp1, tmp2, tmp3) = tup;
    println!("{} {} {}", tmp1, tmp2, tmp3); // 500 6.4 1
}

배열

원소가 같은 요소를 묶은 집합. 한번 선언되면 크기가 변하지 않는다.

마찬가지로 각 요소는 인덱스로 접근 가능하다.

또한 순회도 가능 (for 변수 in range)

fn main() {
    let a = [1, 2, 3, 4, 5];
    
    let first = a[0];
}
fn main() {
    let a = [1, 2, 3, 4, 5];
    
    for i in 0..a.len() 
    {
        println!("{}", i);
    }
}
//0
//1
//2
//3
//4

 

2. 함수

- snake case 로 네이밍한다. (ex. function_example())

- 함수 정의는 main 함수의 위치에 종속되지 않는다.

- 매개변수 정의 방식 (두 개 이상인 경우 , 콤마로 구분)

fn main() {
    another_function(5);
}

fn another_function(x: i32) {
    println!("The value of x is: {}", x);
}

- 리턴 타입 정의 방식 (정의되어 있지 않으면 묵시적으로 추론)

fn five() -> i32 {
    5 // 이것도 되고
    // return 5 // 이것도 됨
}

fn main() {
    let x = five();

    println!("The value of x is: {}", x);
}

- { 괄호 } 로 범위 생성 가능

변수는 범위 안에 있는 것만 사용 가능

- 범위 밖에서 변수를 사용하면 -> cannot find value `변수` in this scope를 볼 수 있다.

fn main() {
    {
        let tmp = 32;
    }
    println!("{}", tmp); // error
}

3. 주석

// 이 방식 가능

/* 이 방식 가능 */

4. 제어문

"if 조건식 {조건문 본문}" 의 형태

fn main() {
    let number = 6;

    if number % 4 == 0 {
        println!("number is divisible by 4");
    } else if number % 3 == 0 {
        println!("number is divisible by 3");
    } else if number % 2 == 0 {
        println!("number is divisible by 2");
    } else {
        println!("number is not divisible by 4, 3, or 2");
    }
}

아래와 같이 let 문에 if 로 표현식을 쓸 수 있다.

fn main() {
    let condition = true;
    let answer = if condition {
        true
    } else {
        false
    };

    println!("{}", answer); // true
}

while 또한 유사하게 사용할 수 있다.

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{}!", number);

        number = number - 1;
    }

    println!("LIFTOFF!!!");
}

 

'프로그래밍 > Rust' 카테고리의 다른 글

[Rust] 컬렉션 - 해시맵  (0) 2023.08.11
[Rust] use 키워드  (0) 2023.08.10
[Rust] 러스트 설치하기 - Windows  (0) 2023.07.24
[러스트] 추리 게임  (0) 2023.07.18
[러스트] 불변성  (0) 2023.07.17