Skip to content
8 changes: 5 additions & 3 deletions src/ch1-00.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@ fn main() {
}
```

파이썬은 최근 가장 인기가 높은 언어 중 하나입니다. 간결한 문법과 범용성 덕분에 서버 개발부터 딥러닝 모델 개발까지 다양한 분야에서 사용되고 있습니다. 하지만 파이썬은 개발 시의 높은 생산성을 위해 코드 실행 속도를 일정 부분 포기한 언어입니다. 특히 파이썬의 태생적 한계인 GIL(Global interpreter lock)때문에 빠른 연산이 필요한 작업이나 멀티스레딩 프로그램에서 좋은 성능을 내기 어려운 단점이 있습니다.
파이썬(Python)은 최근 가장 인기가 높은 언어 중 하나입니다. 간결한 문법과 범용성 덕분에, 파이썬은 서버 개발부터 딥러닝 모델 개발까지 다양한 분야에서 사용되고 있습니다. 하지만 파이썬은 개발 시의 높은 생산성을 위해 코드 실행 속도를 일정 부분 포기한 언어입니다. 특히 파이썬의 태생적 한계인 GIL (Global interpreter lock) 때문에 빠른 연산이 필요한 작업이나 멀티스레딩 프로그램에서 좋은 성능을 내기 어려운 단점이 있습니다.
[파이썬이 인기가 높은 언어라는 것은 언제를 기준한 것인지 추가가 필요합니다. 최근이라는 말로 미루어보아, 책을 집필하는 2023년 2월을 기준한 것으로 보면 될까요?]: #
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

질문은 PR 본문에 남겨주시면 좋을 것 같습니다.


러스트는 높은 추상성으로 높은 생산성을 가지고 있는 동시에 C/C++의 99%에 가까운 성능을 가지고 있어서 빠른 연산속도가 필요한 분야에서 각광받고 있습니다. 2022년 스택오버플로우 개발자 설문조사의 "Loved vs Dreaded(사랑하는 언어 대 두려운 언어)"에서 러스트는 86.73%라는 높은 비율로 가장 사랑받는 언어로 선정되었습니다. 참고로, 러스트는 현재 7년 연속 가장 사랑받는 언어 1위로 선정되었습니다.
러스트(Rust)는 높은 추상성으로 높은 생산성을 가지고 있는 동시에 C/C++의 99%에 가까운 성능을 가지고 있어서 빠른 연산속도가 필요한 분야에서 각광받고 있습니다. 2022년 스택 오버플로우(Stack Overflow) 개발자 설문조사 "Loved vs Dreaded (사랑하는 언어 대 두려운 언어)"에서, 러스트는 86.73%라는 높은 비율로 가장 사랑받는 언어로 선정되었습니다. 참고로, 개발자들의 러스트 사랑은 2022년에 한정한 것이 아닙니다. 러스트는 2022년까지 7년 연속으로 가장 사랑받는 언어 1위로 선정되었습니다.
[러스트가 1위로 선정된 것은 동일한 설문주체에 의한 설문조사인가요? 어디에서 실시한 설문인지 명시하는 것이 좋아보입니다.]: #
Copy link
Owner

@Indosaram Indosaram Apr 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above


![ch01-1](assets/ch01-1.png)

국내에서도 2022 프로그래머스 설문조사에 따르면 러스트는 5.3% 비율로 7위를 차지해 꽤 상위권에 위치해 있는 편입니다.
2022 프로그래머스 설문조사에 따르면, 러스트는 국내에서 5.3% 비율로 사랑받는 언어 7위를 차지해 꽤 상위권에 위치해 있습니다.

<img src="assets/ch01-2.png" alt="ch01-2" style="zoom:50%;" />

Expand Down
16 changes: 8 additions & 8 deletions src/ch1-01.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

파이썬에서 멀티스레딩 프로그램을 구현할 때 가장 많이 겪는 문제가 스레드 레이스 조건(race condition)입니다. 러스트만의 독특한 타입 시스템과 소유권(ownership) 모델 덕분에 코드가 컴파일될 때 발생할 수 있는 메모리 혹은 스레드 문제를 미리 찾아낼 수 있기 때문에 훨씬 안정적인 프로그램을 만들 수 있습니다.

특히 파이썬은 GIL(Global Interpreter Lock) 때문에 멀티스레딩이라 하더라도 한 번에 하나의 코어밖에 사용하지 않습니다. 하지만 러스트를 사용하면 GIL 락이 걸린 순간에 여러 스레드를 사용해 더 빠르게 계산을 완료할 수 있습니다.
특히 파이썬은 GIL (Global Interpreter Lock) 때문에 멀티스레딩이라 하더라도 한 번에 하나의 코어밖에 사용하지 않습니다. 하지만 러스트를 사용하면 GIL 락이 걸린 순간에 여러 스레드를 사용해 더 빠르게 계산을 완료할 수 있습니다.



Expand All @@ -26,7 +26,7 @@



이같은 점 때문에 7년 연속 "가장 사랑받는 프로그래밍 언어" 1위를 차지하고 있는 러스트는 더 이상 파이썬 개발자에게 선택이 아닌 필수가 되었습니다.
이같은 점 때문에 7년 연속 "가장 사랑받는 프로그래밍 언어" 1위를 차지하고 있는 러스트는 더 이상 파이썬 개발자에게 선택이 아닌 필수라고 할 수 있겠습니다.



Expand All @@ -53,14 +53,14 @@
> ```javascript
> > console.log(1 + "2");
>
> 13
> 12
> ```



### 비교
### 도구 비교

아래 표는 파이썬과 러스트의 기본 툴들을 비교한 표입니다. 파이썬의 경우, `pip` 를 제외한 툴들은 일반적으로 별도 설치가 필요합니다. 하지만 러스트는 `cargo` 라는 툴을 통해 대부분의 기능을 바로 사용할 수 있습니다. `cargo`는 크레이트(crate)라고 불리는 패키지를 관리하는 도구이면서, 동시에 소스코드를 컴파일하고 빌드하는 시스템 빌드 매니저 기능도 포함하고 있습니다. 아래 표와 같이 `cargo` 에 내장된 기능은 포맷(format), 린트(lint), 테스트, 문서화, 벤치마크 등 다양합니다. 여기에 추가로 플러그인을 설치해서 더 다양하게 `cargo` 를 사용할 수도 있습니다.
아래 표는 파이썬과 러스트의 기본 도구들을 비교한 표입니다. 파이썬의 경우, `pip` 를 제외한 도구들은 일반적으로 별도 설치가 필요합니다. 하지만 러스트는 `cargo` 라는 도구를 통해 대부분의 기능을 바로 사용할 수 있습니다. `cargo`는 크레이트(crate)라고 불리는 패키지를 관리하는 도구이면서, 동시에 소스코드를 컴파일하고 빌드하는 시스템 빌드 매니저 기능도 포함하고 있습니다. 아래 표와 같이 `cargo` 에 내장된 기능은 포맷(format), 린트(lint), 테스트, 문서화, 벤치마크 등 다양합니다. 여기에 추가로 플러그인을 설치해서 더 다양하게 `cargo` 를 사용할 수도 있습니다.

| | 파이썬 | 러스트 |
| ------------------ | -------------------------------- | ------------ |
Expand All @@ -80,7 +80,7 @@



예를 들어 `cargo doc`을 실행하면, 아래와 같은 API 문서가 자동으로 생성됩니다. 이와 비슷하게 파이썬 문서를 생성해주는 패키지인 `sphinx` 의 경우, 별도의 추가 설치 뿐만 아니라 프로젝트 별로 섬세한 설정이 필요하다는 점을 생각해보면 이는 굉장히 편리한 기능입니다.
예를 들어 `cargo doc`을 실행하면, 아래와 같은 API 문서가 자동으로 생성됩니다. 이와 비슷하게 파이썬 문서를 생성해주는 패키지인 `sphinx` 의 경우, 별도의 추가 설치 뿐만 아니라 프로젝트별로 섬세한 설정이 필요하다는 점을 생각해보면 이는 굉장히 편리한 기능입니다.

![ch01-3](assets/ch01-3.png)

Expand All @@ -90,9 +90,9 @@

### 러스트의 경쟁 언어들

위에서 잠깐 설명했듯이, 러스트로 C/C++ 바인딩 함수나 패키지를 대신할 수 있습니다. 그렇다면 왜 C/C++로 직접 프로그램을 만들거나, 다른 비슷한 언어들을 사용하지 않는 걸까요? 일단 C/C++는 생산성이 매우 떨어집니다. 숙련된 개발자가 아니라면, 메모리 안정성과 스레드 안전성을 생각하며 C/C++로 프로그램을 만드는 것 자체가 굉장한 어렵습니다. 따라서 C/C++보다는 이와 비슷한 모던 프로그래밍 언어들이 훨씬 각광받고 있습니다.
위에서 잠깐 설명했듯이, 러스트로 C/C++ 바인딩 함수나 패키지를 대신할 수 있습니다. 그렇다면 왜 C/C++로 직접 프로그램을 만들거나, 다른 비슷한 언어들을 사용하지 않는 걸까요? 일단 C/C++는 생산성이 매우 떨어집니다. 숙련된 개발자가 아니라면, 메모리 안정성과 스레드 안전성을 생각하며 C/C++로 프로그램을 만드는 것 자체가 굉장히 어렵습니다. 따라서 C/C++보다는 이와 비슷한 모던 프로그래밍 언어들이 훨씬 각광받고 있습니다.

아래 표는 Rust와 경쟁 관계에 있는 비슷한 언어들의 특징을 정리해놓은 표입니다. 먼저 Apple의 Swift는 컴파일 언어이며, 높은 생산성과 성능을 자랑하지만 주로 iOS 앱 개발에만 사용됩니다. 두 번째로 Go는 높은 생산성과 비교적 빠른 성능을 가지고 있습니다. 주로 네트워크/서버 분야에 많이 사용됩니다. Go는 메모리가 완전히 안전하지 않으며, 컴파일 타임에 이러한 오류를 감지하지 못하는 경우가 많아 안정성이 떨어집니다. 또한 가비지 콜렉션을 사용하기 때문에 러스트에 비해 성능이 떨어지는 단점이 있습니다. 이러한 이유 때문에 빠른 성능과 메모리 안정성이 필요한 경우 러스트가 최고의 옵션이 됩니다.
아래 표는 러스트와 경쟁 관계에 있는 비슷한 언어들의 특징을 정리해놓은 표입니다. 먼저 Apple의 Swift는 컴파일 언어이며, 높은 생산성과 성능을 자랑하지만 주로 iOS 앱 개발에만 사용됩니다. 두 번째로 Go는 높은 생산성과 비교적 빠른 성능을 가지고 있습니다. 주로 네트워크/서버 분야에 많이 사용됩니다. Go는 메모리가 완전히 안전하지 않으며, 컴파일 타임에 이러한 오류를 감지하지 못하는 경우가 많아 안정성이 떨어집니다. 또한 가비지 콜렉션을 사용하기 때문에 러스트에 비해 성능이 떨어지는 단점이 있습니다. 이러한 이유 때문에 빠른 성능과 메모리 안정성이 필요한 경우 러스트가 최고의 옵션이 됩니다.



Expand Down
8 changes: 4 additions & 4 deletions src/ch1-03.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@ $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

#### Windows

윈도우 사용자의 경우 위 홈페이지에서 34비트 또는 64비트 설치 파일을 다운로드 받습니다.
윈도우 사용자의 경우 위 홈페이지에서 32비트 또는 64비트 설치 파일을 다운로드 받습니다.

![image-20230219213509520](assets/ch01-03-01.png)



### Visual Studio Code 설치 및 설정하기

이 책에서는 통합 개발 환경(Integrated Development Environment, IDE)로 Visual Studio Code(이하 VSCode)를 사용합니다. 러스트에서 제공하는 컴파일, 디버깅, 언어 서버(Language server) 등의 기능을 쉽고 편리하게 사용할 수 있기 때문에 VSCode를 사용하시는 것을 추천합니다.
이 책에서는 통합개발환경(Integrated Development Environment, IDE)로 Visual Studio Code(이하 VSCode)를 사용합니다. 러스트에서 제공하는 컴파일, 디버깅, 언어 서버(Language server) 등의 기능을 쉽고 편리하게 사용할 수 있기 때문에 VSCode를 사용하시는 것을 추천합니다.



Expand All @@ -44,7 +44,7 @@ $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

#### 확장 프로그램(Extension) 설치

이제 Visual Studio Code를 실행합니다. Visual Studio Code에서는 `rust-analyzer`란 확장 프로그램 하나만 설치하면 됩니다. `rust-analyzer`는 러스트 코드를 작성하는데 많은 도움을 주는 확장 프로그램입니다. 코드 자동완성, 에러 표시, 관련 문서 표시 등 다양한 기능이 있지만 가장 좋은 기능 중 하나는 변수의 타입을 추측해서 화면에 표시해주는 것입니다. 자세한 내용은 나중에 소스코드를 작성할 때 다시 살펴보겠습니다.
이제 VSCode를 실행합니다. VSCode에서는 `rust-analyzer`란 확장 프로그램 하나만 설치하면 됩니다. `rust-analyzer`는 러스트 코드를 작성하는데 많은 도움을 주는 확장 프로그램입니다. 코드 자동완성, 에러 표시, 관련 문서 표시 등 다양한 기능이 있지만 가장 좋은 기능 중 하나는 변수의 타입을 추측해서 화면에 표시해주는 것입니다. 자세한 내용은 나중에 소스코드를 작성할 때 다시 살펴보겠습니다.

![image-20230219213852627](assets/ch01-03-03.png)

Expand All @@ -58,7 +58,7 @@ $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

![image-20230219215906979](assets/ch01-03-04.png)

Visual Studio Code의 상단 메뉴에서, "파일 - 폴더 열기"를 클릭합니다. 폴더를 새로 생성한 다음, 해당 폴더를 선택합니다. 그러면 창이 새로고침되고 빈 프로젝트 화면이 나타납니다.
VSCode의 상단 메뉴에서, "파일 - 폴더 열기"를 클릭합니다. 폴더를 새로 생성한 다음, 해당 폴더를 선택합니다. 그러면 창이 새로고침되고 빈 프로젝트 화면이 나타납니다.



Expand Down
5 changes: 3 additions & 2 deletions src/ch2-01.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,16 @@ fn main() {
let x: f64 = 1.0;
let y = 10;

println!("x = {}, y = {}", x, y);
println!("x = {:.1}, y = {}", x, y);
}
```
[러스트에서 파이썬 코드의 실행 결과와 같게끔 하려면 소숫점 표현이 필요해서 :.1을 삽입하였습니다.]: #

