Rust, 쉽게 하자!

Rust 57

[Rust] Trait

1. Trait 트레이트는 다른 언어에서 인터페이스라고 불리는 기능과 비슷합니다. 영어 단어 trait는 “특성, 특징”이라는 뜻을 가지고 있습니다. 특히 상속되는, 유전적인 특성을 의미합니다. 인터페이스의 역할은 인터페이스를 상속하는 클래스나 구조체에서 반드시 특정한 기능(함수)을 구현하도록 강제하는 것입니다. 인터페이스에는 함수가 구현되어 있지 않고 시그니처만 있습니다. 즉 설계도만 있습니다. 트레이트도 마찬가지의 방법으로 사용합니다. 다른 점이 있다면 Rust의 트레이트에는 바디 부분을 미리 구현해 두고 사용할 수 있습니다. Rust에서 트레이트는 데이터 타입을 대상으로 구현됩니다. 데이터 타입에는 Rust가 기본적으로 제공하는 데이터 타입 외에 사용자가 만든 struct와 enum이 포함됩니다. ..

Rust 입문 2022.10.13

[Rust] Generic

1. Generic 제네릭은 여러 데이터 타입을 일반화해서 한 번에 구현할 수 있도록 하는 기능을 말합니다. 제네릭은 다른 언어에서도 많이 사용 되기 때문에 Rust에만 있는 특별한 기능은 아닙니다. 제네릭을 설명할 때 흔하게 볼 수 있는 예시를 Rust 코드로 만들어 보겠습니다. fn add(x:i32, y:i32)->i32{ x + y } fn add(x:f64, y:f64)->f64{ x + y } fn main() { let res1 = add(1,2); let res2 = add(3.0,4.0); println!("integer:{}, float:{}", res1, res2); } // 출력 ...에러 ..`add` must be defined only once in the value names..

Rust 입문 2022.10.12

[Rust] use 사용하기

4. use 사용하기 모듈에 포함된 자식 모듈이나 함수를 사용할 때는 “::” 기호를 사용합니다. 다음과 같은 모듈 구조를 가지고 있다고 가정하겠습니다. mod first { pub mod second { pub mod third { pub fn do_something() { println!("do something!"); } } } } 이 모듈 구조를 사용해 보겠습니다. fn main(){ first::second::third::do_something(); } 그런데 사용할 때마다 매번 이런 식으로 장황하게 사용해야 한다면 무척 번거로울 것입니다. 이 과정을 단축시켜 주는 키워드가 “use”입니다. 위의 코드를 “use”를 사용해서 간단하게 사용해보겠습니다. use first::second::third..

Rust 입문 2022.10.11

[Rust] super

