본문 바로가기

Rust

(18)
[Rust] enum 열거형 코드를 작성할 때 구조체보다 간결하게 사용할 수 있는 열거형에 대해 알아보겠습니다. IP 주소는 v4와 v6가 존재합니다. 이를 열거형으로 표현해보겠습니다. enum IpAddrKind { V4, V6, } 사용은 다음과 같이 가능합니다. let four = IpAddrKind::V4; let six = IpAddrKind::V6; IpAddrKind라는 enum은 데이터 타입으로서 함수의 인자로도 쓰일 수 있습니다. fn route(ip_type: IpAddrKind) { } route(IpAddrKind::V4); route(IpAddrKind::V6); 열거형에는 데이터 또한 포함할 수 있습니다. enum IpAddr { V4(String), V6(String), } let home = IpAddr..
[Rust] 구조체의 메소드 러스트에서는 구조체에서 사용할 수 있는 함수를 정의할 수 있습니다. 이를 메소드라고 합니다. struct Rectangle { length: u32, width: u32, } impl Rectangle { fn area(&self) -> u32 { self.length * self.width } } fn main() { let rect1 = Rectangle { length: 50, width: 30 }; println!( "The area of the rectangle is {} square pixels.", rect1.area() ); } 메소드는 구조체 밖에서 정의되고 impl [구조체명]로 선언할 수 있습니다. 메소드의 인자로 존재하는 &self는 메소드를 호출하는 구조체 자체입니다. self.l..
[Rust] 참조자(References) 와 빌림(Borrowing) 참조자와 빌림에 대해 알아보겠습니다. 참조자는 C, C++에서 포인터와 비슷하다고 생각하시면 이해하기 쉬울 것 같습니다. fn main() { let s1 = String::from("hello"); let len = calculate_length(&s1); println!("The length of '{}' is {}.", s1, len); } fn calculate_length(s: &String) -> usize { s.len() } 참조자는 &을 사용해 나타냅니다. 저번에 배웠던 소유권에 따르면 s1을 calculate_length에 전달한다면 소유권은 calculate_length로 넘어가고 println! 에서 s1에 대한 출력은 에러를 발생시킬 것입니다. 하지만 참조자(&)를 이용해 잠깐 c..
[Rust] 소유권(Ownership) Rust의 핵심기능이라고 할 수 있는 소유권(Ownership)에 대해 알아보겠습니다. 모든 프로그램은 실행하는 동안 컴퓨터의 메모리를 사용하는 방법을 관리해야 합니다. 몇몇 언어들은 프로그램이 실행될 때 더 이상 사용하지 않는 메모리를 끊임없이 찾는 가비지 컬렉션을 갖고 있습니다. 또 다른 언어들에서는 프로그래머가 직접 명시적으로 메모리를 할당하고 해제해야 합니다. 하지만 러스트는 제3의 접근법을 이용합니다. 소유권이라는 시스템을 통해 더 효율적인 코드를 작성할 수 있게 합니다. 소유권 규칙 소유권에는 다음과 같은 규칙이 존재합니다. 러스트의 각각의 값은 해당 값의 오너(owner)라고 불리는 변수를 갖고 있다. 한 번에 딱 하나의 오너만 존재할 수 있다. 오너가 스코프 밖으로 벗어나는 때, 값은 버려..
[Rust] 구조체 구조체는 튜플과 비슷하게 서로 다른 데이터 타입의 구성요소들을 저장할 수 있습니다. 일반 구조체 선언 struct User { username: String, email: String, count: u64, active: bool, } struct 키워드로 선언을 하고 구조체의 이름의 첫 글자는 대문자로 시작합니다. 구조체 안의 필드에는 구성요소들을 정의합니다. 예시 let user1 = User { username: String::from("dean"), email: String::from("dean@example.com"), count: 1, active: true, }; //정의된 구성요소의 순서가 같지 않아도 상관 없음 let user2 = User { email: String::from("dea..
[Rust] 데이터 타입 Rust에서 사용되는 데이터 타입에 대해 알아보겠습니다. 데이터 타입은 크게 스칼라와 컴파운드라는 두 종류로 나누어질 수 있습니다. 스칼라 스칼라는 하나의 값으로 표현되는 타입들입니다. 여기에 포함되는 데이터 타입은 정수형, 부동소수점 숫자, boolean, 그리고 문자입니다. 정수형 정수형 데이터타입은 사용되는 비트 수, 부호의 유무에 따라 나누어집니다. 각각 부호의 유무는 i, u로 비트 수는 뒤에 8, 16, 32, 64와 같이 나누어지며 size 같은 경우는 사용자의 컴퓨터 환경에 따라 달라집니다. 컴퓨터가 32-bit, 64-bit 아키텍처인지에 따라 32비트 또는 64비트를 사용하게 됩니다. 일반적으로는 i32를 사용하는 것이 가장 좋은 선택입니다. 부동 소수점 Rust에서 소수점을 갖는 부동..
[Rust] 제어문(조건문, 반복문) Rust에서 사용할 수 있는 조건문은 if가 있고 반복문은 loop, while, for가 있습니다. 조건문 조건문 if의 사용은 다른 언어와 별반 다르지 않습니다. fn main() { let number = 6; if number % 4 == 0 { println!("number is divisible by 4"); } else if number % 3 == 0 { println!("number is divisible by 3"); } else if number % 2 == 0 { println!("number is divisible by 2"); } else { println!("number is not divisible by 4, 3, or 2"); } } c, c++ 등에서 쓰이는 if 와 다른..
[Rust] 변수 가변성(Mutability) Rust에서의 변수 사용에 대해서 알아보겠습니다. Rust에서 변수는 기본적으로 불변성을 가지고 있습니다. 불변성이란 자바에서 final과 같이 한번 정의되면 변경할 수 없도록 하는 것이죠. 예시를 보겠습니다. fn main() { let x = 5; x = x + 5; // error! } 일반적인 다른 언어들처럼 변수 x를 선언하고 x의 값을 변경하려고 하면 컴파일러는 에러를 발생시킵니다. 변수 x의 값을 변경시키기 위해서는 변수명 앞에 mut을 추가해줍니다. fn main() { let mut x = 5; x = x + 5; //Ok! } mut이라는 접두어를 변수 선언에 적어주면 이 변수는 변경될 수 있는 변수라고 선언하는 것이며 자유롭게 데이터 수정이 가능합니다. 또 다른 방법으로는 재정의를 통..