일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 스마트 컨트렉트 함수이름 중복
- 러스트 기초
- Vue
- 스마트컨트렉트테스트
- nest.js설명
- SBT표준
- Vue.js
- 컨트렉트 배포 자동화
- ethers typescript
- 체인의정석
- 프록시배포구조
- git rebase
- 티스토리챌린지
- ethers type
- vue기초
- 스마트컨트렉트 함수이름 중복 호출
- multicall
- 머신러닝기초
- 스마트컨트렉트프록시
- 스마트컨트렉트 예약어 함수이름 중복
- ambiguous function description
- ethers
- rust 기초
- 컨트렉트 동일한 함수이름 호출
- 오블완
- ethers websocket
- ethers v6
- 러스트 기초 학습
- chainlink 설명
- 러스트기초
- Today
- Total
체인의정석
Rust 기본 프로그래밍 컨셉 (데이터 타입) 본문
기본 데이터 타입
러스트의 모든 값들은 데이터 타입을 가지고 있다.
컴파일 하는 시점에서 타입들에 대한 정의가 이루어지지 않는다면 모두 에러가 나게 되는 것이다.
let guess: u32 = "42".parse().expect("Not a number!");
요런 식으로 : 뒤에 타입을 쓰면 타입이 지정된다.
타입스크립트와 똑같이 생겨서 익히기 쉬웠다.
타입지정을 안하면 다음과 같은 에러가 나오게 된다.
$ cargo build
Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations)
error[E0282]: type annotations needed
--> src/main.rs:2:9
|
2 | let guess = "42".parse().expect("Not a number!");
| ^^^^^ consider giving `guess` a type
For more information about this error, try `rustc --explain E0282`.
error: could not compile `no_type_annotations` due to previous error
수치타입 (Sacalar type)
수치타입의 경우 하나의 값을 나타낸다. 러스트는 4개의 기본적인 타입이 있다.
integers, floating-point numbers, booleans, characters 이렇게 4개이다. 딱히 특별한 타입은 없는것 같다.
먼저 수치타입의 경우
다음과 같이 길이와 부호표시 여부에 따라서 나뉘게 된다.
이 부분은 다른 코드와 동일하게 signed 신호가 붙어서 음수까지 처리가 되는지 signed가 안붙어서 양수까지 처리가 되는지에 대한 구분이며 만약 signed 표시가 안되어 있다면 u16 이런식으로 쓰면서 2의 n승까지 표현이 가능하다. 반면 i16의 경우 2의 n-1승까지 표현이 가능하다.
정수형의 경우
이러한 형태로 처리되는데 재밌는 점은 소수점의 경우 _를 사용하며 읽기 쉽게 표시할 수 도 있다는 점이다.
1_000는 1000을 의미한다. solidity 코드에서도 이런식으로 숫자형 변수를 정의한 것을 본 적이 있는데 러스트에서도 그대로 사용하면 될 것 같다.
부동소수점 (Floating point)
러스트는 부동소수점을 지원한다. 솔리디티에서는 없던 부분이다.
fn main() {
let x = 2.0; // f64
let y: f32 = 3.0; // f32
}
요런식으로 사용한다고 쳐보자 그럼 f64가 기본 값이며 f32는 따로 지정을 해주어야 한다.
숫자연산
숫자연산의 경우 다음과 같다.
fn main() {
// addition
let sum = 5 + 10;
println!("sum is {sum}");
// subtraction
let difference = 95.5 - 4.3;
println!("difference is {difference}");
// multiplication
let product = 4 * 30;
println!("product is {product}");
// division
let quotient = 56.7 / 32.2;
println!("quotient is {quotient}");
let truncated = -5 / 3; // Results in -1
println!("truncated is {truncated}");
// remainder
let remainder = 43 % 5;
println!("remainder is {remainder}");
}
결과 값은
➜ variables (master) ✗ cargo run
Compiling variables v0.1.0 (/Users/chohk/Desktop/git/rust/variables)
Finished dev [unoptimized + debuginfo] target(s) in 0.27s
Running `target/debug/variables`
sum is 15
difference is 91.2
product is 120
quotient is 1.7608695652173911
truncated is -1
remainder is 3
let을 사용하여 연산하면 타입 지정 없이도 결과 값이 잘 나오는 것을 볼 수 있었으며 나누기나 나머지의 경우 음수가 붙은 경우 음수도 지원되지만 기본적으로는 정수형 부분만 남기고 결과 값으로 나오는 것을 확인할 수 있었다.
참거짓(Boolean)
fn main() {
let t = true;
let f: bool = false; // with explicit type annotation
}
별 특이점은 안보인다.
문자형(Character)
fn main() {
let c = 'z';
let z: char = 'ℤ'; // with explicit type annotation
let heart_eyed_cat = '😻';
}
char의 경우 char은 ' 를 사용한다. string은 "를 사용한다.
러스트의 경우 유니코드 지원이 되므로 변수로 이모티콘을 사용할 수도 있다.
사람들이 생각하는 string은 유니코드가 아니기 때문에 러스트의 char과는 차이가 있다.
합성 타입들
합성 타입의 경우 하나의 타입 안에 여러개의 타입들이 담겨 있는 것을 의미한다.
러스트는 2개의 합성 타입이 있다. 튜플과 배열이다.
튜플타입(Tuple)
튜플은 숫자와 변수를 섞어 놓았으며 고정된 길이를 가지고 있다.
또한 한번 선언되면
튜플의 경우 다음과 같이 정의하면 된다.
fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
}
튜플은 ,를 통해서 값들을 정의해주면 된다.
만약 개별 요소에 접근하고 싶을시 비구조화 할당을 해주면 된다.
fn main() {
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("The value of y is: {y}");
}
또는 객체 접근처럼 .을 사용할 수도 있다.
fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0;
let six_point_four = x.1;
let one = x.2;
}
이건 솔리디티에서 strct처럼 사용하면 되려나? 싶은 느낌이다.
조만간 앱토스 컨트렉트를 볼 예정이므로 나중에 예시를 보면 알것이다.
배열타입(Array)
배열은 튜플과의 차이점은 모든 요소들이 같은 타입이어야 된다는 점이 ㅣㅇㅆ고 다른 언어와의 차이점으로 러스트의 배열은 고정 길이를 가지고 있다.
배열의 경우 데이터를 힙대신 스택에 쌓고 싶을 때 유용하다. 또는 요소들의 수가 고정되어 있는 경우 사용하기 용이하다. vector를 사용하면 크기가 줄어들거나 늘어날 수 있다. array나 vector 중 무얼 사용해야 할지 모를때는 vector를 사용하면된다.
배열은 고정되어 있기 때문에
#![allow(unused)]
fn main() {
let months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
}
요렇게 12달을 의미하는 것 처럼 사용할 수 있다.
#![allow(unused)]
fn main() {
let a: [i32; 5] = [1, 2, 3, 4, 5];
}
또한 이러한 형태로 타입을 지정해주고 나서 개수를 적어줄 수도 있다.
#![allow(unused)]
fn main() {
let a = [3; 5];
}
요렇게 하면
let a = [3, 3, 3, 3, 3];
이렇게 초기 값으로 배열을 다 채울 수도 있다.
접근 방법은 똑같이
fn main() {
let a = [1, 2, 3, 4, 5];
let first = a[0];
let second = a[1];
}
이런식으로 해주면 된다.
'블록체인 > Rust' 카테고리의 다른 글
Rust Ownership , rust ownership을 이해하기 위한 기초 (heap, stack 알아보기) (0) | 2023.01.16 |
---|---|
Rust 기본 프로그래밍 컨셉 (Control Flow - 조건문, 반복문) (0) | 2023.01.16 |
Rust 기본 프로그래밍 컨셉 (함수) (0) | 2023.01.16 |
Rust 기본 프로그래밍 컨셉 (변수와 가변성) (2) | 2023.01.16 |
Rust 기본 학습과 설치 및 기본 guessing game 예제 (0) | 2023.01.13 |