![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dBGw9e/btq4YPmZ0nv/dCRRKbu2lGbLpNgkEy6Pl1/img.png)
포인터는 메모리의 주소값을 담고있는 변수이다. 주소값은 다른 데이터를 가리킨다. (참조) Rust의 가장 흔한 종류의 포인터는 참조자인데 & 키워드를 이용하고 이들이 가리키고 있는 값을 빌린다. 스마트 포인터 포인터 처럼 작동하지만 추가적인 기능이 있는 데이터 구조이다. C++에서 유래 되었으며, 메모리 누수(memory leak)로 부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공한다. 포인터 처럼 동작하며 사용이 끝난 메모리를 자동으로 해제해준다. C++에서는 new 키워드를 사용하여 기본 보인터가 실제 메모리를 가리키도록 초기화 한 후, 기본 포인터를 스마트 포인터에 대입하여 사용한다. 정의된 스마트 포인터의 수명이 다하면 소멸자는 delete 키워드를 사용하여 자동으로 메모리를 해제한다..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/qO8Da/btq3otYWFbm/73N9SFVfD6oGByiTP5Zkg1/img.png)
vector Vec(vector)에 대하여 알아보자 vector는 memory상 서로 이웃하도록 모든 값을 집어넣는 단일 데이터 구조이며 하나 이상의 값을 저장할 수 있도록 해준다. vector는 같은 타입의 값만 저장가능하다. vector를 선언하는 방법 let v : Vec = Vec::new(); 위의 코드에서 vector를 선언할 때, 아무런 값도 할당도 하지 않았기 때문에, rust는 저장하고자 하는 요소의 type이 어떤 것인지 알지 못한다. vector는 제너릭을 이용하여 구현되었고 어떠한 값을 할당하지 않고 선언할 때는 제너릭 내에 type을 작성해주면 된다. let v = vec![1, 2, 3]; let v : Vec= vec![1, 2, 3]; vector에 값을 push하고싶은 경우..
if와 let을 조합하여 하나의 패턴만 매칭할 수 있도록 하여 코드를 간결화 한다. Option 값을 매칭하지만 그 값이 3일 경우에만 출력하는 코드이다. pub fn run(){ let some_value = Some(3u8); match some_value{ Some(3) => println!("three"), _ => () } } 위의 코드를 아래의 코드로 간소화 할 수 있다. pub fn run(){ let some_value = Some(3u8); if let Some(3) = some_value{ println!("three") } } 하지만 default검사를 하지 않는다. 이에 대해서는 적절히 사용할 필요가 있다. (default를 검사 할 필요가 없는 경우는 그냥 무시해도 되는 상황 등)..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b08IO6/btq2dCJUx8O/I2LQZG8DfmHXhWKt0sn321/img.png)
match match라는 제어문이 있다. 일련의 패턴에 대해 어떤 값을 비교한 뒤 어떤 패턴에 매치되었는지에 따라 코드를 제어한다. match 표현식을 코인 분류기라고 생각했을 때 match를 이용하여 코인에 따른 번호를 return하는 코드이다. pub fn run(){ let coin = Coin::BitCoin; println!("{}",value_in_coin(coin)); } enum Coin{ BitCoin, Ethereum, AltCoin, Ripple } fn value_in_coin(coin: Coin) -> u32{ match coin{ Coin::BitCoin => 1, Coin::Ethereum => 2, Coin::AltCoin => 3, Coin::Ripple => 4 } } m..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/5KMVC/btq2b2vAtu6/xwjHUkKkT82ujVFdMhELSk/img.png)
열거형 enum 키워드를 이용하여 작성한다. 구조체보다 유용하고 적절하게 사용될 상황이 있다. 예를들면 IP주소의 버전을 다룰때를 생각해봤을때, ipv4, ipv6가 있다. 모든 가능한 값들을 나열할 수 있으며 이를 열거라고 한다. IP주소는 v4, v6 중 하나이며 동시에 두 버전이 될 수 없다. 이 경우 열거형이 적절하다. 열거형의 값은 variants 중 하나만 사용할 수 있다. IP주소라는 같은 카테고리 내 다른버전일 경우에 대한 예시이다. enum IpAddrKind{ V4, // variants V6 } IpAddrKind라는 열거형 타입이고, 각각 ipv4, ipv6를 나타낸다. 열거형 값 enum IpAddrKind{ V4, // variants V6 } pub fn run(){ let i..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/yfRRq/btq151DL2wC/m1RIODmXodcN5nsoXRk3TK/img.png)
method - 함수와 유사하게 fn키워드로 선언되고, parameter, return값이 있으며, 호출이 가능하다. - 함수와 다른점은 구조체의 내용안에 정의되며(열거형, trait객체안에도 정의 가능), 첫번째 parameter는 항상 self이다 - selft는 해당 method가 호출되고 있는 구조체의 인스턴스이다. struct Rectangle{ length : u32, width : u32 } pub fn run(){ let rect1 = Rectangle{ length: 50, width : 30 }; println!("{}", rect1.area()); } impl Rectangle{ fn area(&self) -> u32{ self.length * self.width } } Rectang..