본문 바로가기

Rust Programming

[Rust] 1. Rust 시작하기

학교에서 시스템 프로그래밍 관련한 과목을 C/C++로만 수행했다.

그러면서 Rust에 대해 알게됐고 시스템 관련하여 관심이 있었기에, 이렇게 방학 때, 시작해본다.

 

Rust 환경설정 및 설치과정은 검색하면 많은 곳에서 확인할 수 있으니 생략하겠다.

 

Rust에 대해 배우려고 하는데, 같은 분야에 관심있어하던 친구가 아래 사이트에서 배우는 것이 좋을 것 같다고 말해줬다.

https://github.com/mainmatter/100-exercises-to-learn-rust?tab=readme-ov-file

 

GitHub - mainmatter/100-exercises-to-learn-rust: A self-paced course to learn Rust, one exercise at a time.

A self-paced course to learn Rust, one exercise at a time. - mainmatter/100-exercises-to-learn-rust

github.com

Rust에 대한 어느 사전 지식도 필요없고, 적어도 하나의 언어를 다룰 수 있다면 누구나 배울 수 있다고한다.

그리고 시스템 프로그래밍이나, 메모리 관리에 대한 지식도 가르쳐준다한다!!

(물론 좀 알고 있긴 함! 하지만 복습도 하고 얼마나 좋을까?)

 

총 100개의 exercises로 구성되어 있으며, 소~중규모의 Rust 프로젝트들을 다룬다.

위 course를 만든 분은 혼자 배울 경우, 어려움이 닥쳤을 때, 멘토링을 해줄 사람이 있어야한다고 말한다. 

그건 어려움이 생겼을 때, 차차 생각해보자.

 


 

먼저, 아래 사이트에 들어가서 git clone을 하든, 다운로드를 받든 지시에 따른다.

https://rust-exercises.com/

 

Welcome - 100 Exercises To Learn Rust

Welcome to "100 Exercises To Learn Rust"! This course will teach you Rust's core concepts, one exercise at a time. You'll learn about Rust's syntax, its type system, its standard library, and its ecosystem. We don't assume any prior knowledge of Rust, but

rust-exercises.com

 

하나의 exercise에 10분 이상 어려움을 느끼면, 도움을 청할 사람을 찾아 도움을 청하거나 solution을 통해 공부하라고 권장한다.

 


 

00_welcome 부분부터 시작이다.

#[cfg(test)] 속성은 컴파일러에게 tests를 할 때만 아래 코드 블럭을 컴파일해달라는 것이다.

답을 검증하고 싶으면, tests 속성을 잘 찾아서 exercise에 대한 tests를 하는 부분만 고치면 된다.

** 절대 Tests 코드를 바꾸면 안된다 **

 


 

일단 00_welcome은 test를 잘 해봤는지 확인하는 것이었다.

test를 해보면 terminal에 무엇을 해야하는지 보여준다.

그대로 코드에서 글자만 바꿔주면 test를 통과한다.

Test pass figure


이제 01_syntax를 해볼 것이다.

말 그대로 기본 문법에 대해 배우는 것 같다.

 

먼저 주석은 c/c++과 같이 //로 달 수 있다.

 

함수는 fn keyword로 만들 수 있고 예시는 아래와 같다.

fn greeting() -> &'static str {
    // TODO: fix me 👇
    "I'm ready to __!"
}

 

tistory 글쓰기는 코드블럭 언어에서 Rust는 지원하지 않는다...

Go는 지원하면서...

따라서 그냥 shell로 설정하고 쓸 것이다.

 

Rust는 함수를 fn keyword, 함수 이름, input 파라미터, 리턴 타입, 코드블럭 순으로 만든다.

그리고 c와 c++과 같이 {}로 코드 블럭을 감싼다.

위의 greeting 함수는 input 파라미터가 없고, string slice에 대한 참조를 반환한다.

 


아래와 같이 return type이 없을 때는 생략할 수 있다.

()을 unit type이라 하고 리턴될 수 있는 의미있는 값이 없을 때, 사용된다.

fn test_welcome() {
    assert_eq!(greeting(), "I'm ready to learn Rust!");
}

 

이렇게도 쓸 수 있다.

fn test_welcome() -> () {
    assert_eq!(greeting(), "I'm ready to learn Rust!");
}

 

이건 unit type을 통해 return type이 없다는 것을 명시적으로 보여준다.

 


 

Return되는 값은 따로 명시하지 않는 다면 마지막 expression이 return된다.

fn greeting() -> &'static str {
    "I'm ready to learn Rust!"
}

 

그래서 위 함수는 "I'm ready to learn Rust!"를 return한다.

 

fn greeting() -> &'static str {
    return "I'm ready to learn Rust!";
}

 

위와 같이 return keyword를 사용해 값을 직접 return할 수 있다.이 때, 끝에는 세미콜론을 붙여줘야하며, return keyword를 만약 생략할 수 있다면 생략하는 것이 관용적이다.

 


 

input parameters는 Python에서 def 함수이름(parameters)와 같이 함수이름(parameters)의 parameters에 넣는다.그 예시는 다음과 같다.

fn greet(name: &str) -> String {
    format!("Hello, {}!", name)
}

 

각 parameter는 parameter이름: parameter타입의 형식을 띈다.

만약 parameter가 여러개면, 각 parameter를 comma로 구분한다.

 


 

위에서 types를 여러번 언급했는데, Rust는 statically typed language다.

Rust의 모든 value들은 type을 갖고 있고, 각 value의 type은 compile-time에 compiler에게 알려준다.

 

즉, types는 static analysis의 형태라 생각하면된다.

또한 compiler가 program의 모든 값들에 type이라는 tag를 붙여준다고 생각하면된다.

 

tag에 따라, compiler는 여러 규칙들을 행할 수 있다.example) string type을 number type에 더할 수 없지만, number type끼리는 가능하게 한다.

 

이것을 올바르게 활용하면, 프로그램의 runtime bug를 예방할 수 있다.

Rust는 type을 통해 잘못된 연산이나 접근을 compile time에 방지함으로써, run time에 발생할 수 있는 오류를 미리 잡아낸다.

이는 프로그램의 안정성과 신뢰성을 높여주는 역할을 한다.

그래서 요즘 떠오르나...?

 


 

그리고 syntax sector에 대한 exercise를 진행했는데 너무 쉬웠다.

아직 초반이라 그런것 같다. 

그냥 input parameters의 type과 return type을 맞춰주면 끝이다.

Test pass figure

 


아직 초반이라 이후엔 모르겠지만 나름 흥미롭다.

방학중으로 다 하기를 목표로 하고 최대한 될 때까지 해볼 것이다.