관리 메뉴

밤 늦게까지 여는 카페

[rust 공식 문서 14일 공부] 2일차 본문

For Fun

[rust 공식 문서 14일 공부] 2일차

Jㅐ둥이 2024. 12. 7. 01:00
반응형

1.3. Hello, Cargo -  rust의 빌드 시스템이자 패키지 매니저인 "Cargo"

rust의 빌드 시스템이자 패키지 매니저인 cargo는 rust를 설치할 때 자동으로 설치됩니다.

cargo 설치 여부 확인

 

cargo new

어제 직접 만들었던 프로젝트 폴더를 cargo를 이용해서 만들 수 있더라고요.

  • cargo new 명령어를 이용해서  프로젝트 폴더 생성하기

cargo new 명령어 실행 결과

  • cargo new 명령어를 이용하면 프로젝트 폴더와 프로젝트에 필요한 기본적인 요소들을 생성해줍니다.

cargo new 명령어로 생성된 파일들
cargo new 명령어 설명, --vcs 옵션을 이용하면 git 이외의 vcs도 사용할 수 있음

프로그래밍 언어 빌트인 도구에서 이렇게까지? 센스 있다...

 

cargo new 명령어를 이용해서 생성된 파일 중 Cargo.toml 파일은 프로젝트의 의존성을 관리할 때 사용됩니다.

프로젝트를 방금 생성해서 필요한 의존성이 없어서 [dependencies]가 공란인 상태

 

cargo build, run check

cargo의 build, run, check 명령어는 상당히 유용합니다.

  • check는 컴파일 되는지 빠르게 확인할 수 있음

cargo check를 이용해서 linter를 만드는 걸까요?

  • run이 자동으로 build 명령어를 실행해주는데 컴파일만 할 때는 build 명령어 사용하면 되겠더라고요.
  • cargo build 명령어는 debug 모드를 기본적으로 실행합니다.,
  • cargo build --release 명령어로 컴파일 할 경우 최적화가 이뤄지지만 컴파일 시간이 길어질 수 있습니다.
  • target/build, target/release 디렉토리에 바이너리 파일이 생성됩니다.


프로젝트가 복잡해질수록 rustc를 이용하는 것보다 cargo를 이용하는 것이 관리성을 훨씬 많이 높여준다고 하니 cargo에 익숙해지는 것이 좋겠습니다!

그냥 cargo만 쓰자!

 

2. guessing game - rust 프로그래밍 실습!

이제 실습 시간입니다!

 

cargo를 이용해서 프로젝트 디렉토리를 만들고 문서에서 알려주는 코드를 복사+붙여넣기 합니다!
복사+붙여넣기 한 코드는 사용자의 입력을 받아서 출력하는 프로그램이었습니다.


실습 세션을 따라서 완성한 코드는 다음과 같습니다.

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1..=100);

    println!("The secret number is: {secret_number}");

    loop {

        println!("Please input your guess.");

        let mut guess = String::new();

        io::stdin()
            .read_line(&mut guess)
            .expect("Failed to read line");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => {
                println!("Please type a number!!");
                continue;

            }
        };
        
        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }
    }
}


그리고 이 세션에서 제가 간단하게 경험해 본 rust 개념 및 기능들입니다.

아마 더 자세히 공부하게 되겠죠?

  • mutability
  • variable shadowing
  • match를 이용한 에러 처리
  • Result 타입
  • 외부 라이브러리 import
  • loop

3. Common Programming Concepts

이제 rust 언어의 기본적인 개념들이 나옵니다!

3.1. Variables and Mutability

rust에서 let으로 정의된 변수들은 기본적으로 immutable(변경 불가능)합니다.
하지만 변수를 변경할 수 있는 것은 프로그래밍에 큰 편의성을 주기 때문에 `mut` 라는 키워드를 추가하면 mutable 한 변수를 정의할 수 있습니다.

let immutable_variable = 1; // 값 변경 불가능
let mut mutable_variable = 100; // 값 변경 가능

Constant VS Variable

1. constant는 무조건 mutable 합니다.
2. constant는 어떤 scope에서도 선언될 수 있습니다.
3. constant는 `constant expression` 에 의해서만 선언될 수 있습니다.

 

Shadowing

Shadowing이란 **현재의 scope**에 정의되어 있는 변수를 새롭게 덮어 쓰는 행위입니다.


mutable 변수는 타입은 유지된 상태로 값만 변경할 수 있지만

shadowing의 경우에는 타입도 새롭게 정의할 수 있다는 점에서 편리합니다(?).

 

 

3.2. Data Types

  • rust는 statically typed language기 때문에 compile 단계에서 모든 변수들의 타입을 알 수 있어야만 합니다.

Scalar Type

Scalar Type은 단일 값을 가지는 타입을 의미합니다.
rust에는 4개의 primary scalar type이 있습니다.

  • Integer
  • Floating-Point
  • Booleans
  • Character

Compound type

Compound Type은 여러 개의 값을 가지는 타입을 의미합니다.
rust에는 2개의 primary compound type이 있습니다.

  • Tuple
  • Array

3.3. Functions

함수 마지막에 `return` 키워드와 `;` 없이 expression만 적어두면 return 문이 됩니다.
그 외에는 평범했습니다.

Comments

평범한 주석이었는데 놀랍게도 /* */과 같은 multi line용 주석이 없었습니다.

3.4. Control Flow

조건문 있을 거 다 있고,

  • if, else if, else
  • if 에는 무조건 boolean

변수 선언할 때 if 사용할 수 있고,

  • 가독성 떨어지는 삼항 연산자 대신에 if 문 사용할 수 있습니다!
  • 예시) let number = if condition { 5 } else { 6 };

while 문과 동일한 loop가 있고, nested loop에서 분기 조절을 위한 loop labeling 있습니다.

흥미로웠던 것은 변수 선언할 때 loop를 사용할 수 있더라고요?

  • 있었으면 하는 기능들이 다 있네요...?

let result = loop {

    counter += 1;

    if counter == 10 {

        break counter * 2;

    }

};


2일차인데 rust가 개발자 편의성을 상당히 많이 고려한 언어라는게 느껴지네요...

 

여기서 조금 더 공부할까 했는데 토리가 공부 그만하고 자라고 해서 이만 자러 가겠습니다 ㅎㅎ...

키보드 소리 시끄러우니깐 그만 자라옹

반응형