geveloper 160816

24
Rust Programming Language Geveloper 160816

Upload: nyeong-ahn

Post on 14-Apr-2017

45 views

Category:

Engineering


2 download

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

• 벡터

(여유가 되면)

• 소유권

• 참조와 빌림

• 수명