diff --git a/docs/30_ko.html b/docs/30_ko.html index cd5823460b2290434f17b2927b3c1a801acca34a..ce14b75b8ffb9fd69f38149c660540c2ac54f131 100644 --- a/docs/30_ko.html +++ b/docs/30_ko.html @@ -37,7 +37,7 @@ <div class="page"> <h1>Chapter 2 - Conclusion</h1> <p>Rust의 핵심 개념인 소유권, 빌림, 그리고 빌림 검사기에 대해 배웠습니다.</p> -<p>이러한 개념들은 Rust의 메모리 관리 체계의 핵심이며, 이를 이해하고 올바르게 사용함으로써 메모리 안전성과 효율성을 높일 수 있습니다/</p> +<p>이러한 개념들은 Rust의 메모리 관리 체계의 핵심이며, 이를 이해하고 올바르게 사용함으로써 메모리 안전성과 효율성을 높일 수 있습니다.</p> <p>Rust의 강력한 컴파일러와 빌림 검사기는 코드가 메모리 안전성을 보장하도록 도와줍니다.</p> <div> <button type="button" class="collapsible">정답 보기</button> <div class="content"> <p>오류의 원인은 변수 s에 대한 변경 가능한 참조(r3)와 변경 불가능한 참조(r1과 r2)가 동시에 존재하기 때문입니다. diff --git a/docs/32_ko.html b/docs/32_ko.html index 399011fc63740bb8713d7663b14070a6242fa1cf..b3d6c5be37c9332e4139a494c249ac9819e2a022 100644 --- a/docs/32_ko.html +++ b/docs/32_ko.html @@ -35,14 +35,40 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>주요 컬렉션 타입 소개</h1> + <p>러스트는 일반적인 목적의 프로그래밍 데이터 구조에 대한 효율적인 구현을 제공하는 표준 컬렉션 라이브러리를 갖추고 있습니다.</p> +<p>표준 구현을 사용하면 두 라이브러리 간에 데이터 변환 없이 원활하게 통신할 수 있습니다.</p> +<p>가장 일반적인 사용 사례를 위해 <code>Vec</code> 또는 <code>HashMap</code>을 사용하는 것이 좋습니다.</p> +<p>이 두 컬렉션은 대부분의 일반 데이터 저장 및 처리에 사용되며, 뛰어난 성능을 제공합니다.</p> +<p>표준 라이브러리의 다른 컬렉션들은 특정 사용 사례에서 최적의 선택이지만, 비교적 특수한 경우에 해당합니다.</p> +<p>실제로 <code>Vec</code>과 <code>HashMap</code>이 기술적으로 최적이 아니더라도, 시작하기에 충분한 선택이 될 것입니다.</p> +<p>러스트의 컬렉션은 크게 4가지 주요 카테고리로 분류할 수 있습니다.</p> +<ol> +<li><strong>Sequences</strong>: <code>Vec</code>, <code>VecDeque</code>, <code>LinkedList</code></li> +<li><strong>Maps</strong>: <code>HashMap</code>, <code>BTreeMap</code></li> +<li><strong>Sets</strong>: <code>HashSet</code>, <code>BTreeSet</code></li> +<li><strong>Misc</strong>: <code>BinaryHeap</code></li> +</ol> +<p>여기서는 러스트의 주요 컬렉션 타입인 벡터(Vector), 문자열(String) 및 해시맵(HashMap)에 대해 간략하게 소개하겠습니다.</p> +<h2 id="vector">벡터(Vector)</h2> +<p>벡터는 동적 배열로, 연속된 메모리 공간에 저장되는 동일한 타입의 요소들을 가집니다.</p> +<p>벡터는 크기를 자동으로 조절할 수 있으며, 요소에 빠르게 접근할 수 있는 장점이 있습니다.</p> +<h2 id="string">문자열(String)</h2> +<p>문자열은 UTF-8 인코딩된 문자의 연속으로 구성되어 있습니다.</p> +<p>러스트의 문자열은 변경이 불가능한 <code>&str</code> 타입과 변경 가능한 <code>String</code> 타입이 있습니다.</p> +<p>문자열은 텍스트 데이터를 저장하고 처리하는데 사용됩니다.</p> +<h2 id="hashmap">해시맵(HashMap)</h2> +<p>해시맵은 키-값 쌍을 저장하는 데 사용되는 컬렉션입니다.</p> +<p>해시 함수를 사용하여 키를 해싱하여 값을 빠르게 찾을 수 있습니다.</p> +<p>해시맵은 삽입, 검색 및 삭제 작업에 대한 평균 시간 복잡도가 O(1)입니다.</p> <div class="bottomnav"> <span class="back"><a href="chapter_3_ko.html" rel="prev">❮ 이전</a></span> - <span class="next"><a href="chapter_4_ko.html" rel="next">다음 ❯</a></span> + <span class="next"><a href="33_ko.html" rel="next">다음 ❯</a></span> </div> </div> - <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> + <div class="code"> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> + </div> </div> <script> var pres = document.querySelectorAll("pre>code"); diff --git a/docs/33_ko.html b/docs/33_ko.html index 326f4db41fa4d2d47318f506892c7ddae7d44429..6c45a7223f54d84d61b743c4e85ed0ea08d28ef0 100644 --- a/docs/33_ko.html +++ b/docs/33_ko.html @@ -35,14 +35,53 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>벡터(Vector)</h1> + <p>벡터는 동적 배열로, 연속된 메모리 공간에 저장되는 동일한 타입의 요소들을 가집니다.</p> +<p>벡터는 크기를 자동으로 조절할 수 있으며, 요소에 빠르게 접근할 수 있는 장점이 있습니다.</p> +<h2 id="a">a. 벡터 생성 및 초기화</h2> +<p>벡터를 생성하려면 다음과 같은 방법을 사용할 수 있습니다.</p> +<pre><code class="rust">// 빈 벡터 생성 +let mut vec1: Vec<i32> = Vec::new(); + +// 초기 값이 있는 벡터 생성 +let vec2 = vec![1, 2, 3, 4, 5];</code></pre> +<h2 id="b">b. 벡터 요소에 접근하고 수정하기</h2> +<p>벡터 요소에 접근하거나 수정하려면 인덱스를 사용합니다.</p> +<pre><code class="rust">// 벡터에서 인덱스를 사용해 요소에 접근하기 +let first_element = vec2[0]; // 첫 번째 요소 + +// 벡터에서 인덱스를 사용해 요소를 수정하기 +vec1.push(10); // 벡터 끝에 10 추가 +vec1[0] = 20; // 첫 번째 요소를 20으로 변경</code></pre> +<h2 id="c">c. 벡터 순회하기</h2> +<p>벡터의 요소를 반복하려면 <code>for</code> 루프를 사용합니다.</p> +<pre><code class="rust">for element in vec2.iter() { + println!("요소: {}", element); +}</code></pre> +<h2 id="d">d. 벡터 슬라이싱</h2> +<p>벡터의 일부분만 참조하려면 슬라이스를 사용합니다.</p> +<pre><code class="rust">let slice = &vec2[1..3]; // 인덱스 1부터 2까지의 슬라이스 생성</code></pre> +<h2 id="e">e. 벡터 크기 조절 및 용량 관리</h2> +<p>벡터의 크기를 조절하거나 용량을 관리하려면 다음과 같은 메서드를 사용합니다.</p> +<pre><code class="rust">vec1.reserve(10); // 최소한 10개 요소를 저장할 수 있는 공간을 확보 vec1.shrink_to_fit(); // 벡터의 용량을 최소한으로 줄이기 vec1.resize(5, 0); // 벡터 크기를 5로 조절하고, 새로운 요소를 0으로 초기화</code></pre> +<h2 id="f">f. 고급 벡터 사용법</h2> +<p>벡터의 고급 사용법에는 벡터에서 요소를 제거하거나 벡터의 일부를 다른 벡터로 이동하는 등의 작업이 포함됩니다.</p> +<pre><code class="rust">// 벡터에서 인덱스 i의 요소 제거 +let i = 2; vec1.remove(i); + +// 벡터에서 마지막 요소를 꺼내기 +if let Some(last_element) = vec1.pop() { + println!("마지막 요소: {}", last_element); +}</code></pre> +<p>더 많은 메소드는 <a href="https://doc.rust-lang.org/alloc/vec/struct.Vec.html#" target="_blank" rel="noopener">공식 문서</a>를 참고하세요.</p> <div class="bottomnav"> - <span class="back"><a href="chapter_4_ko.html" rel="prev">❮ 이전</a></span> + <span class="back"><a href="32_ko.html" rel="prev">❮ 이전</a></span> <span class="next"><a href="34_ko.html" rel="next">다음 ❯</a></span> </div> </div> - <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> + <div class="code"> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> + </div> </div> <script> var pres = document.querySelectorAll("pre>code"); diff --git a/docs/34_ko.html b/docs/34_ko.html index 7f12feab5dfe65545641eea40d978363d0945c5a..86e3373b4a1b1186827e0871202f5fbbc55ca5f1 100644 --- a/docs/34_ko.html +++ b/docs/34_ko.html @@ -35,14 +35,56 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>벡터의 반복자(Iterators)</h1> + <p>벡터와 같은 Iterator trait가 구현된 것들에는 요소들을 반복하고 처리할 때 사용할 수 있는 여러 가지 반복자 메서드가 있습니다.</p> +<p><code>iter()</code>, <code>iter_mut()</code>, <code>into_iter()</code>는 각각 불변 참조, 가변 참조, 소유권 이동을 수행하는 반복자를 생성합니다.</p> +<h3 id="1iter">1. iter()</h3> +<p><code>iter()</code> 메서드는 벡터의 각 요소에 대한 불변 참조를 생성하는 반복자를 반환합니다.</p> +<p>이 반복자는 벡터의 요소를 읽기 전용으로 사용할 때 유용합니다.</p> +<pre><code class="rust">let vec = vec![1, 2, 3, 4, 5]; + +for element in vec.iter() { + println!("요소: {}", element); +}</code></pre> +<h3 id="2iter_mut">2. iter_mut()</h3> +<p><code>iter_mut()</code> 메서드는 벡터의 각 요소에 대한 가변 참조를 생성하는 반복자를 반환합니다.</p> +<p>이 반복자는 벡터의 요소를 수정할 때 유용합니다.</p> +<pre><code class="rust">let mut vec = vec![1, 2, 3, 4, 5]; + +for element in vec.iter_mut() { + *element *= 2; // 각 요소에 2를 곱함 +} +println!("변경된 벡터: {:?}", vec);</code></pre> +<h3 id="3into_iter">3. into_iter()</h3> +<p><code>into_iter()</code> 메서드는 벡터의 각 요소의 소유권을 이동하는 반복자를 반환합니다.</p> +<p>이 반복자는 벡터의 요소를 소유권을 이동시키며 처리할 때 유용합니다.</p> +<p>이를 통해 벡터의 요소를 다른 데이터 구조로 쉽게 옮길 수 있습니다.</p> +<pre><code class="rust">let vec = vec!["a".to_string(), "b".to_string(), "c".to_string()]; + +let mut uppercased_vec: Vec<String> = Vec::new(); + +for element in vec.into_iter() { + uppercased_vec.push(element.to_uppercase()); +} + +println!("대문자로 변경된 벡터: {:?}", uppercased_vec);</code></pre> +<p><code>into_iter()</code>를 사용할 때 원래의 벡터는 더 이상 사용할 수 없습니다.</p> +<p>소유권이 이동되어 원래 벡터에 대한 참조가 무효화되기 때문입니다.</p> +<h2 id="">차이점</h2> +<ul> +<li><code>iter()</code>: 벡터의 요소에 대한 불변 참조를 생성하는 반복자를 반환합니다. 요소를 읽기 전용으로 사용할 때 사용됩니다.</li> +<li><code>iter_mut()</code>: 벡터의 요소에 대한 가변 참조를 생성하는 반복자를 반환합니다. 요소를 수정할 때 사용됩니다.</li> +<li><code>into_iter()</code>: 벡터의 요소의 소유권을 이동하는 반복자를 반환합니다. 요소를 소유권을 이동시키며 처리할 때 사용됩니다.</li> +</ul> +<p>이러한 반복자들은 각각 다양한 상황에 따라 벡터를 처리할 수 있습니다.</p> <div class="bottomnav"> - <span class="back"><a href="chapter_4_ko.html" rel="prev">❮ 이전</a></span> + <span class="back"><a href="33_ko.html" rel="prev">❮ 이전</a></span> <span class="next"><a href="35_ko.html" rel="next">다음 ❯</a></span> </div> </div> - <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> + <div class="code"> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> + </div> </div> <script> var pres = document.querySelectorAll("pre>code"); diff --git a/docs/35_ko.html b/docs/35_ko.html index 604ccb4b0d62f6d64edefd1902a44655f174e30f..3d8b010ea49230f1b24cd5d3213de35a4ff479cb 100644 --- a/docs/35_ko.html +++ b/docs/35_ko.html @@ -35,15 +35,73 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>해시맵(HashMap)</h1> + <p>해시맵은 키-값 쌍을 저장하는 데 사용되는 컬렉션입니다.</p> +<p>해시 함수를 사용하여 키를 해싱하여 값을 빠르게 찾을 수 있습니다.</p> +<p>해시맵은 삽입, 검색 및 삭제 작업에 대한 평균 시간 복잡도가 <code>O(1)</code>입니다.</p> +<h2 id="a">a. 해시맵 생성 및 초기화</h2> +<p>해시맵을 생성하려면 다음과 같은 방법을 사용할 수 있습니다.</p> +<pre><code class="rust">use std::collections::HashMap; + +// 빈 해시맵 생성 +let mut scores: HashMap<String, u32> = HashMap::new(); + +// 초기 값이 있는 해시맵 생성 +let scores = vec![("Alice", 50), ("Bob", 60)] + .into_iter() + .map(|(k, v)| (k.to_string(), v)) + .collect::<HashMap<String, u32>>();</code></pre> +<h2 id="b">b. 키-값 쌍 삽입 및 업데이트</h2> +<p>해시맵에 키-값 쌍을 삽입하거나 업데이트하려면 <code>insert</code> 메서드를 사용합니다.</p> +<pre><code class="rust">// 키-값 쌍 삽입 +scores.insert("Alice".to_string(), 50); +scores.insert("Bob".to_string(), 60); + +// 키-값 쌍 업데이트 +scores.insert("Alice".to_string(), 55);</code></pre> +<h2 id="c">c. 값에 접근하고 삭제하기</h2> +<p>해시맵에서 값을 접근하거나 삭제하려면 <code>get</code> 또는 <code>remove</code> 메서드를 사용합니다.</p> +<pre><code class="rust">// 값에 접근하기 +if let Some(score) = scores.get("Alice") { + println!("Alice의 점수: {}", score); +} + +// 값 삭제하기 +scores.remove("Alice");</code></pre> +<h2 id="d">d. 해시맵 순회하기</h2> +<p>해시맵의 키-값 쌍을 반복하려면 <code>for</code> 루프를 사용합니다.</p> +<pre><code class="rust">for (key, value) in &scores { + println!("{}: {}", key, value); +}</code></pre> +<h2 id="e">e. 일반적인 해시맵 작업</h2> +<p>해시맵에서 자주 사용되는 작업들은 다음과 같습니다.</p> +<ul> +<li><code>contains_key</code>: 특정 키가 해시맵에 있는지 확인합니다.</li> +<li><code>keys</code>: 해시맵의 모든 키를 반환합니다.</li> +<li><code>values</code>: 해시맵의 모든 값을 반환합니다.</li> +</ul> +<pre><code class="rust">// 키가 해시맵에 있는지 확인하기 +if scores.contains_key("Alice") { + println!("Alice의 점수가 있습니다."); +} + +// 해시맵의 모든 키 출력하기 +for key in scores.keys() { + println!("키: {}", key); +} + +// 해시맵의 모든 값 출력하기 +for value in scores.values() { + println!("값: {}", value); +}</code></pre> +<p>더 많은 메소드는 <a href="https://doc.rust-lang.org/std/collections/struct.HashMap.html" target="_blank" rel="noopener">공식 문서</a>를 참고하세요.</p> <div class="bottomnav"> <span class="back"><a href="34_ko.html" rel="prev">❮ 이전</a></span> - <span class="next"><a href="chapter_5_ko.html" rel="next">다음 ❯</a></span> + <span class="next"><a href="36_ko.html" rel="next">다음 ❯</a></span> </div> </div> <div class="code"> - <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=macro_rules%21+times+%7B%0D%0A++++%28%24num%3Aexpr%2C+%24body%3Ablock%29+%3D%3E+%7B%0D%0A++++++++times%21%28None%2C+%24num%2C+%24body%29%3B%0D%0A++++%7D%3B%0D%0A++++%28%24label%3Aexpr%2C+%24num%3Aexpr%2C+%24body%3Ablock%29+%3D%3E+%7B%0D%0A++++++++if+let+Some%28label%29+%3D+%24label+%7B%0D%0A++++++++++++println%21%28%22Task%3A+%7B%7D%22%2C+label%29%3B%0D%0A++++++++%7D%0D%0A%0D%0A++++++++let+mut+total_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Anew%280%2C+0%29%3B%0D%0A++++++++let+mut+min_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Afrom_secs%28u64%3A%3AMAX%29%3B%0D%0A++++++++let+mut+max_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Afrom_secs%280%29%3B%0D%0A%0D%0A++++++++for+_+in+0..%24num+%7B%0D%0A++++++++++++let+start_time+%3D+std%3A%3Atime%3A%3AInstant%3A%3Anow%28%29%3B%0D%0A++++++++++++%24body%0D%0A++++++++++++let+elapsed+%3D+start_time.elapsed%28%29%3B%0D%0A++++++++++++total_time+%2B%3D+elapsed%3B%0D%0A++++++++++++min_time+%3D+min_time.min%28elapsed%29%3B%0D%0A++++++++++++max_time+%3D+max_time.max%28elapsed%29%3B%0D%0A++++++++++++println%21%28%0D%0A++++++++++++++++%22Execution+time+for+iteration%3A+%7B%7D+ms%22%2C%0D%0A++++++++++++++++elapsed.as_millis%28%29%0D%0A++++++++++++%29%3B%0D%0A++++++++%7D%0D%0A%0D%0A++++++++let+avg_time+%3D+total_time+%2F+%24num%3B%0D%0A++++++++println%21%28%22Average+execution+time%3A+%7B%7D+ms%22%2C+avg_time.as_millis%28%29%29%3B%0D%0A++++++++println%21%28%22Minimum+execution+time%3A+%7B%7D+ms%22%2C+min_time.as_millis%28%29%29%3B%0D%0A++++++++println%21%28%22Maximum+execution+time%3A+%7B%7D+ms%22%2C+max_time.as_millis%28%29%29%3B%0D%0A++++%7D%3B%0D%0A%7D%0D%0A%0D%0Afn+is_prime%28n%3A+u64%29+-%3E+bool+%7B%0D%0A++++if+n+%3C%3D+1+%7B%0D%0A++++++++return+false%3B%0D%0A++++%7D%0D%0A++++for+i+in+2..%3D%28%28n+as+f64%29.sqrt%28%29+as+u64%29+%7B%0D%0A++++++++if+n+%25+i+%3D%3D+0+%7B%0D%0A++++++++++++return+false%3B%0D%0A++++++++%7D%0D%0A++++%7D%0D%0A++++true%0D%0A%7D%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++times%21%28Some%28%22Prime+number+summation%22%29%2C+3%2C+%7B%0D%0A++++++++let+mut+sum+%3D+0u64%3B%0D%0A++++++++let+mut+num+%3D+2u64%3B%0D%0A++++++++let+mut+counter+%3D+0%3B%0D%0A%0D%0A++++++++while+counter+%3C+10_000+%7B%0D%0A++++++++++++if+is_prime%28num%29+%7B%0D%0A++++++++++++++++sum+%2B%3D+num%3B%0D%0A++++++++++++++++counter+%2B%3D+1%3B%0D%0A++++++++++++%7D%0D%0A++++++++++++num+%2B%3D+1%3B%0D%0A++++++++%7D%0D%0A++++++++println%21%28%22Sum+of+first+10%2C000+prime+numbers%3A+%7B%7D%22%2C+sum%29%3B%0D%0A++++%7D%29%3B%0D%0A%7D" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> </div> </div> <script> diff --git a/docs/36_ko.html b/docs/36_ko.html index 92162c6e6a2ea4e8c4d2fe1b833d92b61d67a4ca..fff2c94a10a91a386682ece3345bf1fc16c9f9a3 100644 --- a/docs/36_ko.html +++ b/docs/36_ko.html @@ -35,14 +35,47 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>이터레이터(Iterators) 소개</h1> + <p>이터레이터는 Rust에서 컬렉션의 요소를 순회하고 처리하는 데 중요한 역할을 하는 추상화 개념입니다.</p> +<p>이터레이터는 컬렉션의 요소를 효율적이고 간결한 방법으로 처리할 수 있게 도와줍니다.</p> +<h2 id="arust">a. 이터레이터 개념 및 Rust에서의 중요성</h2> +<p>이터레이터는 데이터 집합을 순차적으로 접근하는 데 사용되는 개체입니다.</p> +<p>Rust에서 이터레이터는 컬렉션의 요소를 처리하는 데 사용되며, 함수형 프로그래밍 패턴과 함께 사용할 수 있습니다.</p> +<p>이터레이터는 함수형 프로그래밍을 지원하며, 일반적으로 Rust의 for 루프에서 사용됩니다.</p> +<p>Rust에서 이터레이터의 중요성은 다음과 같습니다:</p> +<ol> +<li>코드의 간결성: 이터레이터를 사용하면 반복문을 사용하는 코드를 보다 간결하게 작성할 수 있습니다.</li> +<li>느긋한 평가(Lazy evaluation): 이터레이터는 필요한 경우에만 요소를 처리하므로, 메모리 사용량과 실행 시간을 줄일 수 있습니다.</li> +<li>컴포지션: 이터레이터를 사용하면 여러 이터레이터 메서드를 연결하여 작업을 쉽게 구성할 수 있습니다.</li> +</ol> +<h2 id="biteratornextcollect">b. Iterator 트레잇과 메서드 소개 (next, collect 등)</h2> +<p><code>Iterator</code> 트레잇은 Rust의 이터레이터를 구현하는 데 사용되는 트레잇입니다.</p> +<p>이 트레잇에는 다음과 같은 메서드가 정의되어 있습니다.</p> +<h3 id="next">next</h3> +<p><code>next</code> 메서드는 이터레이터의 다음 요소를 반환합니다.</p> +<p>모든 요소를 순회한 경우, <code>None</code>을 반환합니다.</p> +<pre><code class="rust">let mut numbers = vec![1, 2, 3, 4, 5].into_iter(); + +while let Some(number) = numbers.next() { + println!("Number: {}", number); +}</code></pre> +<h3 id="collect">collect</h3> +<p><code>collect</code> 메서드는 이터레이터의 요소를 다른 컬렉션 타입으로 변환합니다.</p> +<pre><code class="rust">let numbers = vec![1, 2, 3, 4, 5]; +let doubled_numbers: Vec<_> = numbers.iter().map(|x| x * 2).collect(); + +println!("Doubled numbers: {:?}", doubled_numbers);</code></pre> +<p>이 외에도 다양한 이터레이터 메서드가 있습니다.</p> +<p>예를 들어, <code>filter</code>, <code>map</code>, <code>fold</code>, <code>take</code>, <code>skip</code>, <code>all</code>, <code>any</code> 등의 메서드를 사용하여 이터레이터를 처리할 수 있습니다.</p> +<p>더 많은 메소드는 <a href="https://doc.rust-lang.org/core/iter/trait.Iterator.html" target="_blank" rel="noopener">공식 문서</a>를 참고하세요.</p> <div class="bottomnav"> - <span class="back"><a href="chapter_5_ko.html" rel="prev">❮ 이전</a></span> - <span class="next"><a href="chapter_6_ko.html" rel="next">다음 ❯</a></span> + <span class="back"><a href="35_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="37_ko.html" rel="next">다음 ❯</a></span> + </div> </div> + <div class="code"> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> </div> - <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> </div> <script> var pres = document.querySelectorAll("pre>code"); diff --git a/docs/37_ko.html b/docs/37_ko.html index 92162c6e6a2ea4e8c4d2fe1b833d92b61d67a4ca..cb16302c0ababff6f07696c82374142d0b81ea18 100644 --- a/docs/37_ko.html +++ b/docs/37_ko.html @@ -35,14 +35,50 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>Chapter 3 - Conclusion</h1> + <p>다음은 여러분들이 Vec와 HashMap을 사용하여 문제를 해결해 보는 고급 문제입니다.</p> +<p>아래 주석을 참고하여 코드를 완성해보세요.</p> +<p>문제 설명:<br /> +이름과 점수가 주어진 학생들의 정보를 Vec와 HashMap을 사용해 관리하고, 평균 점수를 계산하고 출력하는 프로그램을 작성하세요.</p> +<ol> +<li>Vec를 사용하여 학생들의 이름 목록을 저장하세요.</li> +<li>HashMap을 사용하여 학생들의 이름과 점수를 저장하세요.</li> +<li>학생들의 평균 점수를 계산하고 출력하세요.</li> +</ol> +<div> <button type="button" class="collapsible">정답 보기</button> <div class="content"> <p> <pre><code class="rust">use std::collections::HashMap; + +fn main() { + let students = vec![ + ("김철수", 80), + ("이영희", 90), + ("박지민", 85), + ("최영수", 95), + ]; + + let mut names = Vec::new(); + let mut scores = HashMap::new(); + + for (name, score) in students { + // 이름 목록 Vec에 학생 이름을 추가합니다. + names.push(name); + + // 이름과 점수를 HashMap에 저장합니다. + scores.insert(name, score); + } + + // 학생들의 평균 점수를 계산하고 출력합니다. + let total_score: i32 = scores.values().sum(); + let average_score: f64 = total_score as f64 / names.len() as f64; + println!("학생들의 평균 점수: {:.2}", average_score); +}</code></pre> </div> </div> <div class="bottomnav"> - <span class="back"><a href="chapter_5_ko.html" rel="prev">❮ 이전</a></span> - <span class="next"><a href="chapter_6_ko.html" rel="next">다음 ❯</a></span> + <span class="back"><a href="36_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="chapter_4_ko.html" rel="next">다음 ❯</a></span> + </div> </div> + <div class="code"> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=use+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++let+students+%3D+vec%21%5B%0D%0A++++++++%28%22%EA%B9%80%EC%B2%A0%EC%88%98%22%2C+80%29%2C%0D%0A++++++++%28%22%EC%9D%B4%EC%98%81%ED%9D%AC%22%2C+90%29%2C%0D%0A++++++++%28%22%EB%B0%95%EC%A7%80%EB%AF%BC%22%2C+85%29%2C%0D%0A++++++++%28%22%EC%B5%9C%EC%98%81%EC%88%98%22%2C+95%29%2C%0D%0A++++%5D%3B%0D%0A%0D%0A++++let+mut+names+%3D+Vec%3A%3Anew%28%29%3B%0D%0A++++let+mut+scores+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++for+%28name%2C+score%29+in+students+%7B%0D%0A++++++++%2F%2F+TODO+1%3A+%EC%9D%B4%EB%A6%84+%EB%AA%A9%EB%A1%9D+Vec%EC%97%90+%ED%95%99%EC%83%9D+%EC%9D%B4%EB%A6%84%EC%9D%84+%EC%B6%94%EA%B0%80%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A++++++++%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0A%0D%0A++++++++%2F%2F+TODO+2%3A+%EC%9D%B4%EB%A6%84%EA%B3%BC+%EC%A0%90%EC%88%98%EB%A5%BC+HashMap%EC%97%90+%EC%A0%80%EC%9E%A5%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A++++++++%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0A++++%7D%0D%0A%0D%0A++++%2F%2F+TODO+3%3A+%ED%95%99%EC%83%9D%EB%93%A4%EC%9D%98+%ED%8F%89%EA%B7%A0+%EC%A0%90%EC%88%98%EB%A5%BC+%EA%B3%84%EC%82%B0%ED%95%98%EA%B3%A0+%EC%B6%9C%EB%A0%A5%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A++++%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0A%7D%0D%0A" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> </div> - <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> </div> <script> var pres = document.querySelectorAll("pre>code"); diff --git a/docs/39_ko.html b/docs/39_ko.html index f42220be22b0afbee8813d5dd5aa84fbc9423c11..9b74448be62c7071e149679e56a732081103178f 100644 --- a/docs/39_ko.html +++ b/docs/39_ko.html @@ -35,11 +35,96 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>동시성(Concurrency)</h1> + <h2 id="a">a. 동시성의 개념 및 중요성</h2> +<p>동시성(Concurrency)은 여러 작업이 동시에 실행되는 것처럼 보이게 만드는 프로그래밍 기법입니다.</p> +<p>동시성을 사용하면 애플리케이션의 성능을 향상시킬 수 있으며, 멀티코어 프로세서와 같은 병렬 컴퓨팅 기술을 최대한 활용할 수 있습니다.</p> +<p>Rust는 동시성 문제를 안전하게 다루기 위한 독특한 기능을 제공하며,</p> +<p>이러한 기능 덕분에 데이터 경쟁이나 교착 상태와 같은 동시성 문제가 발생할 가능성을 줄일 수 있습니다.</p> +<h2 id="bthread">b. 스레드(Thread) 사용하기</h2> +<p>스레드는 프로세스 내에서 실행되는 독립적인 작업 단위입니다.</p> +<p>Rust에서 스레드를 생성하고 관리하려면 <code>std::thread</code> 모듈을 사용합니다.</p> +<pre><code class="rust">use std::thread; +use std::time::Duration; + +fn main() { + let handle = thread::spawn(|| { + for i in 1..10 { + println!("스레드에서: {}", i); + thread::sleep(Duration::from_millis(1)); + } + }); + + for i in 1..5 { + println!("메인 스레드에서: {}", i); + thread::sleep(Duration::from_millis(1)); + } + + handle.join().unwrap(); +}</code></pre> +<h2 id="cchannels">c. 채널(Channels)을 사용한 통신</h2> +<p>채널은 스레드 간에 메시지를 전달하는 동기화 primitive입니다.</p> +<p>Rust에서는 <code>std::sync::mpsc</code>(multiple producer, single consumer) 모듈을 사용하여 채널을 구현할 수 있습니다.</p> +<pre><code class="rust">use std::sync::mpsc; +use std::thread; + +fn main() { + let (tx, rx) = mpsc::channel(); + + thread::spawn(move || { + let val = String::from("안녕하세요"); + tx.send(val).unwrap(); + }); + + let received = rx.recv().unwrap(); + println!("수신: {}", received); +}</code></pre> +<h2 id="dmutex">d. 뮤텍스(Mutex) 및 동기화 프리미티브</h2> +<p>뮤텍스(Mutex)는 한 번에 하나의 스레드만 데이터에 접근할 수 있도록 하는 동기화 프리미티브입니다.</p> +<p>Rust에서 뮤텍스를 사용하려면 <code>std::sync::Mutex</code>를 사용합니다.</p> +<pre><code class="rust">use std::sync::{Arc, Mutex}; +use std::thread; + +fn main() { + let counter = Arc::new(Mutex::new(0::new())); + let mut handles = vec![]; + for _ in 0..10 { + let counter = Arc::clone(&counter); + let handle = thread::spawn(move || { + let mut num = counter.lock().unwrap(); + *num += 1; + }); + handles.push(handle); + } + + for handle in handles { + handle.join().unwrap(); + } + + println!("결과: {}", *counter.lock().unwrap()); +}</code></pre> +<h2 id="easyncawait">e. 비동기 프로그래밍 및 async/await</h2> +<p>비동기 프로그래밍은 동시에 실행되어야 하는 작업을 더 효율적으로 관리할 수 있도록 합니다.</p> +<p>Rust에서는 <code>async</code>와 <code>await</code> 키워드를 사용하여 비동기 코드를 작성할 수 있습니다.</p> +<pre><code class="rust">use futures::executor::block_on; + +async fn hello_world() { + println!("안녕, 비동기 세계!"); +} + +fn main() { + let future = hello_world(); // async 함수는 호출되면 Future를 반환합니다. + block_on(future); // 비동기 함수를 실행하기 위해 블로킹 실행기 사용 +}</code></pre> +<p>비동기 프로그래밍에서 주요한 것은 비동기 함수와 Future, 실행기(executor) 등의 개념입니다.</p> +<p>비동기 함수는 async fn으로 정의되며, Future를 반환합니다.</p> +<p>Future는 실행 결과를 나타내는 값으로, 실행기를 사용하여 평가할 수 있습니다.</p> +<p>이를 통해 동시에 실행되어야 하는 작업을 효율적으로 관리할 수 있습니다.</p> +<p>Rust에서는 주로 <code>tokio</code>라는 라이브러를 사용하여 async를 좀 더 쉽게 사용하고 더 많은 기능을 제공 받습니다.</p> +<p>tokio를 공부하고 싶으신 분들은 <a href="https://tokio.rs/" target="_blank" rel="noopener">@여기</a>를 참고하세요.</p> <div class="bottomnav"> - <span class="back"><a href="chapter_6_ko.html" rel="prev">❮ 이전</a></span> - <span class="next"><a href="chapter_7_ko.html" rel="next">다음 ❯</a></span> + <span class="back"><a href="chapter_4_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="40_ko.html" rel="next">다음 ❯</a></span> </div> </div> <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> diff --git a/docs/40_ko.html b/docs/40_ko.html index f0e69938a98b916ca6af80045f924b2b17bdcd9b..ea18f1cbb2b1bdca72e35c96dec8f5cd4d559e77 100644 --- a/docs/40_ko.html +++ b/docs/40_ko.html @@ -35,14 +35,107 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>매크로(Macros)</h1> + <p>Rust의 매크로 시스템은 코드를 생성하고 추상화하는 강력한 방법을 제공합니다.</p> +<h2 id="a">a. 매크로의 개념 및 사용 사례</h2> +<p>매크로는 코드를 생성하거나 특정 패턴에 따라 코드를 변형하는 데 사용되는 메타 프로그래밍 기술입니다.</p> +<p>Rust에서는 매크로를 사용하여 코드 중복을 줄이고, 가독성을 향상시키며, 유연한 추상화를 구현할 수 있습니다.</p> +<p>매크로는 주로 컴파일 시간에 코드를 생성하거나 수정하는 작업에 사용됩니다. (ex. <code>println!</code>)</p> +<h2 id="bdeclarativemacros">b. 선언형 매크로(Declarative Macros) 생성하기</h2> +<p>선언형 매크로는 매크로 규칙을 사용하여 코드를 생성하는 매크로입니다.</p> +<p><code>macro_rules!</code> 키워드를 사용하여 선언형 매크로를 정의할 수 있습니다.</p> +<pre><code class="rust">macro_rules! vec { + ( $( $x:expr ),* ) => { + { + let mut temp_vec = Vec::new(); + $( + temp_vec.push($x); + )* + temp_vec + } + }; +} + +fn main() { + let v = vec![1, 2, 3]; + println!("v: {:?}", v); +}</code></pre> +<h2 id="cproceduralmacros">c. 프로시저 매크로(Procedural Macros) 생성하기</h2> +<p>프로시저 매크로는 Rust의 컴파일러에 플러그인으로 동작하는 함수입니다.</p> +<p>프로시저 매크로는 주로 속성(attribute)에 사용되며, 소스 코드를 받아 변형된 소스 코드를 반환합니다.</p> +<p>프로시저 매크로를 정의하려면 <code>proc_macro</code> 라이브러리를 사용하고, 별도의 크레이트로 구성해야 합니다.</p> +<pre><code class="rust">// 프로시저 매크로를 정의하는 크레이트입니다. +use proc_macro::TokenStream; +use quote::quote; +use syn::{parse_macro_input, DeriveInput}; + +#[proc_macro_derive(HelloMacro)] +pub fn hello_macro_derive(input: TokenStream) -> TokenStream { + let ast = parse_macro_input!(input as DeriveInput); + let name = &ast.ident; + let gen = quote! { + impl HelloMacro for #name { + fn hello_macro() { + println!("안녕하세요, 여기는 {}입니다.", stringify!(#name)); + } + } + }; + gen.into() +}</code></pre> +<pre><code class="rust">// 프로시저 매크로를 사용하는 크레이트입니다. +use hello_macro::HelloMacro; +use hello_macro_derive::HelloMacro; + +#[derive(HelloMacro)] +struct Pancakes; + +fn main() { + Pancakes::hello_macro(); +}</code></pre> +<h2 id="d">d. 매크로 규칙 및 패턴 매칭</h2> +<p>Rust의 매크로는 패턴 매칭을 통해 매개 변수를 추출하고, 규칙에 따라 코드를 생성합니다.</p> +<p>매크로에서 패턴 매칭을 사용하려면 다음 구문을 사용합니다.</p> +<ul> +<li><code>$name:expr</code>: 표현식(Expressions) 매치</li> +<li><code>$name:ident</code>: 식별자(Identifiers) 매치</li> +<li><code>$name:ty</code>: 타입(Types) 매치</li> +<li><code>$name:pat</code>: 패턴(Patterns) 매치</li> +<li><code>$name:stmt</code>: 문장(Statements) 매치</li> +<li><code>$name:block</code>: 블록(Blocks) 매치</li> +<li><code>$name:meta</code>: 메타 데이터(Meta-data) 매치</li> +<li><code>$name:tt</code>: 토큰 트리(Token Tree) 매치</li> +<li><code>$name:item</code>: 항목(Items) 매치</li> +</ul> +<p>또한, 매크로에서 사용할 수 있는 반복자 구문도 있습니다.</p> +<ul> +<li><code>$(...)*</code>: 0회 이상 반복</li> +<li><code>$(...)+</code>: 1회 이상 반복</li> +</ul> +<pre><code class="rust">macro_rules! create_function { + ($func_name:ident) => ( + fn $func_name() { + println!("함수 {}가 호출되었습니다.", stringify!($func_name)); + } + ); +} + +create_function!(foo); +create_function!(bar); + +fn main() { + foo(); + bar(); +}</code></pre> +<p>이렇게 매크로를 사용하여 코드 생성 및 추상화를 구현하면, 유연한 프로그래밍을 할 수 있고, 가독성 및 유지보수성을 높일 수 있습니다.</p> +<p>매크로의 핵심은 패턴 매칭과 규칙을 통해 코드를 재사용하고, 확장성을 높이는 것입니다.</p> <div class="bottomnav"> - <span class="back"><a href="chapter_7_ko.html" rel="prev">❮ 이전</a></span> - + <span class="back"><a href="39_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="41_ko.html" rel="next">다음 ❯</a></span> + </div> </div> + <div class="code"> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=macro_rules%21+times+%7B%0D%0A++++%28%24num%3Aexpr%2C+%24body%3Ablock%29+%3D%3E+%7B%0D%0A++++++++times%21%28None%2C+%24num%2C+%24body%29%3B%0D%0A++++%7D%3B%0D%0A++++%28%24label%3Aexpr%2C+%24num%3Aexpr%2C+%24body%3Ablock%29+%3D%3E+%7B%0D%0A++++++++if+let+Some%28label%29+%3D+%24label+%7B%0D%0A++++++++++++println%21%28%22Task%3A+%7B%7D%22%2C+label%29%3B%0D%0A++++++++%7D%0D%0A%0D%0A++++++++let+mut+total_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Anew%280%2C+0%29%3B%0D%0A++++++++let+mut+min_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Afrom_secs%28u64%3A%3AMAX%29%3B%0D%0A++++++++let+mut+max_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Afrom_secs%280%29%3B%0D%0A%0D%0A++++++++for+_+in+0..%24num+%7B%0D%0A++++++++++++let+start_time+%3D+std%3A%3Atime%3A%3AInstant%3A%3Anow%28%29%3B%0D%0A++++++++++++%24body%0D%0A++++++++++++let+elapsed+%3D+start_time.elapsed%28%29%3B%0D%0A++++++++++++total_time+%2B%3D+elapsed%3B%0D%0A++++++++++++min_time+%3D+min_time.min%28elapsed%29%3B%0D%0A++++++++++++max_time+%3D+max_time.max%28elapsed%29%3B%0D%0A++++++++++++println%21%28%0D%0A++++++++++++++++%22Execution+time+for+iteration%3A+%7B%7D+ms%22%2C%0D%0A++++++++++++++++elapsed.as_millis%28%29%0D%0A++++++++++++%29%3B%0D%0A++++++++%7D%0D%0A%0D%0A++++++++let+avg_time+%3D+total_time+%2F+%24num%3B%0D%0A++++++++println%21%28%22Average+execution+time%3A+%7B%7D+ms%22%2C+avg_time.as_millis%28%29%29%3B%0D%0A++++++++println%21%28%22Minimum+execution+time%3A+%7B%7D+ms%22%2C+min_time.as_millis%28%29%29%3B%0D%0A++++++++println%21%28%22Maximum+execution+time%3A+%7B%7D+ms%22%2C+max_time.as_millis%28%29%29%3B%0D%0A++++%7D%3B%0D%0A%7D%0D%0A%0D%0Afn+is_prime%28n%3A+u64%29+-%3E+bool+%7B%0D%0A++++if+n+%3C%3D+1+%7B%0D%0A++++++++return+false%3B%0D%0A++++%7D%0D%0A++++for+i+in+2..%3D%28%28n+as+f64%29.sqrt%28%29+as+u64%29+%7B%0D%0A++++++++if+n+%25+i+%3D%3D+0+%7B%0D%0A++++++++++++return+false%3B%0D%0A++++++++%7D%0D%0A++++%7D%0D%0A++++true%0D%0A%7D%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++times%21%28Some%28%22Prime+number+summation%22%29%2C+3%2C+%7B%0D%0A++++++++let+mut+sum+%3D+0u64%3B%0D%0A++++++++let+mut+num+%3D+2u64%3B%0D%0A++++++++let+mut+counter+%3D+0%3B%0D%0A%0D%0A++++++++while+counter+%3C+10_000+%7B%0D%0A++++++++++++if+is_prime%28num%29+%7B%0D%0A++++++++++++++++sum+%2B%3D+num%3B%0D%0A++++++++++++++++counter+%2B%3D+1%3B%0D%0A++++++++++++%7D%0D%0A++++++++++++num+%2B%3D+1%3B%0D%0A++++++++%7D%0D%0A++++++++println%21%28%22Sum+of+first+10%2C000+prime+numbers%3A+%7B%7D%22%2C+sum%29%3B%0D%0A++++%7D%29%3B%0D%0A%7D" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> </div> - <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> </div> <script> var pres = document.querySelectorAll("pre>code"); diff --git a/docs/41_ko.html b/docs/41_ko.html index f0e69938a98b916ca6af80045f924b2b17bdcd9b..3387a9974b836b79725a9ddee4aeae6653d3e8e9 100644 --- a/docs/41_ko.html +++ b/docs/41_ko.html @@ -35,14 +35,65 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Hey</h1> - <p>CSW</p> + <h1>unsafe 코드</h1> + <p>Rust는 기본적으로 안전한 프로그래밍을 위한 다양한 기능을 제공합니다.</p> +<p>하지만, 때로는 안전성을 포기하고, 저수준의 시스템 작업을 수행해야 하는 경우가 있습니다.</p> +<p>이 때 <code>unsafe</code> 키워드를 사용합니다.</p> +<h2 id="aunsafe">a. unsafe의 개념 및 필요성</h2> +<p><code>unsafe</code>는 Rust 컴파일러가 안전성을 보장할 수 없는 코드를 표시하는 키워드입니다.</p> +<p>이를 사용하면 Rust의 안전성 검사를 우회하고, 저수준의 시스템 작업을 수행할 수 있습니다.</p> +<p>주로 외부 함수, 원시 포인터, 정적 변수에 접근하는 등의 작업에 사용됩니다.</p> +<h2 id="bunsafe">b. unsafe 함수 및 메서드</h2> +<p><code>unsafe</code> 키워드를 사용하여 함수와 메서드를 정의할 수 있습니다.</p> +<p>이를 사용하면 안전하지 않은 작업을 수행할 수 있습니다.</p> +<p>호출하는 쪽에서도 <code>unsafe</code> 블록 내에서 호출해야 합니다.</p> +<pre><code class="rust">unsafe fn dangerous_function() { + // 안전하지 않은 작업 수행 +} + +fn main() { + unsafe { + dangerous_function(); + } +}</code></pre> +<h2 id="crawpointers">c. 원시 포인터(Raw Pointers) 사용하기</h2> +<p>원시 포인터는 메모리 주소를 직접 가리키는 포인터로, Rust의 안전성을 보장하지 않습니다.</p> +<p><code>*const T</code>와 <code>*mut T</code> 형식으로 사용할 수 있습니다.</p> +<p>원시 포인터는 <code>unsafe</code> 블록 내에서 사용해야 합니다.</p> +<pre><code class="rust">fn main() { + let mut num = 5; + let r1 = &num as *const i32; + let r2 = &mut num as *mut i32; + + unsafe { + println!("r1 가리키는 값: {}", *r1); + println!("r2 가리키는 값: {}", *r2); + } +}</code></pre> +<h2 id="dffiforeignfunctioninterface">d. 외부 함수 및 FFI(Foreign Function Interface) 사용하기</h2> +<p>외부 함수는 다른 프로그래밍 언어로 작성된 함수를 Rust에서 호출할 수 있도록 해주는 인터페이스입니다.</p> +<p>외부 함수를 사용하려면 <code>extern</code> 키워드와 <code>unsafe</code>를 사용해야 합니다.</p> +<pre><code class="rust">// C 언어의 함수를 호출하는 예시 +extern "C" { + fn abs(input: i32) -> i32; +} + +fn main() { + let x = -3; + let result = unsafe { abs(x) }; + println!("{}의 절댓값은 {}입니다.", x, result); +}</code></pre> +<p>이렇게 <code>unsafe</code>를 사용하여 Rust의 안전성 검사를 우회할 수 있습니다.</p> +<p>하지만 가능한 한 <code>unsafe</code>를 사용하지 않고, 안전한 코드를 작성하는 것이 좋습니다.</p> +<p>정말 필요한 경우에만 사용하고, 주의해서 사용해야 합니다.</p> <div class="bottomnav"> - <span class="back"><a href="chapter_7_ko.html" rel="prev">❮ 이전</a></span> - + <span class="back"><a href="40_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="42_ko.html" rel="next">다음 ❯</a></span> + </div> </div> + <div class="code"> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=fn+main%28%29+%7B%0A++++let+mut+vec1+%3D+vec%21%5B1%2C+2%2C+3%5D%3B%0A++++let+mut+vec2+%3D+vec%21%5B4%2C+5%2C+6%5D%3B%0A%0A++++println%21%28%22%EA%B5%90%ED%99%98+%EC%A0%84%3A+vec1+%3D+%7B%3A%3F%7D%2C+vec2+%3D+%7B%3A%3F%7D%22%2C+vec1%2C+vec2%29%3B%0A%0A++++unsafe+%7B%0A++++++++unsafe_swap%28%26mut+vec1%2C+%26mut+vec2%29%3B%0A++++%7D%0A%0A++++println%21%28%22%EA%B5%90%ED%99%98+%ED%9B%84%3A+vec1+%3D+%7B%3A%3F%7D%2C+vec2+%3D+%7B%3A%3F%7D%22%2C+vec1%2C+vec2%29%3B%0A%7D%0A%0A%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EB%82%B4%EB%B6%80+%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC+%EC%A7%81%EC%A0%91+%EA%B5%90%ED%99%98%ED%95%98%EA%B8%B0+%EC%9C%84%ED%95%B4+%EC%9B%90%EC%8B%9C+%ED%8F%AC%EC%9D%B8%ED%84%B0%EC%99%80+unsafe%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94+%ED%95%A8%EC%88%98%0Aunsafe+fn+unsafe_swap%28vec1%3A+%26mut+%5Bi32%5D%2C+vec2%3A+%26mut+%5Bi32%5D%29+%7B%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EA%B8%B8%EC%9D%B4%EA%B0%80+%EA%B0%99%EC%9D%80%EC%A7%80+%ED%99%95%EC%9D%B8%0A++++assert_eq%21%28vec1.len%28%29%2C+vec2.len%28%29%29%3B%0A%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EB%82%B4%EB%B6%80+%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90+%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0+%EC%9C%84%ED%95%B4+%EC%9B%90%EC%8B%9C+%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC+%EC%83%9D%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4.%0A++++let+ptr1+%3D+vec1.as_mut_ptr%28%29%3B%0A++++let+ptr2+%3D+vec2.as_mut_ptr%28%29%3B%0A%0A++++%2F%2F+%EC%9B%90%EC%8B%9C+%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9B%90%EC%86%8C%EB%A5%BC+%EA%B5%90%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A++++for+i+in+0..vec1.len%28%29+%7B%0A++++++++%2F%2F+%EC%9B%90%EC%8B%9C+%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94+%EC%97%B0%EC%82%B0%EC%9D%80+unsafe+%EB%B8%94%EB%A1%9D+%EB%82%B4%EC%97%90%EC%84%9C+%EC%88%98%ED%96%89%ED%95%B4%EC%95%BC+%ED%95%A9%EB%8B%88%EB%8B%A4.%0A++++++++let+temp+%3D+*ptr1.add%28i%29%3B%0A++++++++*ptr1.add%28i%29+%3D+*ptr2.add%28i%29%3B%0A++++++++*ptr2.add%28i%29+%3D+temp%3B%0A++++%7D%0A%7D%0A" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> </div> - <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> </div> <script> var pres = document.querySelectorAll("pre>code"); diff --git a/docs/42_ko.html b/docs/42_ko.html new file mode 100644 index 0000000000000000000000000000000000000000..7504a17319614348df291a3412a34109785aadc7 --- /dev/null +++ b/docs/42_ko.html @@ -0,0 +1,107 @@ +<!DOCTYPE html> + <html lang="ko"> + <head> + <title>Rust 튜토리얼 - 자기주도프로젝트</title> + + <meta charset="UTF-8"> + <meta content="text/html;charset=utf-8" http-equiv="Content-Type"> + <meta content="utf-8" http-equiv="encoding"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"> + <meta name="keywords" content="Rust, Programming, Learning"> + <meta name="description" content="Rust tutorial website based on tour_of_rust by 최석원"> + <meta name="theme-color" content="#ff6801"/> + <meta http-equiv="Cache-Control" content="max-age=3600"> + + <link rel="stylesheet" href="tour.css"> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/night-owl.min.css"> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.1/css/all.min.css"> + + <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> + <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> + <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> + <link rel="/manifest" href="./site.webmanifest"> + + <script src="//unpkg.com/@highlightjs/cdn-assets@11.7.0/highlight.min.js"></script> + + <script src="./tour.js" defer></script> + <!-- <script>hljs.highlightAll();</script> --> + <script src="./highlight.badge.min.js"></script> + </head> + <body> + <div class="tour"> + <div class="header"> + <span class="title"><a href="index.html">Rust 튜토리얼</a></span> + <span class="nav"> + <span class="toc"><a href="TOC_ko.html">목차</a></span> + </div> + <div class="page"> + <h1>Chapter 4 - Conclusion</h1> + <p>다음은 여러분들이 unsafe와 macro를 사용하여 문제를 해결해 보는 고급 문제입니다.</p> +<p>아래 주석을 참고하여 코드를 완성해보세요.</p> +<p>문제 설명:<br /> +두 개의 Vec<i32> 벡터를 더하는 프로그램을 작성하세요.</p> +<p>이때, 매크로를 사용하여 덧셈 작업을 수행하고, 벡터의 내부 데이터에 직접 접근하기 위해 unsafe를 사용하세요.</p> +<ol> +<li>매크로를 사용하여 두 벡터의 덧셈을 수행하는 함수를 작성하세요.</li> +<li>unsafe를 사용하여 벡터의 내부 데이터에 접근하고 값을 더하세요.</li> +</ol> +<div> <button type="button" class="collapsible">정답 보기</button> <div class="content"> <p> <pre><code class="rust">// 매크로를 사용하여 두 벡터의 덧셈을 수행하는 함수를 작성합니다. +macro_rules! add_vectors { + ($vec1:expr, $vec2:expr) => { + add_vectors_unsafe(&$vec1, &$vec2) + }; +} + +fn main() { + let vec1 = vec![1, 2, 3]; + let vec2 = vec![4, 5, 6]; + let result = add_vectors!(vec1, vec2); + + println!("벡터 덧셈 결과: {:?}", result); +} + +fn add_vectors_unsafe(vec1: &[i32], vec2: &[i32]) -> Vec<i32> { + // 벡터의 길이가 같은지 확인합니다. + assert_eq!(vec1.len(), vec2.len()); + + let mut result = Vec::with_capacity(vec1.len()); + + // unsafe를 사용하여 벡터의 내부 데이터에 접근하고 값을 더합니다. + let ptr1 = vec1.as_ptr(); + let ptr2 = vec2.as_ptr(); + for i in 0..vec1.len() { + unsafe { + result.push(*ptr1.add(i) + *ptr2.add(i)); + } + } + + result +}</code></pre> </div> </div> + <div class="bottomnav"> + <span class="back"><a href="41_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="chapter_5_ko.html" rel="next">다음 ❯</a></span> + </div> + </div> + <div class="code"> + <iframe id="rust-playground" width="100%" src="https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+TODO+1%3A+%EB%A7%A4%ED%81%AC%EB%A1%9C%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC+%EB%91%90+%EB%B2%A1%ED%84%B0%EC%9D%98+%EB%8D%A7%EC%85%88%EC%9D%84+%EC%88%98%ED%96%89%ED%95%98%EB%8A%94+%ED%95%A8%EC%88%98%EB%A5%BC+%EC%9E%91%EC%84%B1%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0Amacro_rules%21+...%0D%0A%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++let+vec1+%3D+vec%21%5B1%2C+2%2C+3%5D%3B%0D%0A++++let+vec2+%3D+vec%21%5B4%2C+5%2C+6%5D%3B%0D%0A++++let+result+%3D+add_vectors%21%28vec1%2C+vec2%29%3B%0D%0A%0D%0A++++println%21%28%22%EB%B2%A1%ED%84%B0+%EB%8D%A7%EC%85%88+%EA%B2%B0%EA%B3%BC%3A+%7B%3A%3F%7D%22%2C+result%29%3B%0D%0A%7D%0D%0A%0D%0A%0D%0Afn+add_vectors_unsafe%28vec1%3A+%26%5Bi32%5D%2C+vec2%3A+%26%5Bi32%5D%29+-%3E+Vec%3Ci32%3E+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EA%B8%B8%EC%9D%B4%EA%B0%80+%EA%B0%99%EC%9D%80%EC%A7%80+%ED%99%95%EC%9D%B8%ED%95%A9%EB%8B%88%EB%8B%A4.%0D%0A++++assert_eq%21%28vec1.len%28%29%2C+vec2.len%28%29%29%3B%0D%0A%0D%0A++++let+mut+result+%3D+Vec%3A%3Awith_capacity%28vec1.len%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+TODO+2%3A+unsafe%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC+%EB%B2%A1%ED%84%B0%EC%9D%98+%EB%82%B4%EB%B6%80+%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90+%EC%A0%91%EA%B7%BC%ED%95%98%EA%B3%A0+%EA%B0%92%EC%9D%84+%EB%8D%94%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A++++%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0A%0D%0A++++result%0D%0A%7D%0D%0A" scrolling="no" frameborder="no" allowtransparency="true" allowfullscreen="true" sandbox="allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-modals" title="Rust Playground" loading="lazy"></iframe> + </div> + </div> + <script> + var pres = document.querySelectorAll("pre>code"); + for (var i = 0; i < pres.length; i++) { + hljs.highlightElement(pres[i]); + } + var options = { + loadDelay: 0, + copyIconClass: "far fa-clipboard", + checkIconClass: "fa fa-check text-success", + blogURL: "http://rust-study.ajousw.kr/" + }; + window.highlightJsBadge(options); + </script> + + <footer> + <p><a target="_blank" rel="noopener" href="https://www.youtube.com/c/SoftwareToolTime">아주대학교 Software Tool Time</a> - Rust 튜토리얼 (Basic)</p> + </footer> + </body> +</html> \ No newline at end of file diff --git a/docs/44_ko.html b/docs/44_ko.html new file mode 100644 index 0000000000000000000000000000000000000000..92162c6e6a2ea4e8c4d2fe1b833d92b61d67a4ca --- /dev/null +++ b/docs/44_ko.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> + <html lang="ko"> + <head> + <title>Rust 튜토리얼 - 자기주도프로젝트</title> + + <meta charset="UTF-8"> + <meta content="text/html;charset=utf-8" http-equiv="Content-Type"> + <meta content="utf-8" http-equiv="encoding"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"> + <meta name="keywords" content="Rust, Programming, Learning"> + <meta name="description" content="Rust tutorial website based on tour_of_rust by 최석원"> + <meta name="theme-color" content="#ff6801"/> + <meta http-equiv="Cache-Control" content="max-age=3600"> + + <link rel="stylesheet" href="tour.css"> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/night-owl.min.css"> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.1/css/all.min.css"> + + <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> + <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> + <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> + <link rel="/manifest" href="./site.webmanifest"> + + <script src="//unpkg.com/@highlightjs/cdn-assets@11.7.0/highlight.min.js"></script> + + <script src="./tour.js" defer></script> + <!-- <script>hljs.highlightAll();</script> --> + <script src="./highlight.badge.min.js"></script> + </head> + <body> + <div class="tour"> + <div class="header"> + <span class="title"><a href="index.html">Rust 튜토리얼</a></span> + <span class="nav"> + <span class="toc"><a href="TOC_ko.html">목차</a></span> + </div> + <div class="page"> + <h1>Hey</h1> + <p>CSW</p> + <div class="bottomnav"> + <span class="back"><a href="chapter_5_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="chapter_6_ko.html" rel="next">다음 ❯</a></span> + </div> + </div> + <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> + </div> + <script> + var pres = document.querySelectorAll("pre>code"); + for (var i = 0; i < pres.length; i++) { + hljs.highlightElement(pres[i]); + } + var options = { + loadDelay: 0, + copyIconClass: "far fa-clipboard", + checkIconClass: "fa fa-check text-success", + blogURL: "http://rust-study.ajousw.kr/" + }; + window.highlightJsBadge(options); + </script> + + <footer> + <p><a target="_blank" rel="noopener" href="https://www.youtube.com/c/SoftwareToolTime">아주대학교 Software Tool Time</a> - Rust 튜토리얼 (Basic)</p> + </footer> + </body> +</html> \ No newline at end of file diff --git a/docs/46_ko.html b/docs/46_ko.html new file mode 100644 index 0000000000000000000000000000000000000000..63ba0a75fcf6938fcb0d7db524f3a034c386e7bf --- /dev/null +++ b/docs/46_ko.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> + <html lang="ko"> + <head> + <title>Rust 튜토리얼 - 자기주도프로젝트</title> + + <meta charset="UTF-8"> + <meta content="text/html;charset=utf-8" http-equiv="Content-Type"> + <meta content="utf-8" http-equiv="encoding"> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"> + <meta name="keywords" content="Rust, Programming, Learning"> + <meta name="description" content="Rust tutorial website based on tour_of_rust by 최석원"> + <meta name="theme-color" content="#ff6801"/> + <meta http-equiv="Cache-Control" content="max-age=3600"> + + <link rel="stylesheet" href="tour.css"> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/night-owl.min.css"> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.1/css/all.min.css"> + + <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> + <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"> + <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"> + <link rel="/manifest" href="./site.webmanifest"> + + <script src="//unpkg.com/@highlightjs/cdn-assets@11.7.0/highlight.min.js"></script> + + <script src="./tour.js" defer></script> + <!-- <script>hljs.highlightAll();</script> --> + <script src="./highlight.badge.min.js"></script> + </head> + <body> + <div class="tour"> + <div class="header"> + <span class="title"><a href="index.html">Rust 튜토리얼</a></span> + <span class="nav"> + <span class="toc"><a href="TOC_ko.html">목차</a></span> + </div> + <div class="page"> + <h1>Hey</h1> + <p>CSW</p> + <div class="bottomnav"> + <span class="back"><a href="chapter_6_ko.html" rel="prev">❮ 이전</a></span> + + </div> + </div> + <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> + </div> + <script> + var pres = document.querySelectorAll("pre>code"); + for (var i = 0; i < pres.length; i++) { + hljs.highlightElement(pres[i]); + } + var options = { + loadDelay: 0, + copyIconClass: "far fa-clipboard", + checkIconClass: "fa fa-check text-success", + blogURL: "http://rust-study.ajousw.kr/" + }; + window.highlightJsBadge(options); + </script> + + <footer> + <p><a target="_blank" rel="noopener" href="https://www.youtube.com/c/SoftwareToolTime">아주대학교 Software Tool Time</a> - Rust 튜토리얼 (Basic)</p> + </footer> + </body> +</html> \ No newline at end of file diff --git a/docs/TOC_ko.html b/docs/TOC_ko.html index c12b814cb8a8968829172022bdb439ef1a130869..bb945aeb7e2b89eac9354309e3f99f5e2caaf9d0 100644 --- a/docs/TOC_ko.html +++ b/docs/TOC_ko.html @@ -68,17 +68,22 @@ <li><a href="28_ko.html">라이프타임: 참조의 유효 기간 이해하기</a></li> <li><a href="29_ko.html">빌림 검사기</a></li> <li><a href="30_ko.html">Chapter 2 - Conclusion</a></li> -</ul><h3><a href="chapter_3_ko.html">Chapter 3 - Generic, Trait</a></h3><ul> -<li><a href="32_ko.html">Hey</a></li> +</ul><h3><a href="chapter_3_ko.html">Chapter 3 - Collections and Iterators</a></h3><ul> +<li><a href="32_ko.html">주요 컬렉션 타입 소개</a></li> +<li><a href="33_ko.html">벡터(Vector)</a></li> +<li><a href="34_ko.html">벡터의 반복자(Iterators)</a></li> +<li><a href="35_ko.html">해시맵(HashMap)</a></li> +<li><a href="36_ko.html">이터레이터(Iterators) 소개</a></li> +<li><a href="37_ko.html">Chapter 3 - Conclusion</a></li> </ul><h3><a href="chapter_4_ko.html">Chapter 4 - Advanced</a></h3><ul> -<li><a href="34_ko.html">Hey</a></li> -<li><a href="35_ko.html">Hey</a></li> -</ul><h3><a href="chapter_5_ko.html">Chapter 5 - Module</a></h3><ul> -<li><a href="37_ko.html">Hey</a></li> -</ul><h3><a href="chapter_6_ko.html">Chapter 6 - Web Framework</a></h3><ul> -<li><a href="39_ko.html">Hey</a></li> -</ul><h3><a href="chapter_7_ko.html">부록 - 코드 답안</a></h3><ul> -<li><a href="41_ko.html">Hey</a></li> +<li><a href="39_ko.html">동시성(Concurrency)</a></li> +<li><a href="40_ko.html">매크로(Macros)</a></li> +<li><a href="41_ko.html">unsafe 코드</a></li> +<li><a href="42_ko.html">Chapter 4 - Conclusion</a></li> +</ul><h3><a href="chapter_5_ko.html">Chapter 5 - Cargo</a></h3><ul> +<li><a href="44_ko.html">Hey</a></li> +</ul><h3><a href="chapter_6_ko.html">Chapter 6 - 웹 서버</a></h3><ul> +<li><a href="46_ko.html">Hey</a></li> </ul> </div> <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;"> diff --git a/docs/chapter_3_ko.html b/docs/chapter_3_ko.html index 92d609622bb187895e60b5047d36ce22ea8bca81..6ba0a77abbb3dd950be93d6e5fff95949e43e983 100644 --- a/docs/chapter_3_ko.html +++ b/docs/chapter_3_ko.html @@ -35,14 +35,27 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Chapter 3 - Generic, Trait</h1> - <p>OOP</p> + <h1>Chapter 3 - Collections and Iterators</h1> + <h1 id="">컬렉션과 그 중요성</h1> +<p>컬렉션은 여러 요소를 그룹화하여 저장하고 관리할 수 있는 프로그래밍 구조입니다.</p> +<p>이러한 컬렉션은 데이터를 조직화하고, 검색, 추가 및 제거와 같은 다양한 작업을 수행할 수 있도록 돕습니다.</p> +<p>러스트에서는 주로 벡터(Vector), 문자열(String) 및 해시맵(HashMap)과 같은 컬렉션을 사용합니다.</p> +<h2 id="-1">컬렉션의 중요성</h2> +<p>프로그래밍에서 컬렉션은 다음과 같은 이유로 중요합니다.</p> +<ol> +<li><strong>데이터 조직화</strong>: 컬렉션을 사용하면 개별 변수를 사용하는 것보다 데이터를 보다 효율적으로 저장하고 관리할 수 있습니다.</li> +<li><strong>확장성</strong>: 컬렉션은 데이터를 동적으로 추가하거나 제거할 수 있어 프로그램의 유연성을 높입니다.</li> +<li><strong>검색 및 필터링</strong>: 컬렉션은 데이터를 쉽게 검색, 정렬 및 필터링할 수 있도록 지원합니다.</li> +<li><strong>성능 최적화</strong>: 러스트의 컬렉션은 메모리 접근 및 할당을 효율적으로 관리하여 성능을 향상시킵니다.</li> +</ol> +<p>이러한 이유로 컬렉션은 프로그래밍에서 핵심 요소로 간주되며, 러스트에서는 이를 효과적으로 활용할 수 있는 다양한 컬렉션 타입을 제공합니다.</p> +<p>이 챕터에서는 러스트의 주요 컬렉션 타입에 대해 알아보겠습니다.</p> <div class="bottomnav"> <span class="back"><a href="30_ko.html" rel="prev">❮ 이전</a></span> <span class="next"><a href="32_ko.html" rel="next">다음 ❯</a></span> </div> </div> - <div class="code"><center><img src="/ajou.webp" alt="Rust Tutorial" width="300" height="100%"></center></div> + <div class="code"><center><img src="/ferris_lofi.png" alt="Rust Tutorial" width="300" height="100%"></center></div> </div> <script> var pres = document.querySelectorAll("pre>code"); diff --git a/docs/chapter_4_ko.html b/docs/chapter_4_ko.html index 2ef530ac88d54e946fe1264dd17b4645a6126b37..ba320a37c3d417157f750a5c3d89742675cc626f 100644 --- a/docs/chapter_4_ko.html +++ b/docs/chapter_4_ko.html @@ -36,10 +36,31 @@ </div> <div class="page"> <h1>Chapter 4 - Advanced</h1> - <p>Concurrency, Macro, Unsafe</p> + <h1 id="rust">Rust 고급 주제: 강좌 개요</h1> +<p>이 장에서는 Rust의 고급 주제에 대해 다룹니다.</p> +<p>동시성, <code>unsafe</code>, 매크로와 같은 Rust 고급 구문에 대해 배웁니다.</p> +<h2 id="1concurrency">1. 동시성(Concurrency)</h2> +<p>Rust는 동시성 문제를 안전하게 다루기 위한 독특한 기능을 제공합니다.</p> +<p>a. 동시성의 개념 및 중요성<br /> +b. 스레드(Thread) 사용하기<br /> +c. 채널(Channels)을 사용한 통신<br /> +d. 뮤텍스(Mutex) 및 동기화 프리미티브<br /> +e. 비동기 프로그래밍 및 <code>async</code>/<code>await</code></p> +<h2 id="2unsafe">2. <code>unsafe</code> 코드</h2> +<p>Rust의 안전성 보장을 어기는 경우에는 <code>unsafe</code> 블록을 사용해야 합니다.</p> +<p>a. <code>unsafe</code>의 개념 및 필요성<br /> +b. <code>unsafe</code> 함수 및 메서드<br /> +c. 원시 포인터(Raw Pointers) 사용하기<br /> +d. 외부 함수 및 FFI(Foreign Function Interface) 사용하기</p> +<h2 id="3macros">3. 매크로(Macros)</h2> +<p>Rust의 매크로 시스템은 코드를 생성하고 추상화하는 강력한 방법을 제공합니다.</p> +<p>a. 매크로의 개념 및 사용 사례<br /> +b. 선언형 매크로(Declarative Macros) 생성하기<br /> +c. 프로시저 매크로(Procedural Macros) 생성하기<br /> +d. 매크로 규칙 및 패턴 매칭</p> <div class="bottomnav"> - <span class="back"><a href="32_ko.html" rel="prev">❮ 이전</a></span> - <span class="next"><a href="34_ko.html" rel="next">다음 ❯</a></span> + <span class="back"><a href="37_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="39_ko.html" rel="next">다음 ❯</a></span> </div> </div> <div class="code"><center><img src="/ajou.webp" alt="Rust Tutorial" width="300" height="100%"></center></div> diff --git a/docs/chapter_5_ko.html b/docs/chapter_5_ko.html index 7b04194b5db1fa0c4f3e5d9a7b6e13efb78e1d61..66bfafaed42b89d44bc721f6a66cb67d62e40d73 100644 --- a/docs/chapter_5_ko.html +++ b/docs/chapter_5_ko.html @@ -35,12 +35,12 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Chapter 5 - Module</h1> + <h1>Chapter 5 - Cargo</h1> <p>모듈 사용</p> <p>간단한 모듈 제작 및 업로드</p> <div class="bottomnav"> - <span class="back"><a href="35_ko.html" rel="prev">❮ 이전</a></span> - <span class="next"><a href="37_ko.html" rel="next">다음 ❯</a></span> + <span class="back"><a href="42_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="44_ko.html" rel="next">다음 ❯</a></span> </div> </div> <div class="code"><center><img src="/ajou.webp" alt="Rust Tutorial" width="300" height="100%"></center></div> diff --git a/docs/chapter_6_ko.html b/docs/chapter_6_ko.html index 86fae590bf72dcebf203522c8a41c1a9ed41c593..ea552e48388d52968cf86a0bd83e8fbb80c7416e 100644 --- a/docs/chapter_6_ko.html +++ b/docs/chapter_6_ko.html @@ -35,12 +35,12 @@ <span class="toc"><a href="TOC_ko.html">목차</a></span> </div> <div class="page"> - <h1>Chapter 6 - Web Framework</h1> + <h1>Chapter 6 - 웹 서버</h1> <p>웹 프레임워크 actix-rs 소개</p> <p>간단 카카오톡 챗봇 제작</p> <div class="bottomnav"> - <span class="back"><a href="37_ko.html" rel="prev">❮ 이전</a></span> - <span class="next"><a href="39_ko.html" rel="next">다음 ❯</a></span> + <span class="back"><a href="44_ko.html" rel="prev">❮ 이전</a></span> + <span class="next"><a href="46_ko.html" rel="next">다음 ❯</a></span> </div> </div> <div class="code"><center><img src="/ajou.webp" alt="Rust Tutorial" width="300" height="100%"></center></div> diff --git a/frontend/lessons/ko/chapter_2.yaml b/frontend/lessons/ko/chapter_2.yaml index 5e34aeb5f569f17202773202c4a530386b29829d..6dd810d08209b82a73f902a09a2fc1fff504d5bf 100644 --- a/frontend/lessons/ko/chapter_2.yaml +++ b/frontend/lessons/ko/chapter_2.yaml @@ -385,7 +385,7 @@ Rust의 핵심 개념인 소유권, 빌림, 그리고 빌림 검사기에 대해 배웠습니다. - 이러한 개념들은 Rust의 메모리 관리 체계의 핵심이며, 이를 이해하고 올바르게 사용함으로써 메모리 안전성과 효율성을 높일 수 있습니다/ + 이러한 개념들은 Rust의 메모리 관리 체계의 핵심이며, 이를 이해하고 올바르게 사용함으로써 메모리 안전성과 효율성을 높일 수 있습니다. Rust의 강력한 컴파일러와 빌림 검사기는 코드가 메모리 안전성을 보장하도록 도와줍니다. diff --git a/frontend/lessons/ko/chapter_3.yaml b/frontend/lessons/ko/chapter_3.yaml index dd4d5558990495bcbd179d1de5e9c07f53457604..512e8ae3f5edb028d3aa535779ca0efb499b8651 100644 --- a/frontend/lessons/ko/chapter_3.yaml +++ b/frontend/lessons/ko/chapter_3.yaml @@ -1,10 +1,525 @@ -- title: Chapter 3 - Generic, Trait - source: >- - /ajou.webp - content_markdown: > - OOP -- title: Hey +- title: Chapter 3 - Collections and Iterators source: >- /ferris_lofi.png content_markdown: > - CSW + # 컬렉션과 그 중요성 + + 컬렉션은 여러 요소를 그룹화하여 저장하고 관리할 수 있는 프로그래밍 구조입니다. + + + 이러한 컬렉션은 데이터를 조직화하고, 검색, 추가 및 제거와 같은 다양한 작업을 수행할 수 있도록 돕습니다. + + + 러스트에서는 주로 벡터(Vector), 문자열(String) 및 해시맵(HashMap)과 같은 컬렉션을 사용합니다. + + + ## 컬렉션의 중요성 + + 프로그래밍에서 컬렉션은 다음과 같은 이유로 중요합니다. + + + 1. **데이터 조직화**: 컬렉션을 사용하면 개별 변수를 사용하는 것보다 데이터를 보다 효율적으로 저장하고 관리할 수 있습니다. + + 2. **확장성**: 컬렉션은 데이터를 동적으로 추가하거나 제거할 수 있어 프로그램의 유연성을 높입니다. + + 3. **검색 및 필터링**: 컬렉션은 데이터를 쉽게 검색, 정렬 및 필터링할 수 있도록 지원합니다. + + 4. **성능 최적화**: 러스트의 컬렉션은 메모리 접근 및 할당을 효율적으로 관리하여 성능을 향상시킵니다. + + + 이러한 이유로 컬렉션은 프로그래밍에서 핵심 요소로 간주되며, 러스트에서는 이를 효과적으로 활용할 수 있는 다양한 컬렉션 타입을 제공합니다. + + + 이 챕터에서는 러스트의 주요 컬렉션 타입에 대해 알아보겠습니다. +- title: 주요 컬렉션 타입 소개 + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A + comment: >- + 이 예제 코드는 Vec, String, HashMap을 함께 사용하여 각각의 이름(String)에 대한 나이(u32) 정보를 저장하고 출력합니다. names 벡터에는 문자열로 된 이름이 저장되며, ages 해시맵에는 각 이름에 해당하는 나이가 저장됩니다. 코드는 벡터의 요소를 반복하며, 각 이름에 대한 나이를 해시맵에서 가져와 출력합니다. + content_markdown: > + 러스트는 일반적인 목적의 프로그래밍 데이터 구조에 대한 효율적인 구현을 제공하는 표준 컬렉션 라이브러리를 갖추고 있습니다. + + + 표준 구현을 사용하면 두 라이브러리 간에 데이터 변환 없이 원활하게 통신할 수 있습니다. + + + 가장 일반적인 사용 사례를 위해 `Vec` 또는 `HashMap`을 사용하는 것이 좋습니다. + + + 이 두 컬렉션은 대부분의 일반 데이터 저장 및 처리에 사용되며, 뛰어난 성능을 제공합니다. + + + 표준 라이브러리의 다른 컬렉션들은 특정 사용 사례에서 최적의 선택이지만, 비교적 특수한 경우에 해당합니다. + + + 실제로 `Vec`과 `HashMap`이 기술적으로 최적이 아니더라도, 시작하기에 충분한 선택이 될 것입니다. + + + 러스트의 컬렉션은 크게 4가지 주요 카테고리로 분류할 수 있습니다. + + 1. **Sequences**: `Vec`, `VecDeque`, `LinkedList` + + 2. **Maps**: `HashMap`, `BTreeMap` + + 3. **Sets**: `HashSet`, `BTreeSet` + + 4. **Misc**: `BinaryHeap` + + + 여기서는 러스트의 주요 컬렉션 타입인 벡터(Vector), 문자열(String) 및 해시맵(HashMap)에 대해 간략하게 소개하겠습니다. + + ## 벡터(Vector) + + 벡터는 동적 배열로, 연속된 메모리 공간에 저장되는 동일한 타입의 요소들을 가집니다. + + + 벡터는 크기를 자동으로 조절할 수 있으며, 요소에 빠르게 접근할 수 있는 장점이 있습니다. + + ## 문자열(String) + + 문자열은 UTF-8 인코딩된 문자의 연속으로 구성되어 있습니다. + + + 러스트의 문자열은 변경이 불가능한 `&str` 타입과 변경 가능한 `String` 타입이 있습니다. + + + 문자열은 텍스트 데이터를 저장하고 처리하는데 사용됩니다. + + ## 해시맵(HashMap) + + 해시맵은 키-값 쌍을 저장하는 데 사용되는 컬렉션입니다. + + + 해시 함수를 사용하여 키를 해싱하여 값을 빠르게 찾을 수 있습니다. + + + 해시맵은 삽입, 검색 및 삭제 작업에 대한 평균 시간 복잡도가 O(1)입니다. +- title: 벡터(Vector) + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A + comment: >- + 이 예제 코드는 Vec, String, HashMap을 함께 사용하여 각각의 이름(String)에 대한 나이(u32) 정보를 저장하고 출력합니다. names 벡터에는 문자열로 된 이름이 저장되며, ages 해시맵에는 각 이름에 해당하는 나이가 저장됩니다. 코드는 벡터의 요소를 반복하며, 각 이름에 대한 나이를 해시맵에서 가져와 출력합니다. + content_markdown: > + 벡터는 동적 배열로, 연속된 메모리 공간에 저장되는 동일한 타입의 요소들을 가집니다. + + + 벡터는 크기를 자동으로 조절할 수 있으며, 요소에 빠르게 접근할 수 있는 장점이 있습니다. + + + ## a. 벡터 생성 및 초기화 + + 벡터를 생성하려면 다음과 같은 방법을 사용할 수 있습니다. + + %rust% + // 빈 벡터 생성 + + let mut vec1: Vec<i32> = Vec::new(); + + + // 초기 값이 있는 벡터 생성 + + let vec2 = vec![1, 2, 3, 4, 5]; + %end% + + ## b. 벡터 요소에 접근하고 수정하기 + + 벡터 요소에 접근하거나 수정하려면 인덱스를 사용합니다. + + %rust% + // 벡터에서 인덱스를 사용해 요소에 접근하기 + + let first_element = vec2[0]; // 첫 번째 요소 + + + // 벡터에서 인덱스를 사용해 요소를 수정하기 + + vec1.push(10); // 벡터 끝에 10 추가 + + vec1[0] = 20; // 첫 번째 요소를 20으로 변경 + %end% + + ## c. 벡터 순회하기 + + 벡터의 요소를 반복하려면 `for` 루프를 사용합니다. + + %rust% + for element in vec2.iter() { + println!("요소: {}", element); + } + %end% + + ## d. 벡터 슬라이싱 + + 벡터의 일부분만 참조하려면 슬라이스를 사용합니다. + + %rust% + let slice = &vec2[1..3]; // 인덱스 1부터 2까지의 슬라이스 생성 + %end% + + ## e. 벡터 크기 조절 및 용량 관리 + + 벡터의 크기를 조절하거나 용량을 관리하려면 다음과 같은 메서드를 사용합니다. + + %rust% + vec1.reserve(10); // 최소한 10개 요소를 저장할 수 있는 공간을 확보 + vec1.shrink_to_fit(); // 벡터의 용량을 최소한으로 줄이기 + vec1.resize(5, 0); // 벡터 크기를 5로 조절하고, 새로운 요소를 0으로 초기화 + %end% + + ## f. 고급 벡터 사용법 + + 벡터의 고급 사용법에는 벡터에서 요소를 제거하거나 벡터의 일부를 다른 벡터로 이동하는 등의 작업이 포함됩니다. + + %rust% + // 벡터에서 인덱스 i의 요소 제거 + + let i = 2; + vec1.remove(i); + + + // 벡터에서 마지막 요소를 꺼내기 + + if let Some(last_element) = vec1.pop() { + println!("마지막 요소: {}", last_element); + } + %end% + + + 더 많은 메소드는 [공식 문서](https://doc.rust-lang.org/alloc/vec/struct.Vec.html#)를 참고하세요. +- title: 벡터의 반복자(Iterators) + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A + comment: >- + 이 예제 코드는 Vec, String, HashMap을 함께 사용하여 각각의 이름(String)에 대한 나이(u32) 정보를 저장하고 출력합니다. names 벡터에는 문자열로 된 이름이 저장되며, ages 해시맵에는 각 이름에 해당하는 나이가 저장됩니다. 코드는 벡터의 요소를 반복하며, 각 이름에 대한 나이를 해시맵에서 가져와 출력합니다. + content_markdown: > + 벡터와 같은 Iterator trait가 구현된 것들에는 요소들을 반복하고 처리할 때 사용할 수 있는 여러 가지 반복자 메서드가 있습니다. + + + `iter()`, `iter_mut()`, `into_iter()`는 각각 불변 참조, 가변 참조, 소유권 이동을 수행하는 반복자를 생성합니다. + + + ### 1. iter() + + `iter()` 메서드는 벡터의 각 요소에 대한 불변 참조를 생성하는 반복자를 반환합니다. + + + 이 반복자는 벡터의 요소를 읽기 전용으로 사용할 때 유용합니다. + + + %rust% + let vec = vec![1, 2, 3, 4, 5]; + + + for element in vec.iter() { + println!("요소: {}", element); + } + %end% + + + ### 2. iter_mut() + + `iter_mut()` 메서드는 벡터의 각 요소에 대한 가변 참조를 생성하는 반복자를 반환합니다. + + + 이 반복자는 벡터의 요소를 수정할 때 유용합니다. + + %rust% + let mut vec = vec![1, 2, 3, 4, 5]; + + + for element in vec.iter_mut() { + *element *= 2; // 각 요소에 2를 곱함 + } + + println!("변경된 벡터: {:?}", vec); + %end% + + ### 3. into_iter() + + `into_iter()` 메서드는 벡터의 각 요소의 소유권을 이동하는 반복자를 반환합니다. + + + 이 반복자는 벡터의 요소를 소유권을 이동시키며 처리할 때 유용합니다. + + + 이를 통해 벡터의 요소를 다른 데이터 구조로 쉽게 옮길 수 있습니다. + + + %rust% + let vec = vec!["a".to_string(), "b".to_string(), "c".to_string()]; + + + let mut uppercased_vec: Vec<String> = Vec::new(); + + + for element in vec.into_iter() { + uppercased_vec.push(element.to_uppercase()); + } + + + println!("대문자로 변경된 벡터: {:?}", uppercased_vec); + %end% + + `into_iter()`를 사용할 때 원래의 벡터는 더 이상 사용할 수 없습니다. + + + 소유권이 이동되어 원래 벡터에 대한 참조가 무효화되기 때문입니다. + + + ## 차이점 + + - `iter()`: 벡터의 요소에 대한 불변 참조를 생성하는 반복자를 반환합니다. 요소를 읽기 전용으로 사용할 때 사용됩니다. + + - `iter_mut()`: 벡터의 요소에 대한 가변 참조를 생성하는 반복자를 반환합니다. 요소를 수정할 때 사용됩니다. + + - `into_iter()`: 벡터의 요소의 소유권을 이동하는 반복자를 반환합니다. 요소를 소유권을 이동시키며 처리할 때 사용됩니다. + + + + 이러한 반복자들은 각각 다양한 상황에 따라 벡터를 처리할 수 있습니다. +- title: 해시맵(HashMap) + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A + comment: >- + 이 예제 코드는 Vec, String, HashMap을 함께 사용하여 각각의 이름(String)에 대한 나이(u32) 정보를 저장하고 출력합니다. names 벡터에는 문자열로 된 이름이 저장되며, ages 해시맵에는 각 이름에 해당하는 나이가 저장됩니다. 코드는 벡터의 요소를 반복하며, 각 이름에 대한 나이를 해시맵에서 가져와 출력합니다. + content_markdown: > + 해시맵은 키-값 쌍을 저장하는 데 사용되는 컬렉션입니다. + + + 해시 함수를 사용하여 키를 해싱하여 값을 빠르게 찾을 수 있습니다. + + + 해시맵은 삽입, 검색 및 삭제 작업에 대한 평균 시간 복잡도가 `O(1)`입니다. + + + ## a. 해시맵 생성 및 초기화 + + 해시맵을 생성하려면 다음과 같은 방법을 사용할 수 있습니다. + + + %rust% + use std::collections::HashMap; + + + // 빈 해시맵 생성 + + let mut scores: HashMap<String, u32> = HashMap::new(); + + + // 초기 값이 있는 해시맵 생성 + + let scores = vec![("Alice", 50), ("Bob", 60)] + .into_iter() + .map(|(k, v)| (k.to_string(), v)) + .collect::<HashMap<String, u32>>(); + %end% + + + ## b. 키-값 쌍 삽입 및 업데이트 + + 해시맵에 키-값 쌍을 삽입하거나 업데이트하려면 `insert` 메서드를 사용합니다. + + %rust% + // 키-값 쌍 삽입 + + scores.insert("Alice".to_string(), 50); + + scores.insert("Bob".to_string(), 60); + + + // 키-값 쌍 업데이트 + + scores.insert("Alice".to_string(), 55); + %end% + + ## c. 값에 접근하고 삭제하기 + + 해시맵에서 값을 접근하거나 삭제하려면 `get` 또는 `remove` 메서드를 사용합니다. + + %rust% + // 값에 접근하기 + + if let Some(score) = scores.get("Alice") { + println!("Alice의 점수: {}", score); + } + + + // 값 삭제하기 + + scores.remove("Alice"); + %end% + + ## d. 해시맵 순회하기 + + 해시맵의 키-값 쌍을 반복하려면 `for` 루프를 사용합니다. + + %rust% + for (key, value) in &scores { + println!("{}: {}", key, value); + } + %end% + + ## e. 일반적인 해시맵 작업 + + 해시맵에서 자주 사용되는 작업들은 다음과 같습니다. + + - `contains_key`: 특정 키가 해시맵에 있는지 확인합니다. + + - `keys`: 해시맵의 모든 키를 반환합니다. + + - `values`: 해시맵의 모든 값을 반환합니다. + + %rust% + // 키가 해시맵에 있는지 확인하기 + + if scores.contains_key("Alice") { + println!("Alice의 점수가 있습니다."); + } + + + // 해시맵의 모든 키 출력하기 + + for key in scores.keys() { + println!("키: {}", key); + } + + + // 해시맵의 모든 값 출력하기 + + for value in scores.values() { + println!("값: {}", value); + } + %end% + + 더 많은 메소드는 [공식 문서](https://doc.rust-lang.org/std/collections/struct.HashMap.html)를 참고하세요. +- title: 이터레이터(Iterators) 소개 + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC+%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0%0D%0Ause+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+names%3A+Vec%3CString%3E+%3D+Vec%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84+%EB%B2%A1%ED%84%B0%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++names.push%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%29%3B%0D%0A++++names.push%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5+%EC%83%9D%EC%84%B1%0D%0A++++let+mut+ages%3A+HashMap%3CString%2C+u32%3E+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC+%EC%97%B0%EA%B4%80%EB%90%9C+%EA%B0%92%EC%9D%84+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90+%EC%B6%94%EA%B0%80%0D%0A++++ages.insert%28%22%EC%B2%A0%EC%88%98%22.to_string%28%29%2C+25%29%3B%0D%0A++++ages.insert%28%22%EC%98%81%ED%9D%AC%22.to_string%28%29%2C+24%29%3B%0D%0A++++ages.insert%28%22%EB%AF%BC%EC%88%98%22.to_string%28%29%2C+26%29%3B%0D%0A%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9A%94%EC%86%8C%EB%93%A4%EC%9D%84+%EB%B0%98%EB%B3%B5%ED%95%98%EB%A9%B0%2C+%EA%B0%81+%EC%9D%B4%EB%A6%84%EC%97%90+%EB%8C%80%ED%95%9C+%EB%82%98%EC%9D%B4%EB%A5%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++for+name+in+names.iter%28%29+%7B%0D%0A++++++++%2F%2F+%ED%95%B4%EC%8B%9C%EB%A7%B5%EC%97%90%EC%84%9C+%EC%9D%B4%EB%A6%84%EC%97%90+%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94+%EB%82%98%EC%9D%B4%EB%A5%BC+%EA%B0%80%EC%A0%B8%EC%98%B4%0D%0A++++++++let+age+%3D+ages.get%28name%29.unwrap%28%29%3B%0D%0A%0D%0A++++++++%2F%2F+%EA%B2%B0%EA%B3%BC+%EC%B6%9C%EB%A0%A5%0D%0A++++++++println%21%28%22%7B%7D%EB%8B%98%EC%9D%98+%EB%82%98%EC%9D%B4%EB%8A%94+%7B%7D%EC%82%B4%EC%9E%85%EB%8B%88%EB%8B%A4.%22%2C+name%2C+age%29%3B%0D%0A++++%7D%0D%0A%7D%0D%0A + comment: >- + 이 예제 코드는 Vec, String, HashMap을 함께 사용하여 각각의 이름(String)에 대한 나이(u32) 정보를 저장하고 출력합니다. names 벡터에는 문자열로 된 이름이 저장되며, ages 해시맵에는 각 이름에 해당하는 나이가 저장됩니다. 코드는 벡터의 요소를 반복하며, 각 이름에 대한 나이를 해시맵에서 가져와 출력합니다. + content_markdown: > + 이터레이터는 Rust에서 컬렉션의 요소를 순회하고 처리하는 데 중요한 역할을 하는 추상화 개념입니다. + + + 이터레이터는 컬렉션의 요소를 효율적이고 간결한 방법으로 처리할 수 있게 도와줍니다. + + + ## a. 이터레이터 개념 및 Rust에서의 중요성 + + 이터레이터는 데이터 집합을 순차적으로 접근하는 데 사용되는 개체입니다. + + + Rust에서 이터레이터는 컬렉션의 요소를 처리하는 데 사용되며, 함수형 프로그래밍 패턴과 함께 사용할 수 있습니다. + + + 이터레이터는 함수형 프로그래밍을 지원하며, 일반적으로 Rust의 for 루프에서 사용됩니다. + + + Rust에서 이터레이터의 중요성은 다음과 같습니다: + + 1. 코드의 간결성: 이터레이터를 사용하면 반복문을 사용하는 코드를 보다 간결하게 작성할 수 있습니다. + + 2. 느긋한 평가(Lazy evaluation): 이터레이터는 필요한 경우에만 요소를 처리하므로, 메모리 사용량과 실행 시간을 줄일 수 있습니다. + + 3. 컴포지션: 이터레이터를 사용하면 여러 이터레이터 메서드를 연결하여 작업을 쉽게 구성할 수 있습니다. + + + ## b. Iterator 트레잇과 메서드 소개 (next, collect 등) + + `Iterator` 트레잇은 Rust의 이터레이터를 구현하는 데 사용되는 트레잇입니다. + + + 이 트레잇에는 다음과 같은 메서드가 정의되어 있습니다. + + ### next + + `next` 메서드는 이터레이터의 다음 요소를 반환합니다. + + + 모든 요소를 순회한 경우, `None`을 반환합니다. + + %rust% + let mut numbers = vec![1, 2, 3, 4, 5].into_iter(); + + + while let Some(number) = numbers.next() { + println!("Number: {}", number); + } + %end% + + ### collect + + `collect` 메서드는 이터레이터의 요소를 다른 컬렉션 타입으로 변환합니다. + + %rust% + let numbers = vec![1, 2, 3, 4, 5]; + + let doubled_numbers: Vec<_> = numbers.iter().map(|x| x * 2).collect(); + + + println!("Doubled numbers: {:?}", doubled_numbers); + %end% + + 이 외에도 다양한 이터레이터 메서드가 있습니다. + + + 예를 들어, `filter`, `map`, `fold`, `take`, `skip`, `all`, `any` 등의 메서드를 사용하여 이터레이터를 처리할 수 있습니다. + + + 더 많은 메소드는 [공식 문서](https://doc.rust-lang.org/core/iter/trait.Iterator.html)를 참고하세요. +- title: Chapter 3 - Conclusion + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=use+std%3A%3Acollections%3A%3AHashMap%3B%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++let+students+%3D+vec%21%5B%0D%0A++++++++%28%22%EA%B9%80%EC%B2%A0%EC%88%98%22%2C+80%29%2C%0D%0A++++++++%28%22%EC%9D%B4%EC%98%81%ED%9D%AC%22%2C+90%29%2C%0D%0A++++++++%28%22%EB%B0%95%EC%A7%80%EB%AF%BC%22%2C+85%29%2C%0D%0A++++++++%28%22%EC%B5%9C%EC%98%81%EC%88%98%22%2C+95%29%2C%0D%0A++++%5D%3B%0D%0A%0D%0A++++let+mut+names+%3D+Vec%3A%3Anew%28%29%3B%0D%0A++++let+mut+scores+%3D+HashMap%3A%3Anew%28%29%3B%0D%0A%0D%0A++++for+%28name%2C+score%29+in+students+%7B%0D%0A++++++++%2F%2F+TODO+1%3A+%EC%9D%B4%EB%A6%84+%EB%AA%A9%EB%A1%9D+Vec%EC%97%90+%ED%95%99%EC%83%9D+%EC%9D%B4%EB%A6%84%EC%9D%84+%EC%B6%94%EA%B0%80%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A++++++++%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0A%0D%0A++++++++%2F%2F+TODO+2%3A+%EC%9D%B4%EB%A6%84%EA%B3%BC+%EC%A0%90%EC%88%98%EB%A5%BC+HashMap%EC%97%90+%EC%A0%80%EC%9E%A5%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A++++++++%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0A++++%7D%0D%0A%0D%0A++++%2F%2F+TODO+3%3A+%ED%95%99%EC%83%9D%EB%93%A4%EC%9D%98+%ED%8F%89%EA%B7%A0+%EC%A0%90%EC%88%98%EB%A5%BC+%EA%B3%84%EC%82%B0%ED%95%98%EA%B3%A0+%EC%B6%9C%EB%A0%A5%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A++++%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0A%7D%0D%0A + content_markdown: > + 다음은 여러분들이 Vec와 HashMap을 사용하여 문제를 해결해 보는 고급 문제입니다. + + + 아래 주석을 참고하여 코드를 완성해보세요. + + + 문제 설명: + + 이름과 점수가 주어진 학생들의 정보를 Vec와 HashMap을 사용해 관리하고, 평균 점수를 계산하고 출력하는 프로그램을 작성하세요. + + 1. Vec를 사용하여 학생들의 이름 목록을 저장하세요. + + 2. HashMap을 사용하여 학생들의 이름과 점수를 저장하세요. + + 3. 학생들의 평균 점수를 계산하고 출력하세요. + + + <div> + <button type="button" class="collapsible">정답 보기</button> + <div class="content"> + <p> + %rust% + use std::collections::HashMap; + + + fn main() { + let students = vec![ + ("김철수", 80), + ("이영희", 90), + ("박지민", 85), + ("최영수", 95), + ]; + + let mut names = Vec::new(); + let mut scores = HashMap::new(); + + for (name, score) in students { + // 이름 목록 Vec에 학생 이름을 추가합니다. + names.push(name); + + // 이름과 점수를 HashMap에 저장합니다. + scores.insert(name, score); + } + + // 학생들의 평균 점수를 계산하고 출력합니다. + let total_score: i32 = scores.values().sum(); + let average_score: f64 = total_score as f64 / names.len() as f64; + println!("학생들의 평균 점수: {:.2}", average_score); + } + %end% + </div> + </div> diff --git a/frontend/lessons/ko/chapter_4.yaml b/frontend/lessons/ko/chapter_4.yaml index 7780cce3dab7beae448c940ef955c3bb3227feac..f95e8e45a545b239be6151dff791df2ad44902b8 100644 --- a/frontend/lessons/ko/chapter_4.yaml +++ b/frontend/lessons/ko/chapter_4.yaml @@ -2,14 +2,532 @@ source: >- /ajou.webp content_markdown: > - Concurrency, Macro, Unsafe -- title: Hey + # Rust 고급 주제: 강좌 개요 + + 이 장에서는 Rust의 고급 주제에 대해 다룹니다. + + + 동시성, `unsafe`, 매크로와 같은 Rust 고급 구문에 대해 배웁니다. + + + ## 1. 동시성(Concurrency) + + Rust는 동시성 문제를 안전하게 다루기 위한 독특한 기능을 제공합니다. + + + a. 동시성의 개념 및 중요성 + + b. 스레드(Thread) 사용하기 + + c. 채널(Channels)을 사용한 통신 + + d. 뮤텍스(Mutex) 및 동기화 프리미티브 + + e. 비동기 프로그래밍 및 `async`/`await` + + + ## 2. `unsafe` 코드 + + Rust의 안전성 보장을 어기는 경우에는 `unsafe` 블록을 사용해야 합니다. + + + a. `unsafe`의 개념 및 필요성 + + b. `unsafe` 함수 및 메서드 + + c. 원시 포인터(Raw Pointers) 사용하기 + + d. 외부 함수 및 FFI(Foreign Function Interface) 사용하기 + + + ## 3. 매크로(Macros) + + Rust의 매크로 시스템은 코드를 생성하고 추상화하는 강력한 방법을 제공합니다. + + + a. 매크로의 개념 및 사용 사례 + + b. 선언형 매크로(Declarative Macros) 생성하기 + + c. 프로시저 매크로(Procedural Macros) 생성하기 + + d. 매크로 규칙 및 패턴 매칭 +- title: 동시성(Concurrency) source: >- /ferris_lofi.png content_markdown: > - CSW -- title: Hey + ## a. 동시성의 개념 및 중요성 + + 동시성(Concurrency)은 여러 작업이 동시에 실행되는 것처럼 보이게 만드는 프로그래밍 기법입니다. + + + 동시성을 사용하면 애플리케이션의 성능을 향상시킬 수 있으며, 멀티코어 프로세서와 같은 병렬 컴퓨팅 기술을 최대한 활용할 수 있습니다. + + + Rust는 동시성 문제를 안전하게 다루기 위한 독특한 기능을 제공하며, + + + 이러한 기능 덕분에 데이터 경쟁이나 교착 상태와 같은 동시성 문제가 발생할 가능성을 줄일 수 있습니다. + + + ## b. 스레드(Thread) 사용하기 + + 스레드는 프로세스 내에서 실행되는 독립적인 작업 단위입니다. + + + Rust에서 스레드를 생성하고 관리하려면 `std::thread` 모듈을 사용합니다. + + %rust% + use std::thread; + + use std::time::Duration; + + + fn main() { + let handle = thread::spawn(|| { + for i in 1..10 { + println!("스레드에서: {}", i); + thread::sleep(Duration::from_millis(1)); + } + }); + + for i in 1..5 { + println!("메인 스레드에서: {}", i); + thread::sleep(Duration::from_millis(1)); + } + + handle.join().unwrap(); + } + %end% + + ## c. 채널(Channels)을 사용한 통신 + + 채널은 스레드 간에 메시지를 전달하는 동기화 primitive입니다. + + + Rust에서는 `std::sync::mpsc`(multiple producer, single consumer) 모듈을 사용하여 채널을 구현할 수 있습니다. + + + %rust% + use std::sync::mpsc; + + use std::thread; + + + fn main() { + let (tx, rx) = mpsc::channel(); + + thread::spawn(move || { + let val = String::from("안녕하세요"); + tx.send(val).unwrap(); + }); + + let received = rx.recv().unwrap(); + println!("수신: {}", received); + } + %end% + + + ## d. 뮤텍스(Mutex) 및 동기화 프리미티브 + + 뮤텍스(Mutex)는 한 번에 하나의 스레드만 데이터에 접근할 수 있도록 하는 동기화 프리미티브입니다. + + + Rust에서 뮤텍스를 사용하려면 `std::sync::Mutex`를 사용합니다. + + %rust% + use std::sync::{Arc, Mutex}; + + use std::thread; + + + fn main() { + let counter = Arc::new(Mutex::new(0::new())); + let mut handles = vec![]; + for _ in 0..10 { + let counter = Arc::clone(&counter); + let handle = thread::spawn(move || { + let mut num = counter.lock().unwrap(); + *num += 1; + }); + handles.push(handle); + } + + for handle in handles { + handle.join().unwrap(); + } + + println!("결과: {}", *counter.lock().unwrap()); + } + %end% + + + ## e. 비동기 프로그래밍 및 async/await + + 비동기 프로그래밍은 동시에 실행되어야 하는 작업을 더 효율적으로 관리할 수 있도록 합니다. + + + Rust에서는 `async`와 `await` 키워드를 사용하여 비동기 코드를 작성할 수 있습니다. + + %rust% + use futures::executor::block_on; + + + async fn hello_world() { + println!("안녕, 비동기 세계!"); + } + + + fn main() { + let future = hello_world(); // async 함수는 호출되면 Future를 반환합니다. + block_on(future); // 비동기 함수를 실행하기 위해 블로킹 실행기 사용 + } + %end% + + + 비동기 프로그래밍에서 주요한 것은 비동기 함수와 Future, 실행기(executor) 등의 개념입니다. + + + 비동기 함수는 async fn으로 정의되며, Future를 반환합니다. + + + Future는 실행 결과를 나타내는 값으로, 실행기를 사용하여 평가할 수 있습니다. + + + 이를 통해 동시에 실행되어야 하는 작업을 효율적으로 관리할 수 있습니다. + + + Rust에서는 주로 `tokio`라는 라이브러를 사용하여 async를 좀 더 쉽게 사용하고 더 많은 기능을 제공 받습니다. + + + tokio를 공부하고 싶으신 분들은 [@여기](https://tokio.rs/)를 참고하세요. +- title: 매크로(Macros) code: >- https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=macro_rules%21+times+%7B%0D%0A++++%28%24num%3Aexpr%2C+%24body%3Ablock%29+%3D%3E+%7B%0D%0A++++++++times%21%28None%2C+%24num%2C+%24body%29%3B%0D%0A++++%7D%3B%0D%0A++++%28%24label%3Aexpr%2C+%24num%3Aexpr%2C+%24body%3Ablock%29+%3D%3E+%7B%0D%0A++++++++if+let+Some%28label%29+%3D+%24label+%7B%0D%0A++++++++++++println%21%28%22Task%3A+%7B%7D%22%2C+label%29%3B%0D%0A++++++++%7D%0D%0A%0D%0A++++++++let+mut+total_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Anew%280%2C+0%29%3B%0D%0A++++++++let+mut+min_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Afrom_secs%28u64%3A%3AMAX%29%3B%0D%0A++++++++let+mut+max_time+%3D+std%3A%3Atime%3A%3ADuration%3A%3Afrom_secs%280%29%3B%0D%0A%0D%0A++++++++for+_+in+0..%24num+%7B%0D%0A++++++++++++let+start_time+%3D+std%3A%3Atime%3A%3AInstant%3A%3Anow%28%29%3B%0D%0A++++++++++++%24body%0D%0A++++++++++++let+elapsed+%3D+start_time.elapsed%28%29%3B%0D%0A++++++++++++total_time+%2B%3D+elapsed%3B%0D%0A++++++++++++min_time+%3D+min_time.min%28elapsed%29%3B%0D%0A++++++++++++max_time+%3D+max_time.max%28elapsed%29%3B%0D%0A++++++++++++println%21%28%0D%0A++++++++++++++++%22Execution+time+for+iteration%3A+%7B%7D+ms%22%2C%0D%0A++++++++++++++++elapsed.as_millis%28%29%0D%0A++++++++++++%29%3B%0D%0A++++++++%7D%0D%0A%0D%0A++++++++let+avg_time+%3D+total_time+%2F+%24num%3B%0D%0A++++++++println%21%28%22Average+execution+time%3A+%7B%7D+ms%22%2C+avg_time.as_millis%28%29%29%3B%0D%0A++++++++println%21%28%22Minimum+execution+time%3A+%7B%7D+ms%22%2C+min_time.as_millis%28%29%29%3B%0D%0A++++++++println%21%28%22Maximum+execution+time%3A+%7B%7D+ms%22%2C+max_time.as_millis%28%29%29%3B%0D%0A++++%7D%3B%0D%0A%7D%0D%0A%0D%0Afn+is_prime%28n%3A+u64%29+-%3E+bool+%7B%0D%0A++++if+n+%3C%3D+1+%7B%0D%0A++++++++return+false%3B%0D%0A++++%7D%0D%0A++++for+i+in+2..%3D%28%28n+as+f64%29.sqrt%28%29+as+u64%29+%7B%0D%0A++++++++if+n+%25+i+%3D%3D+0+%7B%0D%0A++++++++++++return+false%3B%0D%0A++++++++%7D%0D%0A++++%7D%0D%0A++++true%0D%0A%7D%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++times%21%28Some%28%22Prime+number+summation%22%29%2C+3%2C+%7B%0D%0A++++++++let+mut+sum+%3D+0u64%3B%0D%0A++++++++let+mut+num+%3D+2u64%3B%0D%0A++++++++let+mut+counter+%3D+0%3B%0D%0A%0D%0A++++++++while+counter+%3C+10_000+%7B%0D%0A++++++++++++if+is_prime%28num%29+%7B%0D%0A++++++++++++++++sum+%2B%3D+num%3B%0D%0A++++++++++++++++counter+%2B%3D+1%3B%0D%0A++++++++++++%7D%0D%0A++++++++++++num+%2B%3D+1%3B%0D%0A++++++++%7D%0D%0A++++++++println%21%28%22Sum+of+first+10%2C000+prime+numbers%3A+%7B%7D%22%2C+sum%29%3B%0D%0A++++%7D%29%3B%0D%0A%7D content_markdown: > - CSW + Rust의 매크로 시스템은 코드를 생성하고 추상화하는 강력한 방법을 제공합니다. + + ## a. 매크로의 개념 및 사용 사례 + + 매크로는 코드를 생성하거나 특정 패턴에 따라 코드를 변형하는 데 사용되는 메타 프로그래밍 기술입니다. + + + Rust에서는 매크로를 사용하여 코드 중복을 줄이고, 가독성을 향상시키며, 유연한 추상화를 구현할 수 있습니다. + + + 매크로는 주로 컴파일 시간에 코드를 생성하거나 수정하는 작업에 사용됩니다. (ex. `println!`) + + + ## b. 선언형 매크로(Declarative Macros) 생성하기 + + 선언형 매크로는 매크로 규칙을 사용하여 코드를 생성하는 매크로입니다. + + + `macro_rules!` 키워드를 사용하여 선언형 매크로를 정의할 수 있습니다. + + %rust% + macro_rules! vec { + ( $( $x:expr ),* ) => { + { + let mut temp_vec = Vec::new(); + $( + temp_vec.push($x); + )* + temp_vec + } + }; + } + + + fn main() { + let v = vec![1, 2, 3]; + println!("v: {:?}", v); + } + %end% + + + ## c. 프로시저 매크로(Procedural Macros) 생성하기 + + 프로시저 매크로는 Rust의 컴파일러에 플러그인으로 동작하는 함수입니다. + + + 프로시저 매크로는 주로 속성(attribute)에 사용되며, 소스 코드를 받아 변형된 소스 코드를 반환합니다. + + + 프로시저 매크로를 정의하려면 `proc_macro` 라이브러리를 사용하고, 별도의 크레이트로 구성해야 합니다. + + + %rust% + // 프로시저 매크로를 정의하는 크레이트입니다. + + use proc_macro::TokenStream; + + use quote::quote; + + use syn::{parse_macro_input, DeriveInput}; + + + #[proc_macro_derive(HelloMacro)] + + pub fn hello_macro_derive(input: TokenStream) -> TokenStream { + let ast = parse_macro_input!(input as DeriveInput); + let name = &ast.ident; + let gen = quote! { + impl HelloMacro for #name { + fn hello_macro() { + println!("안녕하세요, 여기는 {}입니다.", stringify!(#name)); + } + } + }; + gen.into() + } + %end% + + + %rust% + // 프로시저 매크로를 사용하는 크레이트입니다. + + use hello_macro::HelloMacro; + + use hello_macro_derive::HelloMacro; + + + #[derive(HelloMacro)] + + struct Pancakes; + + + fn main() { + Pancakes::hello_macro(); + } + %end% + + + ## d. 매크로 규칙 및 패턴 매칭 + + Rust의 매크로는 패턴 매칭을 통해 매개 변수를 추출하고, 규칙에 따라 코드를 생성합니다. + + + 매크로에서 패턴 매칭을 사용하려면 다음 구문을 사용합니다. + + - `$name:expr`: 표현식(Expressions) 매치 + + - `$name:ident`: 식별자(Identifiers) 매치 + + - `$name:ty`: 타입(Types) 매치 + + - `$name:pat`: 패턴(Patterns) 매치 + + - `$name:stmt`: 문장(Statements) 매치 + + - `$name:block`: 블록(Blocks) 매치 + + - `$name:meta`: 메타 데이터(Meta-data) 매치 + + - `$name:tt`: 토큰 트리(Token Tree) 매치 + + - `$name:item`: 항목(Items) 매치 + + + 또한, 매크로에서 사용할 수 있는 반복자 구문도 있습니다. + + - `$(...)*`: 0회 이상 반복 + + - `$(...)+`: 1회 이상 반복 + + + %rust% + macro_rules! create_function { + ($func_name:ident) => ( + fn $func_name() { + println!("함수 {}가 호출되었습니다.", stringify!($func_name)); + } + ); + } + + + create_function!(foo); + + create_function!(bar); + + + fn main() { + foo(); + bar(); + } + %end% + + 이렇게 매크로를 사용하여 코드 생성 및 추상화를 구현하면, 유연한 프로그래밍을 할 수 있고, 가독성 및 유지보수성을 높일 수 있습니다. + + + 매크로의 핵심은 패턴 매칭과 규칙을 통해 코드를 재사용하고, 확장성을 높이는 것입니다. + +- title: unsafe 코드 + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=fn+main%28%29+%7B%0A++++let+mut+vec1+%3D+vec%21%5B1%2C+2%2C+3%5D%3B%0A++++let+mut+vec2+%3D+vec%21%5B4%2C+5%2C+6%5D%3B%0A%0A++++println%21%28%22%EA%B5%90%ED%99%98+%EC%A0%84%3A+vec1+%3D+%7B%3A%3F%7D%2C+vec2+%3D+%7B%3A%3F%7D%22%2C+vec1%2C+vec2%29%3B%0A%0A++++unsafe+%7B%0A++++++++unsafe_swap%28%26mut+vec1%2C+%26mut+vec2%29%3B%0A++++%7D%0A%0A++++println%21%28%22%EA%B5%90%ED%99%98+%ED%9B%84%3A+vec1+%3D+%7B%3A%3F%7D%2C+vec2+%3D+%7B%3A%3F%7D%22%2C+vec1%2C+vec2%29%3B%0A%7D%0A%0A%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EB%82%B4%EB%B6%80+%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC+%EC%A7%81%EC%A0%91+%EA%B5%90%ED%99%98%ED%95%98%EA%B8%B0+%EC%9C%84%ED%95%B4+%EC%9B%90%EC%8B%9C+%ED%8F%AC%EC%9D%B8%ED%84%B0%EC%99%80+unsafe%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94+%ED%95%A8%EC%88%98%0Aunsafe+fn+unsafe_swap%28vec1%3A+%26mut+%5Bi32%5D%2C+vec2%3A+%26mut+%5Bi32%5D%29+%7B%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EA%B8%B8%EC%9D%B4%EA%B0%80+%EA%B0%99%EC%9D%80%EC%A7%80+%ED%99%95%EC%9D%B8%0A++++assert_eq%21%28vec1.len%28%29%2C+vec2.len%28%29%29%3B%0A%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EB%82%B4%EB%B6%80+%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90+%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0+%EC%9C%84%ED%95%B4+%EC%9B%90%EC%8B%9C+%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC+%EC%83%9D%EC%84%B1%ED%95%A9%EB%8B%88%EB%8B%A4.%0A++++let+ptr1+%3D+vec1.as_mut_ptr%28%29%3B%0A++++let+ptr2+%3D+vec2.as_mut_ptr%28%29%3B%0A%0A++++%2F%2F+%EC%9B%90%EC%8B%9C+%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC+%EB%B2%A1%ED%84%B0%EC%9D%98+%EC%9B%90%EC%86%8C%EB%A5%BC+%EA%B5%90%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.%0A++++for+i+in+0..vec1.len%28%29+%7B%0A++++++++%2F%2F+%EC%9B%90%EC%8B%9C+%ED%8F%AC%EC%9D%B8%ED%84%B0%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94+%EC%97%B0%EC%82%B0%EC%9D%80+unsafe+%EB%B8%94%EB%A1%9D+%EB%82%B4%EC%97%90%EC%84%9C+%EC%88%98%ED%96%89%ED%95%B4%EC%95%BC+%ED%95%A9%EB%8B%88%EB%8B%A4.%0A++++++++let+temp+%3D+*ptr1.add%28i%29%3B%0A++++++++*ptr1.add%28i%29+%3D+*ptr2.add%28i%29%3B%0A++++++++*ptr2.add%28i%29+%3D+temp%3B%0A++++%7D%0A%7D%0A + comment: >- + 이 예제에서는 벡터의 내부 데이터에 직접 접근하여 값을 교환하는 것이 가능하지만, Rust의 안전성을 보장할 수 없기 때문에 unsafe를 사용해야 합니다. 이런 경우에는 가능하면 안전한 Rust 코드를 사용하거나, 필요한 경우에만 최소한의 unsafe 코드를 사용하여 작업을 수행하는 것이 좋습니다. + content_markdown: > + Rust는 기본적으로 안전한 프로그래밍을 위한 다양한 기능을 제공합니다. + + + 하지만, 때로는 안전성을 포기하고, 저수준의 시스템 작업을 수행해야 하는 경우가 있습니다. + + + 이 때 `unsafe` 키워드를 사용합니다. + + + ## a. unsafe의 개념 및 필요성 + + `unsafe`는 Rust 컴파일러가 안전성을 보장할 수 없는 코드를 표시하는 키워드입니다. + + + 이를 사용하면 Rust의 안전성 검사를 우회하고, 저수준의 시스템 작업을 수행할 수 있습니다. + + + 주로 외부 함수, 원시 포인터, 정적 변수에 접근하는 등의 작업에 사용됩니다. + + + ## b. unsafe 함수 및 메서드 + + `unsafe` 키워드를 사용하여 함수와 메서드를 정의할 수 있습니다. + + + 이를 사용하면 안전하지 않은 작업을 수행할 수 있습니다. + + + 호출하는 쪽에서도 `unsafe` 블록 내에서 호출해야 합니다. + + + %rust% + unsafe fn dangerous_function() { + // 안전하지 않은 작업 수행 + } + + + fn main() { + unsafe { + dangerous_function(); + } + } + %end% + + + ## c. 원시 포인터(Raw Pointers) 사용하기 + + 원시 포인터는 메모리 주소를 직접 가리키는 포인터로, Rust의 안전성을 보장하지 않습니다. + + + `*const T`와 `*mut T` 형식으로 사용할 수 있습니다. + + + 원시 포인터는 `unsafe` 블록 내에서 사용해야 합니다. + + %rust% + fn main() { + let mut num = 5; + let r1 = &num as *const i32; + let r2 = &mut num as *mut i32; + + unsafe { + println!("r1 가리키는 값: {}", *r1); + println!("r2 가리키는 값: {}", *r2); + } + } + %end% + + + ## d. 외부 함수 및 FFI(Foreign Function Interface) 사용하기 + + 외부 함수는 다른 프로그래밍 언어로 작성된 함수를 Rust에서 호출할 수 있도록 해주는 인터페이스입니다. + + + 외부 함수를 사용하려면 `extern` 키워드와 `unsafe`를 사용해야 합니다. + + %rust% + // C 언어의 함수를 호출하는 예시 + + extern "C" { + fn abs(input: i32) -> i32; + } + + + fn main() { + let x = -3; + let result = unsafe { abs(x) }; + println!("{}의 절댓값은 {}입니다.", x, result); + } + %end% + + 이렇게 `unsafe`를 사용하여 Rust의 안전성 검사를 우회할 수 있습니다. + + + 하지만 가능한 한 `unsafe`를 사용하지 않고, 안전한 코드를 작성하는 것이 좋습니다. + + + 정말 필요한 경우에만 사용하고, 주의해서 사용해야 합니다. +- title: Chapter 4 - Conclusion + code: >- + https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=%2F%2F+TODO+1%3A+%EB%A7%A4%ED%81%AC%EB%A1%9C%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC+%EB%91%90+%EB%B2%A1%ED%84%B0%EC%9D%98+%EB%8D%A7%EC%85%88%EC%9D%84+%EC%88%98%ED%96%89%ED%95%98%EB%8A%94+%ED%95%A8%EC%88%98%EB%A5%BC+%EC%9E%91%EC%84%B1%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0Amacro_rules%21+...%0D%0A%0D%0A%0D%0Afn+main%28%29+%7B%0D%0A++++let+vec1+%3D+vec%21%5B1%2C+2%2C+3%5D%3B%0D%0A++++let+vec2+%3D+vec%21%5B4%2C+5%2C+6%5D%3B%0D%0A++++let+result+%3D+add_vectors%21%28vec1%2C+vec2%29%3B%0D%0A%0D%0A++++println%21%28%22%EB%B2%A1%ED%84%B0+%EB%8D%A7%EC%85%88+%EA%B2%B0%EA%B3%BC%3A+%7B%3A%3F%7D%22%2C+result%29%3B%0D%0A%7D%0D%0A%0D%0A%0D%0Afn+add_vectors_unsafe%28vec1%3A+%26%5Bi32%5D%2C+vec2%3A+%26%5Bi32%5D%29+-%3E+Vec%3Ci32%3E+%7B%0D%0A++++%2F%2F+%EB%B2%A1%ED%84%B0%EC%9D%98+%EA%B8%B8%EC%9D%B4%EA%B0%80+%EA%B0%99%EC%9D%80%EC%A7%80+%ED%99%95%EC%9D%B8%ED%95%A9%EB%8B%88%EB%8B%A4.%0D%0A++++assert_eq%21%28vec1.len%28%29%2C+vec2.len%28%29%29%3B%0D%0A%0D%0A++++let+mut+result+%3D+Vec%3A%3Awith_capacity%28vec1.len%28%29%29%3B%0D%0A%0D%0A++++%2F%2F+TODO+2%3A+unsafe%EB%A5%BC+%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC+%EB%B2%A1%ED%84%B0%EC%9D%98+%EB%82%B4%EB%B6%80+%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%97%90+%EC%A0%91%EA%B7%BC%ED%95%98%EA%B3%A0+%EA%B0%92%EC%9D%84+%EB%8D%94%ED%95%98%EC%84%B8%EC%9A%94.%0D%0A++++%2F%2F+%EC%B1%84%EC%9B%8C%EB%B3%B4%EC%84%B8%EC%9A%94.%0D%0A%0D%0A++++result%0D%0A%7D%0D%0A + content_markdown: > + 다음은 여러분들이 unsafe와 macro를 사용하여 문제를 해결해 보는 고급 문제입니다. + + + 아래 주석을 참고하여 코드를 완성해보세요. + + + 문제 설명: + + 두 개의 Vec<i32> 벡터를 더하는 프로그램을 작성하세요. + + + 이때, 매크로를 사용하여 덧셈 작업을 수행하고, 벡터의 내부 데이터에 직접 접근하기 위해 unsafe를 사용하세요. + + 1. 매크로를 사용하여 두 벡터의 덧셈을 수행하는 함수를 작성하세요. + + 2. unsafe를 사용하여 벡터의 내부 데이터에 접근하고 값을 더하세요. + + + <div> + <button type="button" class="collapsible">정답 보기</button> + <div class="content"> + <p> + %rust% + // 매크로를 사용하여 두 벡터의 덧셈을 수행하는 함수를 작성합니다. + + macro_rules! add_vectors { + ($vec1:expr, $vec2:expr) => { + add_vectors_unsafe(&$vec1, &$vec2) + }; + } + + + fn main() { + let vec1 = vec![1, 2, 3]; + let vec2 = vec![4, 5, 6]; + let result = add_vectors!(vec1, vec2); + + println!("벡터 덧셈 결과: {:?}", result); + } + + + fn add_vectors_unsafe(vec1: &[i32], vec2: &[i32]) -> Vec<i32> { + // 벡터의 길이가 같은지 확인합니다. + assert_eq!(vec1.len(), vec2.len()); + + let mut result = Vec::with_capacity(vec1.len()); + + // unsafe를 사용하여 벡터의 내부 데이터에 접근하고 값을 더합니다. + let ptr1 = vec1.as_ptr(); + let ptr2 = vec2.as_ptr(); + for i in 0..vec1.len() { + unsafe { + result.push(*ptr1.add(i) + *ptr2.add(i)); + } + } + + result + } + %end% + </div> + </div> diff --git a/frontend/lessons/ko/chapter_5.yaml b/frontend/lessons/ko/chapter_5.yaml index 36035776f0e9b1201f8403ba72bb1ccc4b1a28e9..3c6b2482bb463e31bbf0be342b0f83fddaa8e002 100644 --- a/frontend/lessons/ko/chapter_5.yaml +++ b/frontend/lessons/ko/chapter_5.yaml @@ -1,4 +1,4 @@ -- title: Chapter 5 - Module +- title: Chapter 5 - Cargo source: >- /ajou.webp content_markdown: > diff --git a/frontend/lessons/ko/chapter_6.yaml b/frontend/lessons/ko/chapter_6.yaml index f775a7dfd0474090d907f1016ae9a188aa65b36f..84a2ed0835ff69cc0c42e2fa17c08f276adefd71 100644 --- a/frontend/lessons/ko/chapter_6.yaml +++ b/frontend/lessons/ko/chapter_6.yaml @@ -1,4 +1,4 @@ -- title: Chapter 6 - Web Framework +- title: Chapter 6 - 웹 서버 source: >- /ajou.webp content_markdown: >