반응형

[Rust] 18

[Rust] 슬라이스(slices)

슬라이스의 개념을 알아보기 전에 다음 예제를 먼저 살펴보겠습니다. 스트링을 입력 받아서 첫번째 공백 전까지의 단어를 반환하는 함수를 작성해봅니다. fn main() { let str = String::from("ab cde f g"); let w = first_word_length(&str); println!("{}", w); //ab 2글자이므로 2 출력. } fn first_word_length(s:&String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' '{ return i; } } s.len() } first_word_length() 함수에서는 다음과 같은 과정을 거칩..

[Rust] 2023.07.27

[Rust] 참조자(References)와 빌림(Borrowing)

함수에게 값을 사용할 수 있도록 넘겨주되 소유권을 넘기고 싶지 않을 때, 다음과 같이 튜플로 여러 값을 돌려받을 수 있습니다. fn main() { let s1 = String::from("hello"); let (s2, len) = calculate_length(s1); } fn calculate_length(s:String)-> (String,usize){ let length = s.len(); (s, length) } 하지만 이는 조금 과한 작업이고, 러스트는 이처럼 소유권을 넘기고 싶지 않을 때 참조자(references)라 부르는 기능을 사용할 수 있습니다. fn main() { let s1 = String::from("hello"); let len = calculate_length2(&s1);..

[Rust] 2023.07.26

[Rust] 소유권

: 러스트의 가장 유니크한 특성으로, 러스트가 가비지 콜렉터 없이 메모리 안정성을 보장할 수 있도록 해줍니다. 어떤 언어는 프로그램이 실행될 때 사용하지 않는 메모리를 찾는 가비지 컬렉션을 사용하고, 어떤 언어는 프로그래머가 직접 명시적으로 메모리를 할당하고 해제해줍니다. 러스트는 이런 방법을 사용하지 않고, 컴파일 타임에 컴파일러가 체크할 규칙으로 구성된 소유권 시스템을 통해 메모리를 관리합니다. 소유권에 대해 알아보기 앞서 스택과 힙이 무엇인지 짚고 넘어가겠습니다. * 스택과 힙 : 러스트에서는 값이 스택에 있는지, 힙에 있는지에 따라 프로그래머의 결정에 큰 영향을 줍니다. 스택과 힙 둘 다 런타임에 사용할 수 있는 메모리 영역입니다. 스택은 Last in, First out으로, 데이터를 추가하는 ..

[Rust] 2023.07.25

[Rust] 제어문

코드의 실행 흐름을 제어할 수 있는 문법을 제어문이라 합니다. 가장 보편적인 제어문에는 if 표현식과 반복문이 있습니다. 1) if 표현식 fn main() { let number = 3; if number < 5 { println!("condition was true"); } else if number == 5 { println!("number is 5"); } else { println!("condition was false"); } } if 식은 조건을 붙이고 조건이 true가 될 때 중괄호 안의 코드를 읽습니다. else 식은 if 식이 false일 때, else if 식은 if 식 조건문에 포함되지 않는 또 다른 조건을 제시합니다. if 식에 쓰이는 조건은 반드시 bool을 반환해야 합니다. l..

[Rust] 2023.07.20

[Rust] 함수 동작 원리

fn 키워드는 새로운 함수의 선언을 가능하게 하고, 중괄호는 컴파일러에게 함수의 시작과 종료 지점을 알려줍니다. Rust 코드는 Snake case 규칙으로 함수 이름을 네이밍합니다. * Naming 규칙(camel, kebab, pascal, snake case) : https://geukggom.tistory.com/251 fn main() { println!("Hello, world!"); snake_case_function(); } fn snake_case_function() { println!("Snake case"); } 1) 함수 매개변수 parameter(매개변수)와 타입 argument(인수)를 혼용해서 사용해선 안 됩니다. 아래 예시에서 x가 매개변수, 숫자 5가 인수입니다. fn ma..

[Rust] 2023.07.19

[Rust] 데이터 타입

Rust에서 사용되는 모든 값들은 타입을 가지며, 반드시 컴파일 시에 정해져있어야 합니다. let guess = "42".parse().expect("Not a number"); 위와 같이 코드를 입력하면 타입 명시를 하지 않았다는 에러(consider giving 'guess' a type)가 뜹니다. 따라서 다음과 같이 타입을 명시하여 코드를 입력해주어야 합니다. let guess: u32 = "42".parse().expect("Not a number"); // u32는 부호가 없는 32비트의 변수 [스칼라 타입] 스칼라는 하나의 값으로 표현되는 타입으로, Rust는 정수형, 부동소수점 숫자, boolean, 문자 4가지 스칼라 타입을 가지고 있습니다. 1) 정수형 : signed는 부호가 있는 타..

[Rust] 2023.07.18

[Rust] 변수와 가변성

Rust의 기본 변수는 C#과는 달리 불변성입니다. Rust는 컴파일러가 불변 변수 값에 대한 보증을 해주는데, 이는 안전성과 동시성이라는 장점을 취하기 위해 강제하는 요소입니다. let x = 5; println!("x : {}", x); x = 6; println!("x : {}", x); 다음과 같이 코드를 작성한 후 실행을 하면 에러가 출력됩니다. 이는 불변 변수에 두번째 값을 할당하려 했기 때문입니다. 가변 변수로 만들어주기 위해서는 mut를 입력해주어야 합니다. let mut x = 5; 데이터 구조체의 규모가 작을수록 새 인스턴스를 생성해 할당하고, 클수록 가변한 인스턴스를 사용하는 것이 더 합리적일 수 있습니다. [변수와 상수의 차이점] 상수로 불변성 변수와 마찬가지로 값의 변경이 허용되지..

[Rust] 2023.07.17

[Rust] cargo

Cargo는 러스트의 빌드 시스템 및 패키지 매니저입니다. Cargo는 작성한 코드가 의존하고 있는 라이브러리를 다운로드 해주고, 코드와 라이브러리를 빌드해주는 등의 역할을 합니다. Rust 폴더에 카고를 이용해 새로운 프로젝트를 만들기 위해 다음과 같이 입력해줍니다. cd ~/Rust cargo new 프로젝트이름 --bin --bin은 라이브러리가 아닌 실행 가능한 형식의 파일(바이너리)로 만들어줍니다. 카고로 러스트 프로젝트를 만들게 되면 그 안에 Cargo.toml, src 디렉토리, git 디렉토리가 생깁니다. 깃 저장소를 자동으로 생성해줍니다. Cargo.toml은 프로젝트의 설정 파일로, 내부 구조는 다음과 같이 되어 있습니다. [package] name = "gussing-game" ver..

[Rust] 2023.07.16
반응형