매크로 매크로는 다른 코드를 작성하는 코드이다. 이 개념은 메타 프로그래밍으로 잘 알려져 있다. 코드의 내용을 출력해주는 print!와 Vector배열을 정의하는 vec!도 매크로이다. 이 모든 매크로들은 수동으로 코드를 작성하지 않고도 많은 코드를 생산할 수 있다. 메타프로그래밍은 함수와 비슷하게 작성해야 할 코드의 양을 줄여주지만, 함수가 할 수 없는 일도 할 수 있다. 함수 시그니처는 해당 함수가 갖는 parameter와 갯수 타입을 선언해야 하는 반면, 매크로는 parameter의 개수를 가변적으로 처리할 수 있다. // ex println!("hello"); println!("{}", hello); 함수와 매크로의 또다른 차이는, 매크로 정의는 함수와 달리 모듈의 "네임스페이스에 소속되지 않는다..
vector는 한번에 하나의 타입만 보관할 수 있다. 만약 라이브러리 사용자가 특정 상황에서 유효한 타입 묶음을 확장할 수 있도록 하길 원할 수 있다. 예를 들어보자 아이템 리스트에 걸쳐 각각에 대하여 draw메소드를 호출하여 이를 화면에 그리는 GUI 도구를 활용할 수 있다. GUI도구를 만든다는 가정을 해보자. draw라는 메소드를 가지고 있는 component라는 객체를 정의한다. 다른 클래스들은 Component를 상속받고 draw메서드를 물려받게 된다. 이들은 각각 draw 메소드를 오버라이딩하여 고유동작으로 정의할 수 있으나, framework는 모든 유형을 마치 Component인 것 처럼 다룰 수 있고 draw를 호출할 수 있다. rust는 상속이 없으므로 사용자들이 새로운 타입을 정의하고..
러스트에서 모든 참조자는 life time(이하 라이프타임)을 갖는다. 여기서 라이프타임은 참조자가 유효한 scope을 의미한다. 대부분 경우에서 타입이 추론되는것과 마찬가지로, 대부분 경우 라이프타임 또한 암묵적이며, 추론된다. 여러가지 타입이 가능하기 때문에 우리가 타입을 명시해야 하는 때와 비슷하게 참조자의 라이프타임이 몇몇 다른 방식으로 연관될 수 있는 경우들이 있으므로, rust는 우리에게 제네릭 라이프타임 파라미터를 이용하여 이 관계들을 명시하길 요구하며 런타임에 실제 참조자가 확실히 유효하도록 한다. 라이프타임은 타 언어와는 다른 독특한 기능이다. 댕글링 참조자 방지 라이프타임의 주목적은 댕글링 참조자(dangling reference)를 방지하는 것이다. 댕글링 참조자는 프로그램이 참조하기..
trait은 다른 종류의 추상화를 사용할 수 있도록 해준다. 이는 타입들이 공통적으로 갖는 동작에 대하여 추상화 하도록 해준다. trait이란 러스트 컴파일러에게 특정한 타입이 갖고 다른 타입들과 함께 공유할 수도 있는 기능에 대하여 정의한다. trait은 다른언어들의 interface와 기능이 유사하지만 몇가지 다른점이 있다. 트레잇 정의하기 어떤 타입의 동작은 해당 타입 상에서 호출할 수 있는 메서드의 집합이다. 만약 서로 다른 타입에 대해 모두 동일한 메서드를 호출할 수 있다면 이 타입들은 동일한 동작을 공유한다. 트레잇의 정의는 어떠한 목적을 달성하기위해 필요한 동작의 집합을 정의하기위해 메서드 시그니처들을 함께 묶는 방법이다. 예를 들어 신문기사 생각했을 때, 다양한 종류와 양을 갖는 여러가지 ..
반복자 패턴은 일련의 항목에 대하여 순서대로 어떤 작업을 수행할 수 있도록 해준다. 러스트에서 반복자는 항목들을 사용하기위해 반복자를 소비하는 method를 호출하기 전까지 아무런 동작을 하지 않는다. 예를 들어보자. let v1 = vec![1, 2, 3]; let v1_iter = v1.iter(); // v1_iter에는 Iter([1, 2, 3])가 들어있다. 위의 코드는 v1 변수에 vector를 할당한것이고, v1_iter변수에 v1의 반복자를 할당해둔 것이다. (v1_iter는 Iter([1, 2, 3])로 출력된다.) iter를 이용하여 단지 할당만 했을 뿐 어떠한 일도 일어나지 않는다. 이러한 반복자를 사용하기 위해 다른 조치가 필요하다. let v1 = vec![1, 2, 3]; let..
Rust의 Closure는 변수에 저장하거나, 다른 함수에 인자로 넘길 수 있는 익명함수이다. 클로저의 특성은 호출되는 Scope에서 클로저함수의 Lexical 환경을 사용할 수 있다. javascript에서도 클로저 함수가 있는데, 다른 Scope에서 클로저의 환경을 사용할 수 있다는 개념이 비슷해보인다. Closure의 Use case 운동 관리 앱을 만든다고 가정했을때, 필요한 기능은 아래의 내용으로 가정한다. - 평소 운동 강도가 일정 이하일 경우 운동한 내용 출력. - 평소 운동 강도가 일정 이상 넘어가고 랜덤 숫자와 일치할 경우 금일 운동 제외. - 랜덤 숫자와 일치하지 않을 경우 금일 운동한 시간 출력 필요한 기능을 구현하기 위해 프로그램에서 돌아갈 간단한 알고리즘을 만들었다. use std..
https://doc.rust-lang.org/std/vec/struct.Vec.html std::vec::Vec - Rust doc.rust-lang.org Rust Vector Container 정리 - Vector는 메모리 상에 서로 이웃하도록 모든 값을 집어넣는 단일 데이터 구조 안에 하나 이상의 값을 저장. - Vector는 같은 타입의 값만을 저장. - index로 데이터에 접근이 가능하다. 1. Vector 생성자 - 다른 변수와 마찬가지로 let, let mut 키워드로 생성하며, 제너릭 타입을 입력한다. (여기서는 i32 사용) let mut vec: Vec = Vec::new(); let mut vec: Vec = vec![]; - 변수 선언시 데이터를 할당하여 초기화 할 수 있다. /..
선언 //선언 let mut tmp = String::from(""); 문자열 casting let mut s = String::from(""); let mut c = 'c'; s = c.to_string(); println!("char to string : [{}]", s); let mut i = 1; s = i.to_string(); println!("i32 to string : [{}]", s); let mut f = 1.0; s = f.to_string(); println!("f64 to string : [{}]", s); i = s.parse().unwrap(); println!("string to i32 : [{}]", i); f = s.parse().unwrap(); println!("str..