3. super “super”는 자식 모듈에서 부모 모듈을 지칭할 때 사용하는 키워드입니다. 이것을 통해서 부모 모듈에 있는 함수와 모듈에 접근할 수 있습니다. mod first { // 1 부모 모듈 pub fn func_first1() { println!("in first func1"); } fn func_first2() { println!("in first func2"); } pub mod second{ // 2 자식 모듈 pub fn func_second(){ super::func_first1(); // 4 super::func_first2(); } } } fn main() { first::second::func_second(); // 3 } // 출력 in first func1 in first ..

Rust 입문 2022.10.11

[Rust] 모듈 (파일)

2. , 모듈 (파일) 모듈을 만들 때 “mod” 키워드를 사용하는 것을 알았습니다. 그런데 “mod” 키워드를 사용하지 않고 모듈을 만드는 방법이 있습니다. 다른 파일을 만드는 것입니다. 터미널에서 cargo new hello 를 사용해서 프로젝트를 만듭니다. 만들어진 “hello” 프로젝트의 디렉터리로 이동합니다. cd hello 빌드합니다. cargo run 또는 cargo build 다음 명령으로 디렉터리의 트리 구조를 봅니다. 명령 중에 ‘-L 2’는 트리의 두 번째 레벨까지만 보여 달라는 의미입니다. tree -L 2 ├── Cargo.lock ├── Cargo.toml ├── src │ └── main.rs └── target ├── CACHEDIR.TAG └── debug src 디렉터리에..

Rust 입문 2022.10.11

[Rust] 모듈

1. 모듈 모듈은 네임스페이스입니다. 그 안에 함수, struct, enum, 트레이트 등이 들어 있습니다. “::” 기호로 모듈의 포함 관계를 표현합니다. 다음과 같은 모양입니다. first::second1::func1 first::second2::func1 위의 예에 두 개의 fubc1이 있습니다. 두 함수의 이름은 같지만 다른 함수입니다. 왜냐하면 모듈이 다르기 때문입니다. 모듈을 선언할 때는 “mod” 키워드를 사용 합니다. 위의 코드처럼 사용할 수 있는 구조를 가진 모듈 트리를 만들어 보겠습니다. mod first{ mod second1{ func1 } mod second2{ func1 } } 만약 func1을 모듈 밖에서 사용하고 싶다면 “pub” 키워드를 같이 사용해야 합니다. “pub”은 ..

Rust 입문 2022.10.11

[Rust] 참조 (대여)

2. 참조 (대여) 소유권 개념을 알아봤습니다. 그러면 Rust에서는 Copy 트레이트가 없는 변수들끼리는 소유권 이동 없이 재할당을 하지 못 할까요? 네, 못 합니다. 하지만 소유권 이동 없이 값을 사용할 수는 있습니다. 이런 작업을 위해서 참조(reference) 또는 대여(borrow / lending)라는 것이 있습니다. 값에 대한 소유권을 넘기지 않고 주소를 복사해 주어서 그 값을 사용할 수 있게 하는 방법입니다. 참조를 사용할 때는 & 기호를 사용합니다. 참조한 값을 변경할 수 있게 설정하려면 &mut를 사용합니다. fn main() { let s1 = String::from("Hello"); let s2 = &s1; // 1 println!("s1:{}", s1); println!("s2:{..

Rust 입문 2022.10.09

[Rust] 소유권

1. 소유권 소유권은 Rust 특유의 개념입니다. 어떤 스코프 안에서 값을 할당받고 생성된 변수는 그 스코프 안에서 값에 대한 소유권을 가집니다. 그 스코프를 벗어나면 소유권은 소멸됩니다. 또 어떤 변수가 다른 변수에게 값을 재할당하면 소유권이 이동(move)합니다. 값을 가지고 있던 변수는 소유권을 잃습니다. 아래 예에서 스코프와 소유권의 관계를 봅시다. { let x = 1; .....영역 1 } ........ 영역 2 이 경우에 변수 x는 정수 1에 대한 소유권을 가지고 있습니다. 브레이스 { }로 감싸인 영역 1은 스코프 내의 공간입니다. 스코프를 벗어나면( 영역 2) 변수 x는 소유권을 잃고 삭제됩니다. 그래서 영역 2에서 변수 x는 데이터를 가지고 있지 않아 사용할 수 없습니다. 이번에는 재..

Rust 입문 2022.10.09

[Rust] Result와 Rust의 에러 처리

4. Result와 Rust의 에러 처리 Result도 Option 처럼 Rust에 의해 미리 정의된 특수 enum입니다. Result의 정의를 보겠습니다. pub enum Result { /// Contains the success value #[lang = "Ok"] #[stable(feature = "Rust1", since = "1.0.0")] Ok(#[stable(feature = "Rust1", since = "1.0.0")] T), /// Contains the error value #[lang = "Err"] #[stable(feature = "Rust1", since = "1.0.0")] Err(#[stable(feature = "Rust1", since = "1.0.0")] E), } ..

Rust 입문 2022.10.07

[Rust] Option

3. Option option은 enum의 일종입니다. Rust에 미리 정의 되어 있습니다. Rust에서 null값의 가능성이 있는 상황을 처리하기 위해 아주 중요하게 사용 되는 특수 열거자라고 생각하면 됩니다. Rust의 중요한 특징 중에 하나가 null 값을 허용하지 않는다는 것입니다. 대신 null 값이 발생할 수 있는 상황에서 Option을 사용 합니다. 다른 언어에서 null을 다루기 위한 타입을 보통 “Optioal”이라고 하는 것을 참고 하면 기억하기 쉽습니다. 우선 Option의 정의를 보겠습니다. pub enum Option { /// No value. #[lang = "None"] #[stable(feature = "Rust1", since = "1.0.0")] None, /// Som..

Rust 입문 2022.10.07
반응형