하위 폴더인 "rust_part" 폴더로 이동한 다음, `cargo run` 을 실행해 결과를 확인해보겠습니다.

```bash
/code/temp/rust_part $ cargo run
x = 1, y = 10
x = 1.0, y = 10
```

파이썬과 러스트 모두 같은 결과가 나오는 것을 알 수 있습니다.
Expand Down
8 changes: 4 additions & 4 deletions src/ch3-01.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

함수의 입력으로 정수 두 개를 받은 다음 두 수의 합을 리턴하는 `add` 라는 함수를 만들어 보겠습니다.

먼저 파이썬 코드는 다음과 같습니다. 여기서 타입 힌트를 사용해 파라미터와 리턴값의 타입을 명시할 수 있습니다. 파라미터 변수 이름 뒤에 `:int`를 붙여 이 파라미터의 타입이 `int`임을 명시합니다. 함수에서 리턴하는 값은 함수명 뒤에 `-> int`와 같이 표기합니다.
먼저 파이썬 코드는 다음과 같습니다. 여기서 타입 힌트를 사용해 파라미터와 리턴값의 타입을 명시할 수 있습니다. 파라미터 변수 이름 뒤에 `: int`를 붙여 이 파라미터의 타입이 `int`임을 명시합니다. 함수에서 리턴하는 값은 함수명 뒤에 `-> int`와 같이 표기합니다.

