7. Rust 변수 선언
• 변수(變數)인데 기본적으로 변(變)할 수 없다.
• mut 키워드로 변할 수 있는 변수를 만들 수 있다.
• 형(type)을 꼭 안 써도 된다. 컴파일러가 추론해준다.
• 초기화 하지 않은 값은 쓸 수 없다.
• 초기화 하고 안 써도 상관은 없는데 이 경우 형 선언을 해줘야 한다. (확
보할 메모리 양을 모르니까)
8. Rust 변수 선언
fn main () {
let god_movie: &str = "워크래프트: 전쟁의 서막";
// ~~~
// 변수 선언을 위한 키워드
println!("{}는/은 아주 잘 만든 영화이다.", god_movie);
}
9. Rust 변수 선언
fn main () {
let god_movie: &str = "워크래프트: 전쟁의 서막";
// ~~~~~~~~~
// 변수 이름
println!("{}는/은 아주 잘 만든 영화이다.", god_movie);
}
10. Rust 변수 선언
fn main () {
let god_movie: &str = "워크래프트: 전쟁의 서막";
// ~~~~
// 변수 자료형 (생략 가능)
println!("{}는/은 아주 잘 만든 영화이다.", god_movie);
}
11. 패턴 매칭을 이용한 선언
fn main() {
let (h_temp, l_temp) = (33, 26);
println!("오늘의 최고 기온은 {}'C이고, 최저 기온은 {}'C이다.", h_temp, l_temp);
// 오늘의 최고 기온은 33'C이고, 최저 기온은 26'C이다.
}
12. 패턴 매칭과 재할당을 이용한 swap
fn main() {
let (imp, exp) = (40, 10);
println!("수입은 {}, 지출은 {}. 남은 잔고는 {}", imp, exp, imp-exp);
let (imp, exp) = (exp, imp);
println!("수입은 {}, 지출은 {}. 남은 잔고는 {}", imp, exp, imp-exp);
// 수입은 40, 지출은 10. 남은 잔고는 30
// 수입은 10, 지출은 40. 남은 잔고는 -30
}
13. 재할당을 이용했을 때
fn main() {
let var = "계절";
println!("너와 함께 물들은 {:p}은 잠겨만가고", &var);
// 너와 함께 물들은 0x7fff5a360660은 잠겨만가고
let var = "미열";
println!("느닺없는 {:p}에 나는 허덕이고 있어", &var);
// 느닺없는 0x7fff5a3605b8에 나는 허덕이고 있어
}
저장되는 메모리가 다르다 => 새 값이 만들어진다
14. mut를 이용했을 때
fn main() {
let mut when = "어제";
println!("{:p}도 들었던 그 아티스트는", &when);
// 0x7fff54e10660도 들었던 그 아티스트는
when = "내일";
println!("{:p}을 끝으로 해산한다나봐", &when);
// 0x7fff54e10660을 끝으로 해산한다나봐
}
저장되는 메모리가 같다 => 말 그대로 값이 변한다
18. C++과 다른 점
• char가 4bytes (UTF-8이라서)
• stdint.h 같은 자료형이 기본 (i32, i64, ...)
• str과 char의 배열은 다름 (UTF-8이 가변 바이트라서)
• 배열의 정의에 갯수도 들어가 있음 ([i32;1]과 [i32;2]는 다른 타입)
• 하스켈, 파이썬 처럼 튜플이 있음
• 함수도 타입임
19. 오버플로우 일으키기
fn main() {
let mut x: i64 = i64::max_value();
println!("Max value of the i64 : {}", x);
x += 1;
println!("Now it has been changed to {}", x);
}
// Max value of the i64 : 9223372036854775807
// thread '<main>' panicked at 'arithmetic operation overflowed', src/main.rs:4
// note: Run with `RUST_BACKTRACE=1` for a backtrace.
// error: Process didn't exit successfully: `target/debug/peg01` (exit code: 101)
디버그 모드에서는 런타임 에러
20. 오버플로우 일으키기
fn main() {
let mut x: i64 = i64::max_value();
println!("Max value of the i64 : {}", x);
x += 1;
println!("Now it has been changed to {}", x);
}
// Max value of the i64 : 9223372036854775807
// Now it has been changed to -9223372036854775808
릴리즈 모드에서는 통과
21. 함수도 타입
fn inc(a: isize) -> isize {
a + 1
}
fn dec(a: isize) -> isize {
a - 1
}
fn main() {
let mut fun: fn(isize) -> isize = inc;
println!("fun = inc, fun(1): {:?}", fun(42));
// fun = inc, fun(1): 43
fun = dec;
println!("fun = dec, fun(1): {:?}", fun(42));
// fun = inc, fun(1): 41
}
22. 기본형에도 메소드가 있다
fn main() {
let x: [&str;3] = ["사과", "딸기", "포도"];
let y: [&str;3] = ["사과", "딸기", "포도"];
let msg = match x.eq(&y) {
true => "똑같다",
false => "다르다"
};
println!("두 바구니에 든 물건은 {}", msg);
}
& <- 빌림 연산자. 나중에 알려준다고 했음
Trait 기반 객체지향이라 Class 기반 객체지향인 C++과는 다른 특징
23. Trait
pub trait PartialEq<Rhs = Self> where Rhs: ?Sized {
fn eq(&self, other: &Rhs) -> bool;
fn ne(&self, other: &Rhs) -> bool { ... }
}
• Par%alEq 라는 속성이 있는데
• &Rhs를 인자로 취하는 eq라는 함수를 정의하면
• &Rhs를 인자로 취하는 ne라는 함수를 공짜로 얻을 수 있다
문서 설명에 의하면 ==와 같다고.
24. 다음에 볼 것:
• if
• loops
• 벡터
(여유가 되면)
• 소유권
• 참조와 빌림
• 수명