소소한 개발 공부
[Rust] 보편적인 프로그래밍 개념(데이터 타입 / 함수 / 주석 / 제어문) 본문
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 |