Top Banner
Rust Programming Language Geveloper 160816
24

Geveloper 160816

Apr 14, 2017

Download

Engineering

Nyeong Ahn
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Geveloper 160816

Rust Programming LanguageGeveloper 160816

Page 2: Geveloper 160816

지난번까지 Rust + Piston으로...

• 창 띄우기

• 창 안에 상자 그리기

• 그린 상자 움직이기

• 키 눌러 움직이기

• 상자 좌우로 기울이기

• 마우스 인식하기

Page 3: Geveloper 160816

지난번까지 Rust + Piston으로...

• 창 띄우기

• 창 안에 상자 그리기

• 그린 상자 움직이기

• 키 눌러 움직이기

• 상자 좌우로 기울이기

• 마우스 인식하기

• 마우스 방향으로 상자 기울이기 << 포기!

Page 4: Geveloper 160816

잠정 포기한 이유

• Piston 라이브러리 자체에 미숙

• Object의 중심을 어떻게 설정하는지 모르겠다.

• 참고할 곳도 없음

• 그럼 API 문서를 봐야 하는데 Rust 언어 자체에 미숙

• 봐도 모르겠다

• 수학을 못 함

Page 5: Geveloper 160816

앞으로 공부할 것

• 언어 공부 먼저

• Rust << 재미

• 공식 책 보고 하루에 2~3 소챕터씩 공부하기

• C++ << 필요

• 개강하면...

Page 6: Geveloper 160816

그래서 공부한 내용:

• 변수 선언

• 함수 선언

• 원시형

Page 7: Geveloper 160816

Rust 변수 선언

• 변수(變數)인데 기본적으로 변(變)할 수 없다.

• mut 키워드로 변할 수 있는 변수를 만들 수 있다.

• 형(type)을 꼭 안 써도 된다. 컴파일러가 추론해준다.

• 초기화 하지 않은 값은 쓸 수 없다.

• 초기화 하고 안 써도 상관은 없는데 이 경우 형 선언을 해줘야 한다. (확보할 메모리 양을 모르니까)

Page 8: Geveloper 160816

Rust 변수 선언

fn main () { let god_movie: &str = "워크래프트: 전쟁의 서막";// ~~~// 변수 선언을 위한 키워드 println!("{}는/은 아주 잘 만든 영화이다.", god_movie);}

Page 9: Geveloper 160816

Rust 변수 선언

fn main () { let god_movie: &str = "워크래프트: 전쟁의 서막";// ~~~~~~~~~// 변수 이름 println!("{}는/은 아주 잘 만든 영화이다.", god_movie);}

Page 10: Geveloper 160816

Rust 변수 선언

fn main () { let god_movie: &str = "워크래프트: 전쟁의 서막";// ~~~~// 변수 자료형 (생략 가능) println!("{}는/은 아주 잘 만든 영화이다.", god_movie);}

Page 11: Geveloper 160816

패턴 매칭을 이용한 선언fn main() { let (h_temp, l_temp) = (33, 26); println!("오늘의 최고 기온은 {}'C이고, 최저 기온은 {}'C이다.", h_temp, l_temp); // 오늘의 최고 기온은 33'C이고, 최저 기온은 26'C이다.}

Page 12: Geveloper 160816

패턴 매칭과 재할당을 이용한 swapfn 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}

Page 13: Geveloper 160816

재할당을 이용했을 때

fn main() { let var = "계절"; println!("너와 함께 물들은 {:p}은 잠겨만가고", &var); // 너와 함께 물들은 0x7fff5a360660은 잠겨만가고 let var = "미열"; println!("느닺없는 {:p}에 나는 허덕이고 있어", &var); // 느닺없는 0x7fff5a3605b8에 나는 허덕이고 있어}

저장되는 메모리가 다르다 => 새 값이 만들어진다

Page 14: Geveloper 160816

mut를 이용했을 때

fn main() { let mut when = "어제"; println!("{:p}도 들었던 그 아티스트는", &when); // 0x7fff54e10660도 들었던 그 아티스트는 when = "내일"; println!("{:p}을 끝으로 해산한다나봐", &when); // 0x7fff54e10660을 끝으로 해산한다나봐}

저장되는 메모리가 같다 => 말 그대로 값이 변한다

Page 15: Geveloper 160816

Rust의 함수

fn inc(x: i32) -> i32 { x + 1}

Page 16: Geveloper 160816

Rust의 함수

fn inc(x: i32) -> i32 { x + 1}

fn dec(x: i32) -> i32 { return x - 1;}

두가지 반환 방식

Page 17: Geveloper 160816

Rust의 기본 자료형• bool, char

• i8, i16, i32, i64, isize

• u8, u16, u32, u64, usize

• f32, f64

• [T;N] (array), &[T] (slice), str

• Tuples, FuncDons

Page 18: Geveloper 160816

C++과 다른 점

• char가 4bytes (UTF-8이라서)

• stdint.h 같은 자료형이 기본 (i32, i64, ...)

• str과 char의 배열은 다름 (UTF-8이 가변 바이트라서)

• 배열의 정의에 갯수도 들어가 있음 ([i32;1]과 [i32;2]는 다른 타입)

• 하스켈, 파이썬 처럼 튜플이 있음

• 함수도 타입임

Page 19: Geveloper 160816

오버플로우 일으키기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)

디버그 모드에서는 런타임 에러

Page 20: Geveloper 160816

오버플로우 일으키기

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

릴리즈 모드에서는 통과

Page 21: Geveloper 160816

함수도 타입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}

Page 22: Geveloper 160816

기본형에도 메소드가 있다fn main() { let x: [&str;3] = ["사과", "딸기", "포도"]; let y: [&str;3] = ["사과", "딸기", "포도"]; let msg = match x.eq(&y) { true => "똑같다", false => "다르다" }; println!("두 바구니에 든 물건은 {}", msg);}

& <- 빌림 연산자. 나중에 알려준다고 했음Trait 기반 객체지향이라 Class 기반 객체지향인 C++과는 다른 특징

Page 23: Geveloper 160816

Traitpub 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라는 함수를 공짜로 얻을 수 있다문서 설명에 의하면 ==와 같다고.

Page 24: Geveloper 160816

다음에 볼 것:

• if

• loops

• 벡터

(여유가 되면)

• 소유권

• 참조와 빌림

• 수명