![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bQxhiX/btq11MTAVuV/kwJYz0xzczX6W8tyDCzdb1/img.png)
구조체 구조체는 tuple과 비슷하게, 구성요소들은 각자 다른 타입을 지닐 수 있다. 또한 각 구성요소들을 명명하여 값이 의미하는 바를 명확히 할 수 있다. 구조체 명명 규칙은 Upper Case로 작성 struct 생성 방법 ex) 유저 정보 struct User{ username: String, email: String, sign_in_count: u64, active: bool } 정의한 구조체를 사용하기위해 각 필드의 값을 명세한 instance를 생성해야 함. (구조체 정의 시 필드의 순서는 상관 없음) let mut user1 = User{ email : String::from("user1@google.com"), username : String::from("user1"), active: tr..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/nGMTo/btq1JUTxFxr/KQoFSv0twvJCqcX9JOO8Uk/img.png)
소유권을 갖지 않는 또다른 데이터 타입은 슬라이스이다. 슬라이스는 collection 전체가 아닌 collection의 연속된 일련의 요소들을 참조할 수 있게 함. //소유권을 갖지 않는 데이터타입. fn first_word(s : &String) -> usize { //바이트 배열로 변환 let bytes = s.as_bytes(); //iter() : 반복자 //enumerate() : 튜플형식으로 반환 //bytes의 인덱스 i, 참조값 &item for(i, &item) in bytes.iter().enumerate(){ if item == b' '{ return i; } } s.len() } pub fn run(){ let mut s = String::from("te st"); let len =..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cavSQu/btq1MrIxoOY/Yko3wnB9mQwGku8TbqKwJk/img.png)
참조자(references) 다음의 코드는 함수에 참조자를 인자값으로 넘겨준다. pub fn references(){ let s1 = String::from("hello"); let len = calculate_length(&s1); println!("{}, {}", s1, len); } fn calculate_length(s: &String) -> usize{ return s.len(); } 여기서 calculate_length 함수에 s1을 넘기는게 아닌 s1의 참조자를 넘겼기 때문에 함수 호출 이후에도 s1을 그대로 사용할 수 있다. 참조자를 활용하면 소유권을 넘기지 않고 값을 참조할 수 있다. &이 참조자이다 참조자가 가리키는 값은 참조자가 스코프를 벗어났을 때에도 메모리가 해제되지 않는다. fn..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/UpTSH/btq1FCcFia4/9OIyYAdntAePVedozc2Y70/img.png)
소유권이란? 메모리를 관리하는 Rust언어 특성이다. C/C++은 메모리를 직접 할당하고 해제하거나 Java, C# 등은 GC를 이용하여 메모리를 관리한다. Rust는 소유권이라는 특성으로 메모리 관리가 가능하다. 소유권의 규칙 1. Rust의 각각의 값은 해당 값의 owner라고 불리는 변수를 가지고 있다. 2. 한번에 딱 하나의 owner만 존재할 수 있다. 3. owner가 scope 밖으로 벗어날 때 값은 버려진다. 소유권의 예제 1. 변수의 스코프 아래의 함수를 실행해보면 "hello"가 출력된다. 스코프 내에 있는 변수의 유효범위는 변수가 선언된 시점부터 스코프의 밖으로 벗어날 때 까지 지속된다. 이는 타 프로그래밍 언어와 비슷하다. pub fn ownership(){ let s = "hell..
1. if 구문 if구문은 다음과 같이 사용할 수 있다. 다음 코드는 3을 출력한다. fn main() { let number = 3; if number > 5 { println!("5"); }else { println!("{}", number); } } let 구문에서 if를 사용할 수 있다. 다음의 코드는 6을 출력한다. 3항 연산자와 비슷한 느낌이다 fn main() { let condition = false; let number = if condition { 5 }else{ 6 }; println!("{}", number); } 요렇게도 쓰기 가능. 각 if문 내에 스코프에 반환값을 주면 된다. 반환값이 없으면 오류가 발생한다. fn main() { let number = if 1 < 0 { 5 ..
fn 키워드를 이용하여 함수를 생성한다. fn function(){ println!("another function"); } fn main(){ function(); } 아래의 코드는 각각 5, 와 4를 return한다. y의 값은 내부에 선언된 x의 값에서 1이 더해진 값을 출력한다. 반환값은 세미콜론을 입력하지 않는다. y스코프 외부의 x는 그대로 값이 유지된다. fn main() { let x = 5; let y = { let x = 3; x + 1 }; println!("{}, {}", x, y); } return값을 주기위해 함수에 "->" 키워드를 사용한다. typescript, kotlin의 ':' 키워드랑 비슷한 느낌. fn main() { println!("{}", five()); } f..
rust는 type명시형 언어이다 컴파일 시 반드시 데이터타입이 정해져 있어야 된다. rust의 타입은 크게 스칼라와 컴파운드 둘로 나뉜다. 스칼라 타입 스칼라는 하나의 값으료 표현되는 타입이다. Rust는 정수형, 부동소수점, 숫자, 문자, boolean 네가지 스칼라 타입을 보유하고 있다. 1. 정수형 소수점이 없는 숫자이다. -(2^n - 1) ~ (2^n-1 - 1) 의 범위이다(n: 비트) Length Signed Unsigned 8비트 i8 u8 16비트 i16 u16 32비트 i32 u32 64비트 i64 u64 arch isize usize 2. 부동 소수점 타입 f32, f64가 있다. 각각 32비트, 64비트이며 float 타입이라고 이해하면 된다. 3. boolean 타입 true, ..
변수 선언 let 키워드를 이용하여 선언 기본적으로 불변성이며 가변적으로 사용하고 싶으면 mut 키워드 사용 let var1: i32 = 1; let mut var2: i32 = 2; var2 = 3; 상수 상수도 값이 불변하지만 변수와의 차이점은 1. const 키워드 사용 2. mut 비허용 3. 상수 표현식만 설정 가능, 함수호출의 결과값이나 그 외 실행시간에 의해 결정되는 값은 설정 불가능. 그리고 상수 명명 규칙에 따라 모든 단어를 대문자로 사용한다. const VAR: u32 = 100000; Shadowing 이전에 선언한 변수와 같은 이름의 새로운 변수를 선언할 수 있고 새로운 변수는 이전 변수를 shadow 함. mut으로 선언하는 것과의 차이점은 불변성을 유지한다는 점, shadowin..