언어/Rust

· 언어/Rust
Rust 공식 문서를 참고한 글입니다. 러스트의 표준 라이브러리에 정의되어 있는 collection는 하나의 자료형에 여러 개의 값을 저장한다. build-in array나 튜플 타입과는 다르게 collection들이 가리키는 데이터들은 Heap 영역에 저장된다. 이 말은 데이터의 양이 컴파일 시점에 결정되지 않아도 되고, 프로그램 실행 중에 변화할 수 있다는 뜻이다. 1. 벡터 Vector벡터 자료형은 메모리에서 동일한 자료형 값들을 연속된 공간에 저장하는 컬렉션이다. 이는 Vec로 표기하고 Vec::new를 통해 생성한다. 이때, T에 해당하는 자료형이 무엇인지 알리기 위해서 자료형을 명시해야 한다. 벡터 선언그러나 대부분 초기값과 함께 Vec를 생성하기 때문에 값의 타입을 유추할 수 있다. 그래서..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다. 우리는 지금까지 하나의 파일에서 하나의 모듈 안에 프로그램을 작성했다. 만약에 프로그램이 더 커지면 여러 개의 모듈, 여러 개의 파일들로 분리해야 할 것이다. 하나의 패키지는 여러 개의 바이너리 크레이트를 포함할 수 있고 필요에 따라서 하나의 라이브러리 크레이트를 포함할 수 있다. 약간 어려운 감이 있지만 패키지 관리에 필요한 개념들을 알아보도록 하자. 우리가 앞으로 배울 모듈 시스템에는 아래와 같은 개념이 포함된다. Packages : 크레이트를 빌드, 테스트, 공유할 수 있는 기능Crates : 라이브러리나 실행 파일을 생성하는 모듈 트리Modules과 use : 구조, 범위, 경로의 접근성 제어Paths : 구조체, 함수, 모듈 등 이름을 결정하는 방식 1. ..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다. 열거형 Enum우리가 이전에 Rectangle이라는 구조체를 선언하고 width, height 필드를 가지도록 했다. 그런데 Rust에서는 구조체보다는 enum 을 사용하는 것이 더 적절하다. 왜 구조체보다 열거형이 적절한지 알아보자. 우리가 IP 주소를 v4 또는 v6을 사용한다고 할 때, 아래처럼 나타낼 수 있다.enum IpAddrKind { v4, v6}  이것을 사용하려면, IpAddrKind::v4로 접근할 수 있다. 이것을 사용해서 함수에 적용할 수도 있다. // 함수 정의fn route(ip_kind: IpAddrKind) {}// 함수 호출route(IpAddrKind::V4);route(IpAddrKind::V6); IP 주소 값은 열거형과 ..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다. 메서드메서드는 함수와 유사하게 파라미터를 가지면서 값을 반환할 수 있고 호출되면 그에 해당하는 동작을 할 수 있다. 그러나 메서드는 구조체의 context 안에 선언되고 첫 파라미터는 항상 self여야 한다. 약간 어려우니까 실제 예제를 통해서 이해해보자. #[derive(Debug)]struct Rectangle { width: u32, height: u32,}impl Rectangle { fn area(&self) -> u32 { self.width * self.height }}fn main() { let rect1 = Rectangle { width: 30, height: 50, }; ..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다. 1. 구조체구조체는 튜플과 유사하게 여러 자료형을 하나의 자료형으로 한 곳에 묶어서 만드는 자료형이다. 튜플과 다른 점은 순서에 의존하지 않고 접근할 수 있다는 장점이 있다. 구조체 정의구조체를 정의할 때는 struct라는 키워드를 사용한다. 구조체 내부의 자료들은 Field라고 표현하며 이름:자료형으로 표현된다.struct User { active: bool, username: String, email: String, sign_in_count: u64,}  인스턴스 생성이렇게 정의한 구조체를 사용하려면, 구조체 인스턴스를 생성해야 한다. 구조체 안에 key:value 쌍을 만들면 된다. 각 필드의 이름을 통해서 구분이 되기 때문에 정의한 순서..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다. Slice 자료형슬라이스 자료형이란 배열이나 문자열과 같은 컬렉션을 일부 참조할 수 있게 하고, 소유권을 갖지 않아도 복사 없이 빠르게 접근할 수 있도록 하는 것이다. 첫번째 단어의 마지막 글자 인덱스를 반환하는 프로그램 예제를 살펴보자. 반복문을 통해 문자열을 탐색하며 띄어쓰기를 만나면 인덱스를 반환하는 방식이다.  fn first_word(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return i; } } s.len()}문자열의 마지막 인..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다. 변수를 바인딩해 복사가 아닌 이동을 하는 경우에는 소유권이 이전되어 접근할 수 없다. 함수에서 반환된 이후에도 그 값을 사용하고 싶다면, 반환값으로 전달해서 소유권을 다시 이전하는 방법도 있다. Rust는 참조(Reference)를 통해 소유권을 가져가는 것이 아니라, 대여할 수 있도록 한다. 1. 참조 Reference참조란 포인터와 유사하게 해당 주소에 저장되어 있는 데이터에 접근해 읽어올 수 있다. 이때, 소유권은 넘어가지 않는다. 따라서 함수를 호출한 이후에도 해당 변수를 계속해서 사용할 수 있다. 참조할 때는 매개변수 자료형 앞에 & 를 붙여서 소유권을 가진 변수가 그 범위를 벗어나도 drop 함수를 호출하지 않는다. 예제를 살펴보자.fn main() { ..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다. Ownership소유권(ownership)은 Rust에서 메모리를 관리하는 방식을 규정하는 일련의 규칙이다. 모든 프로그램은 실행 중 컴퓨터 메모리를 관리해야 하는데, 몇몇 언어는 실행 중에 사용되지 않는 메모리를 찾는 방식을 사용하기도 하고, 프로그래머가 명시적으로 메모리를 할당하고 해제하는 경우도 있다. Rust는 이와 달리, Owner System을 통해 관리되고 컴파일러가 소유권 규칙을 감시하기 때문에, 규칙을 하나라도 어긋나면 컴파일되지 않는다.  소유권 규칙 Ownership ruleRust의 모든 값은 owner이 존재한다.한 순간에 한 owner만 존재할 수 있다. owner이 해당 범위를 벗어나면, 그 값은 제거된다. 변수 범위 Variable Sc..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다.  프로그램 흐름을 제어하는 방법은 특정 조건이 참일 때만 코드를 수행하거나 특정 조건을 만족하는 동안에만 코드를 수행하도록 하는 것이다. 이를 구현하는 방법이 if 와 loops를 사용하는 것이다. 1. if 표현식if 표현식은 조건에 따라서 코드를 분기할 수 있게 한다.  fn main() { let number = 3; if number  if 후에 조건을 붙여 조건문을 시작하고, number 이 5보다 작은지 확인한다. 조건을 만족하지 않으면 else 구문으로 처리된다. 이때 if 표현식을 arms라고 표현하는데, match 표현식과 유사하기 때문이다.  만약에, number fn main() { let number = 3; if numb..
· 언어/Rust
Rust 공식 문서를 참고한 글입니다. 함수우리가 프로그램의 시작점을 선언할 때 main이라는 함수를 fn을 사용해 정의하며, {} 안에 함수 body를 넣는다는 것을 이미 학습한 바 있다. 변수명처럼 함수 이름도 소문자로 snake case를 사용한다.  fn main() { println!("Hello, world!"); another_function();}fn another_function() { println!("Another function.");} 함수를 정의하려면 fn 뒤에 함수 이름과 {} 안에 함수의 기능을 작성한다. 중괄호를 통해서 컴파일러에게 함수의 시작과 끝을 알려주는 것이다. 또한 C언어는 함수의 선언 순서가 중요하지만 Rust는 중요하지 않다. 그래서 위 프로그램..
소-은
'언어/Rust' 카테고리의 글 목록