```python
def add(num1: int, num2: int) -> int:
return num1 + num2
```

동일한 기능의 러스트 코드는 다음과 같습니다. 함수의 선언에 `fn` 키워드를 사용하고, 함수에서 실행할 코드를 중괄호로 묶어줍니다. 그리고 파이썬과 비슷하게 파라미터에는 `:i32`로 타입을 표기하고, 리턴값에는 `-> i32`처럼 화살표를 사용해 타입을 명시했습니다.
동일한 기능의 러스트 코드는 다음과 같습니다. 함수의 선언에 `fn` 키워드를 사용하고, 함수에서 실행할 코드를 중괄호로 묶어줍니다. 그리고 파이썬과 비슷하게 파라미터에는 `: i32`로 타입을 표기하고, 리턴값에는 `-> i32`처럼 화살표를 사용해 타입을 명시했습니다.

```rust,ignore
fn add(num1: i32, num2: i32) -> i32 {
Expand Down Expand Up @@ -94,7 +94,7 @@ fn main() {

> 러스트의 튜플에 관해서는 자료구조 챕터에서 자세히 다루겠습니다.

만일 `main` 함수와 같이, 함수에서 리턴하는 값이 없는 경우에는 리턴 타입을 생략하거나 `()`와 같이 아무 것도 리턴하지 않음을 표기할 수 있습니다. 파이썬에서 아무것도 리턴하지 않는 경우, `-> None` 으로 표기하거나 표기를 생략하는 것과 비슷합니다.
만일 함수에서 리턴하는 값이 없는 경우에는, `main` 함수에서처럼 리턴 타입을 생략하거나 `-> ()`와 같이 아무 것도 리턴하지 않음을 표기할 수 있습니다. 파이썬에서 아무것도 리턴하지 않는 경우, `-> None` 으로 표기하거나 표기를 생략하는 것과 비슷합니다.

```rust
fn do_nothing() -> () {
Expand All @@ -108,4 +108,4 @@ fn main() {
println!("{:?}", me_too());
}

```
```
4 changes: 2 additions & 2 deletions src/ch3-03.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ fibonacci(10)
동일한 로직을 구현한 러스트 코드는 클로저가 자기 자신을 부를 수 없기 때문에 컴파일되지 않습니다.

```rust,ignore
fn fib(n: u32) -> u32 {
fn fibonacci(n: u32) -> u32 {
let cache = vec![0, 1];
let _fib = |n| {
if n < cache.len() {
Expand All @@ -99,7 +99,7 @@ fn fib(n: u32) -> u32 {
}

fn main() {
println!("{}", fib(10));
println!("{}", fibonacci(10));
}

```
Expand Down
6 changes: 3 additions & 3 deletions src/ch4-02.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ for i in range(6, 10):
6,7,8,9,
```

러스트에서는 특정 범위의 정수를 `a..b` 와 같은 문법으로 간단하게 만들 수 있습니다. 마찬가지로 마지막 값은 생략되기 때문에 `6..10`과 같이 입력합니다. 결과를 한 줄로 프린트하기 위해서 `println!` 대신 `print!` 함수를 사용합니다.
러스트에서는 특정 범위의 정수를 `a..b` 와 같은 문법으로 간단하게 만들 수 있습니다. `..` 표현은 파이썬의 `range(a, b)`에서와 마찬가지로 마지막 값은 생략되기 때문에 `6..10`과 같이 입력합니다. 결과를 한 줄로 프린트하기 위해서 `println!` 대신 `print!` 함수를 사용합니다.

```rust
fn main() {
Expand All @@ -42,7 +42,7 @@ for i in num_range:

```

마찬가지로 러스트에서도 정수 범위를 변수에 할당해 두었다가 나중에 반복할 수 있습니다.
마찬가지로 러스트에서도 정수 범위를 변수에 할당해 두었다가 나중에 반복할 수 있으며,

```rust
fn main() {
Expand All @@ -56,7 +56,7 @@ fn main() {



러스트에서는 정수 범위를 만들 때, 마지막 숫자를 포함할 수 있습니다.
정수 범위를 만들 때, `..=` 표현을 통해 마지막 숫자를 포함할 수 있습니다.

```rust
fn main() {
Expand Down