<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>소소한 개발 공부</title>
    <link>https://soso-study.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 20 Jul 2026 04:03:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>이내내</managingEditor>
    <image>
      <title>소소한 개발 공부</title>
      <url>https://tistory1.daumcdn.net/tistory/4352493/attach/75c0fa91a52f4f579988a2567e70207c</url>
      <link>https://soso-study.tistory.com</link>
    </image>
    <item>
      <title>[Rust] 컬렉션 - 해시맵</title>
      <link>https://soso-study.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;해시맵 HashMap&amp;lt;K, V&amp;gt; 은 K 타입의 키, V 타입의 값을 해시 함수를 사용해 매핑한 것을 저장&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;임의의 타입으로 된 키를 이용해 데이터를 찾고 싶을 때 유용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ex) 각 팀의 점수를 해시맵에 저장했을 때 팀 이름이 키, 점수가 값 -&amp;gt; 팀 이름으로 값 찾기 가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 해시맵 생성&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;new 로 생성, insert로 요소 추가&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;pub fn&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://doc.rust-lang.org/stable/std/collections/hash_map/struct.HashMap.html#method.insert&quot;&gt;insert&lt;/a&gt;(&amp;amp;mut self, k: K, v: V) -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://doc.rust-lang.org/stable/std/option/enum.Option.html&quot;&gt;Option&lt;/a&gt;&amp;lt;V&amp;gt; : K에 해당하는 V가 없다면 None 반환, 있다면 V 반환&lt;/p&gt;
&lt;pre id=&quot;code_1691712075760&quot; class=&quot;rust&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use std::collections::HashMap;

let mut scores = HashMap::new();

scores.insert(String::from(&quot;Blue&quot;), 10); // 키: Blue, 값: 10
scores.insert(String::from(&quot;Yellow&quot;), 50);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 사용량이 적은 컬렉션이라 prelude 의 자동으로 가져오는 기능에 포함되어 있지 않아 use 해야 함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 해시맵 값 접근&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;get 메서드에 키를 넣어 값을 가져올 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1691712075761&quot; class=&quot;rust&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let team_name = String::from(&quot;Blue&quot;);
let score = scores.get(&amp;amp;team_name).copied().unwrap_or(0);

println!(&quot;{:?}&quot;, score); // 10&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;get 메서드는 Option&amp;lt;&amp;amp;V&amp;gt;를 반환하는데, 해시맵 키에 해당 하는 값이 없다면 None 반환&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;copied() -&amp;gt; Option&amp;lt;&amp;amp;i32&amp;gt;가 아닌 Option&amp;lt;i32&amp;gt;를 얻을 수 있게 딥카피해서 iterator 반환&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;unwrap_or([default]} -&amp;gt; 해당 키에 대한 값을 반환, 없는 경우 defuault 로 0 반환&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;for문도 사용 가능&lt;/p&gt;
&lt;pre id=&quot;code_1691712075762&quot; class=&quot;less&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (key, value) in &amp;amp;scores {
    println!(&quot;{key}: {value}&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 해시맵 소유권&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;insert로 K, V를 넣을 때 move 가 일어날 수 있음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 참조자를 넣거나 clone 으로 딥카피해서 변수의 소유권을 유지&lt;/p&gt;
&lt;pre id=&quot;code_1691712075762&quot; class=&quot;rust&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main()
{
    let field_name = String::from(&quot;Favorite color&quot;);
    let field_value = String::from(&quot;Blue&quot;);

    let mut map = HashMap::new();
    map.insert(field_name, field_value); // 여기서 소유권을 잃음

    println!(&quot;{} {}&quot;, field_name, field_value); // 소유권 문제 발생
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1691712075762&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let field_name = String::from(&quot;Favorite color&quot;);
   |         ---------- move occurs because `field_name` has type `String`, which does not implement the `Copy` trait
...
9  |     map.insert(field_name, field_value);
   |                ---------- value moved here
10 |
11 |     println!(&quot;{} {}&quot;, field_name, field_value);
   |                       ^^^^^^^^^^ value borrowed here after move
   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
help: consider cloning the value if the performance cost is acceptable
   |
9  |     map.insert(field_name.clone(), field_value);
   |                          ++++++++&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 쓸거면 clone 해서 insert 하라는 뜻&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. 해시맵 업데이트&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 값 덮어쓰기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;키-값은 유니크함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;키에 이미 값이 할당되어 있는 경우 덮어쓴다! (insert 는 키-값 존재 여부 판단 안 함)&lt;/p&gt;
&lt;pre id=&quot;code_1691712075763&quot; class=&quot;rust&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let mut scores = HashMap::new();

scores.insert(String::from(&quot;Blue&quot;), 10);
scores.insert(String::from(&quot;Blue&quot;), 25);

println!(&quot;{:?}&quot;, scores); // 이 경우 {&quot;Blue&quot;: 25}가 출력됨&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 키가 없을 때만 키, 값 추가하기 : entry&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;entry(매개변수 : 검색하려는 키) -&amp;gt; 반환:열거형 Entry&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;열거형 Entry : 해당 키 존재 여부 {Occupied, Vacant}&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;or_insert : Occupied 일 경우 해당 값을 반환 / Vacant일 경우 새 값 삽입 후 해당 값 반환&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;pub fn&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://doc.rust-lang.org/stable/std/collections/hash_map/enum.Entry.html#method.or_insert&quot;&gt;or_insert&lt;/a&gt;(self, default: V) -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://doc.rust-lang.org/stable/std/primitive.reference.html&quot;&gt;&amp;amp;'a mut V&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(가변 참조자 반환)&lt;/p&gt;
&lt;pre id=&quot;code_1691712075764&quot; class=&quot;rust&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use std::collections::HashMap;

let mut scores = HashMap::new();
scores.insert(String::from(&quot;Blue&quot;), 10);

scores.entry(String::from(&quot;Yellow&quot;)).or_insert(50);
scores.entry(String::from(&quot;Blue&quot;)).or_insert(50);

println!(&quot;{:?}&quot;, scores); // {&quot;Blue&quot;: 10, &quot;Yellow&quot;: 50}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 예전 값에 기초해 값 업데이트하기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;text 에 각 단어가 몇번 나왔는지 세서 해시맵의 값을 변경시켜주는 예제&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 애스터리스크로 map 의 V에 접근해서 +1 (or_insert가 가변 참조자를 반환해서 역참조로 +1 가능)&lt;/p&gt;
&lt;pre id=&quot;code_1691712075764&quot; class=&quot;xquery&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let text = &quot;hello world wonderful world&quot;;
let mut map = HashMap::new();

for word in text.split_whitespace() {
    let count = map.entry(word).or_insert(0);
    *count += 1;
}

println!(&quot;{:?}&quot;, map); // {&quot;wonderful&quot;: 1, &quot;hello&quot;: 1, &quot;world&quot;: 2}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이때 map 의 출력 순서가 다를 수 있는데, 해시맵에 대한 반복 처리가 임의의 순서로 일어나기 때문&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5. 해시 함수&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 해시테이블과 관련된 Dos 공격에 저항 기능을 제공하는 SipHash 함수를 사용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가장 빠른 해시 알고리즘은 아니어서 성능은 낮지만 보안을 챙김&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 목적에 따라 다른 hasher를 지정해 해시 함수를 바꿀 수 있음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- hasher: BuildHasher trait을 구현한 타입&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- crate.io에 다양한 범용적 해시 알고리즘을 구현한 라이브러리가 있으므로 처음부터 구현하지 않아도 됨&lt;/p&gt;</description>
      <category>프로그래밍/Rust</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/108</guid>
      <comments>https://soso-study.tistory.com/108#entry108comment</comments>
      <pubDate>Fri, 11 Aug 2023 09:01:26 +0900</pubDate>
    </item>
    <item>
      <title>[Rust] use 키워드</title>
      <link>https://soso-study.tistory.com/107</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;use 키워드로 경로 가져오기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. use를 사용함으로써 함수를 가져오는 경로를 단축시킬 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1691667952325&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일 시스템의 심볼릭 링크(symbolic link)를 생성하는 것과 유사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(* 심볼릭 링크: 링크를 연결해 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- use로 가져온 경우도 privacy 규칙이 적용됨 -&amp;gt; 다른 스코프에서는 쓸 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.1) 사용된 스코프 내에서만 단축 경로가 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 customer에 mod로 스코프를 바꾸면 hosting의 단축경로가 적용되지 않아 사용하지 않았다는 warning이 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; use도 customer 안으로 옮기거나 super::hosting으로 부모 모듈로의 단축 경로를 참조하면 가능&lt;/p&gt;
&lt;pre id=&quot;code_1691669757873&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

use crate::front_of_house::hosting;

mod customer {
    pub fn eat_at_restaurant() {
        hosting::add_to_waitlist();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1691669764914&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;warning: unused import: `crate::front_of_house::hosting`
 --&amp;gt; src/main.rs:7:5
  |
7 | use crate::front_of_house::hosting;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.2) 아래와 같이 경로를 모두 작성하는 경우도 가능하지만 함수를 호출할 때 부모 모듈을 명시적으로 보여주는 것이 보편적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가져온 함수가 어디 정의되어 있는지 알기도 좋음&lt;/p&gt;
&lt;pre id=&quot;code_1691670571183&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mod front_of_house {
    pub mod hosting {
        pub fn add_to_waitlist() {}
    }
}

use crate::front_of_house::hosting::add_to_waitlist;

pub fn eat_at_restaurant() {
    add_to_waitlist();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.2-1) 구조체나 열거형 등을 가져올 때는 전체 경로를 작성하는 게 보편적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HashMap 표준 라이브러리 구조체를 use로 가져오는 예시&lt;/p&gt;
&lt;pre id=&quot;code_1691670692588&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert(1, 2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.3) 동일한 이름의 아이템을 여럿 가져오는 경우 부모 모듈을 반드시 명시 -&amp;gt; 누구의 것을 가져오는지 알기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동일한 Result 아이템을 같은 스코프에서 사용하는 예시&lt;/p&gt;
&lt;pre id=&quot;code_1691670978204&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use std::fmt; // use std::fmt::Result 으로 쓰게되면 누구의 Result를 쓰는지 알 수 없다
use std::io;

fn function1() -&amp;gt; fmt::Result {
    // --생략--
}

fn function2() -&amp;gt; io::Result&amp;lt;()&amp;gt; {
    // --생략--
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.3-1) as 키워드로 별칭을 제공해 동일한 이름의 타입 구분 가능&lt;/p&gt;
&lt;pre id=&quot;code_1691672866505&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use std::fmt::Result;
use std::io::Result as IoResult;

fn function1() -&amp;gt; Result {
    // --생략--
}

fn function2() -&amp;gt; IoResult&amp;lt;()&amp;gt; {
    // --생략--
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. pub use 로 다른 스코프에서도 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 곳에서 사용할 수 있게 만들기 때문에 다시 내보내기(re-exporting)라고도 함&lt;/p&gt;
&lt;pre id=&quot;code_1691673877638&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pub use crate::front_of_house::hosting;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 외부 패키지 사용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Cargo.toml 에 외부 패키지를 의존성으로 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 시 cargo가 crates.io에서 의존성을 다운로드 하여 프로젝트에서 패키지를 사용할 수 있게 됨(use 키워드로 스코프로 가져와 사용)&lt;/p&gt;
&lt;pre id=&quot;code_1691674182280&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Cargo.toml
rand = &quot;0.8.5&quot;

// project
use rand::Rng;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* std 표준 라이브러리도 외부 크레이트이므로, Cargo.toml에 추가할 필요는 없지만 use로 스코프로 가져와야 사용할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1691674429460&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use std::collections::HashMap;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 중첩 경로를 사용해 대량의 use 나열 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;use 중복되는경로{나뉘는 경로1, 나뉘는 경로2, ...}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1691674777550&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use std::cmp::Ordering;
use std::io;

// 이거를, 아래와 같이 중첩 가능
use std::{cmp::Ordering, io};

// 중복되는 경로 그자체인 경우 self 를 중첩 경로에 작성 
use std::io::{self, Write};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. glob 연산자 *&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로에 글롭 연산자를 붙이면 경로 안에 정의된 모든 public 아이템을 가져올 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; all 의 의미&lt;/p&gt;
&lt;pre id=&quot;code_1691675046224&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;use std::collections::*;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/Rust</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/107</guid>
      <comments>https://soso-study.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 10 Aug 2023 22:44:39 +0900</pubDate>
    </item>
    <item>
      <title>[Rust] 보편적인 프로그래밍 개념(데이터 타입 / 함수 / 주석 / 제어문)</title>
      <link>https://soso-study.tistory.com/106</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 데이터 타입&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;러스트는 타입이 고정된 강타입 언어로, 데이터 타입은 스칼라, 컴파운드(복합타입) 로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 강타입(strongly-type): 컴파일 타임에 타입 체크를 하며, 묵시적 형변환이 금지되는 언어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) 스칼라&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 값으로 표현되는 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정수형 / 부동 소수점 숫자형 / boolean / 문자(char) 가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정수형&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 99.9999%;&quot; colspan=&quot;3&quot;&gt;정수 타입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;bit size&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;signed&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;unsigned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;8-bit&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;i8&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;u8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;16-bit&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;i16&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;u16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;32-bit&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;i32 (일반적으로 사용)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;u32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;64-bit&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;i64&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;u64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;128-bit&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;i128&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;u128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;32-bit / 64-bit 아키텍처에 따라 다름&lt;br /&gt;- 포인터 타입&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;isize&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;usize&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수 리터럴 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Decimal -&amp;gt; 100_000 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Hex -&amp;gt; 0xff&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Octal -&amp;gt; 0o77&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Binary -&amp;gt; 0b0010&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Byte(u8 only) -&amp;gt; b'A'&lt;/p&gt;
&lt;pre id=&quot;code_1690293723345&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let tmp = 100_000;
    println!(&quot;{}&quot;, tmp); // output: 100000
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;부동 소수점 숫자형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- f32 / f64(기본 타입)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 명시적으로 타입을 적지 않은 상태라면 f64로 64bit 의 크기를 갖는다.&lt;/p&gt;
&lt;pre id=&quot;code_1690294024410&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let tmp = 32.2 / 6.5; // -&amp;gt; f64타입
    println!(&quot;{}&quot;, tmp); // output: 4.953846153846154

    let tmp2 : f32 = 32.2 / 6.5;
    println!(&quot;{}&quot;, tmp2); // output: 4.9538465
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Boolean형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true, false 값을 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문자형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;char로 작은 따옴표로 표기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unicode scalar 를 표현하는 값으로 아스키보다 많은 표현 가능&lt;/p&gt;
&lt;pre id=&quot;code_1690294464672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let c = 'z';
    let z = 'ℤ';
    let heart_eyed_cat = ' ';

    println!(&quot;{} {} {}&quot;, c, z, heart_eyed_cat); // z ℤ  
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) 컴파운드(복합 타입)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;러스트는 복합 타입으로 튜플과 배열을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;튜플&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 타입의 변수를 묶어서도 사용 가능하고, 0, 1, ... n 으로 인덱스를 사용해 원소를 사용할 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690294619403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
    println!(&quot;{} {} {}&quot;, tup.0, tup.1, tup.2); // 500 6.4 1
    
    let (tmp1, tmp2, tmp3) = tup;
    println!(&quot;{} {} {}&quot;, tmp1, tmp2, tmp3); // 500 6.4 1
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원소가 같은 요소를 묶은 집합. 한번 선언되면 크기가 변하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 각 요소는 인덱스로 접근 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 순회도 가능 (for 변수 in range)&lt;/p&gt;
&lt;pre id=&quot;code_1690295547052&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let a = [1, 2, 3, 4, 5];
    
    let first = a[0];
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1690295821562&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let a = [1, 2, 3, 4, 5];
    
    for i in 0..a.len() 
    {
        println!(&quot;{}&quot;, i);
    }
}
//0
//1
//2
//3
//4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- snake case 로 네이밍한다. (ex. function_example())&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 함수 정의는 main 함수의 위치에 종속되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매개변수 정의 방식 (두 개 이상인 경우 , 콤마로 구분)&lt;/p&gt;
&lt;pre id=&quot;code_1690296169028&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    another_function(5);
}

fn another_function(x: i32) {
    println!(&quot;The value of x is: {}&quot;, x);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리턴 타입 정의 방식 (정의되어 있지 않으면 묵시적으로 추론)&lt;/p&gt;
&lt;pre id=&quot;code_1690296880781&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn five() -&amp;gt; i32 {
    5 // 이것도 되고
    // return 5 // 이것도 됨
}

fn main() {
    let x = five();

    println!(&quot;The value of x is: {}&quot;, x);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- { 괄호 } 로 범위 생성 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수는 범위 안에 있는 것만 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 범위 밖에서 변수를 사용하면 -&amp;gt; cannot find value `변수` in this scope를 볼 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690296846122&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    {
        let tmp = 32;
    }
    println!(&quot;{}&quot;, tmp); // error
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 주석&lt;/h3&gt;
&lt;pre id=&quot;code_1690297334693&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이 방식 가능

/* 이 방식 가능 */&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 제어문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;if 조건식 {조건문 본문}&quot; 의 형태&lt;/p&gt;
&lt;pre id=&quot;code_1690298155542&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let number = 6;

    if number % 4 == 0 {
        println!(&quot;number is divisible by 4&quot;);
    } else if number % 3 == 0 {
        println!(&quot;number is divisible by 3&quot;);
    } else if number % 2 == 0 {
        println!(&quot;number is divisible by 2&quot;);
    } else {
        println!(&quot;number is not divisible by 4, 3, or 2&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 let 문에 if 로 표현식을 쓸 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690298318184&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let condition = true;
    let answer = if condition {
        true
    } else {
        false
    };

    println!(&quot;{}&quot;, answer); // true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while 또한 유사하게 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690298395131&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let mut number = 3;

    while number != 0 {
        println!(&quot;{}!&quot;, number);

        number = number - 1;
    }

    println!(&quot;LIFTOFF!!!&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Rust</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/106</guid>
      <comments>https://soso-study.tistory.com/106#entry106comment</comments>
      <pubDate>Wed, 26 Jul 2023 00:21:28 +0900</pubDate>
    </item>
    <item>
      <title>[Rust] 러스트 설치하기 - Windows</title>
      <link>https://soso-study.tistory.com/105</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Windows 에서 Rust 설치하기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;a href=&quot;https://www.rust-lang.org/en-US/install.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.rust-lang.org/en-US/install.html&lt;/a&gt; 에서 rustup 다운로드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령 프롬프트 창에서&lt;/p&gt;
&lt;pre id=&quot;code_1690126509833&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ rustup update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;삭제&lt;/p&gt;
&lt;pre id=&quot;code_1690126545907&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ rustup self uninstall&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 확인&lt;/p&gt;
&lt;pre id=&quot;code_1690126579232&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ rustc --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 에디터 설정하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(vscode 를 사용하는 경우라고 가정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) rust-analyzer 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VKdBp/btsoCGcz5eA/FtDxnnvIiZi9uY712lCF1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VKdBp/btsoCGcz5eA/FtDxnnvIiZi9uY712lCF1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VKdBp/btsoCGcz5eA/FtDxnnvIiZi9uY712lCF1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVKdBp%2FbtsoCGcz5eA%2FFtDxnnvIiZi9uY712lCF1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;253&quot; height=&quot;227&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 디버깅 툴 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- C/C++ - microsoft&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CodeLLDB&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1qKkN/btsoxF0vD2R/Y5fL8cdL9iKNt6SsrKz0mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1qKkN/btsoxF0vD2R/Y5fL8cdL9iKNt6SsrKz0mk/img.png&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;149&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.5753%; margin-right: 10px;&quot; data-widthpercent=&quot;49.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1qKkN/btsoxF0vD2R/Y5fL8cdL9iKNt6SsrKz0mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1qKkN%2FbtsoxF0vD2R%2FY5fL8cdL9iKNt6SsrKz0mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dizLnB/btsoyJ89TGN/SokcvQcwHtQxYO4XPfb760/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dizLnB/btsoyJ89TGN/SokcvQcwHtQxYO4XPfb760/img.png&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;148&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.85&quot; style=&quot;width: 50.2619%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dizLnB/btsoyJ89TGN/SokcvQcwHtQxYO4XPfb760/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdizLnB%2FbtsoyJ89TGN%2FSokcvQcwHtQxYO4XPfb760%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;259&quot; height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 프로젝트 생성&lt;/p&gt;
&lt;pre id=&quot;code_1690127685976&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo new hello_cargo --bin
$ cd hello_cargo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--bin 옵션은 바이너리 파일을 생성하는 옵션&lt;/p&gt;</description>
      <category>프로그래밍/Rust</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/105</guid>
      <comments>https://soso-study.tistory.com/105#entry105comment</comments>
      <pubDate>Mon, 24 Jul 2023 00:53:50 +0900</pubDate>
    </item>
    <item>
      <title>[러스트] 추리 게임</title>
      <link>https://soso-study.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;- 실습 프로젝트로 러스트를 익혀 보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let, match, 메서드, 연관 함수(associated functions), 외부 크레이트(externals crates) 등의 활용을 배워보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q. 1~100 사이의 임의의 정수를 생성한다. 다음으로 플레이어가 프로그램에 추리한 정수를 입력한다. 프로그램은 입력받은 추리값이 정답보다 높거나 낮은지 알려준다. 추리 값이 정답이라면 축하 메시지를 보여주고 종료된다. (=&amp;gt; 업앤다운)&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 프로젝트 생성&lt;/h3&gt;
&lt;pre id=&quot;code_1689604080522&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo new guessing_game --bin
$ cd guessing_game&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- cargo new : 프로젝트 이름 guessing_game 을 인자로 받는 명령어로 인자를 이름으로한 프로젝트 디렉터리를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; --bin 은 바이너리용 프로젝트를 생성하도록 하는 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 프로젝트는 기본적으로 src/main.rs 를 가지고 있으며 내용은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1689604419272&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    println!(&quot;Hello, world!&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cargo run&amp;nbsp;&lt;/b&gt;로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;프로젝트를 컴파일 및 실행할 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 추리값 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 먼저 사용자로부터 입력을 받아 처리한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689606511671&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// io 라이브러리를 가져오기. io 라이브러리는 std 표준 라이브러리에 있음
// 러스트 프로그램은 기본적으로 prelude 라는 라이브러리들을 지원하며, 여기서 심볼을 가져오는데 
// 원하는 타입, 심볼이 prelude에 없다면 use로 가져와야 함.
use std::io;

// main - 함수의 진입점. 여기서부터 프로그램이 시작
fn main() {

// !는 러스트 매크로로, 함수 대신 매크로를 호출. 
// 문자열을 스크린에 출력
    println!(&quot;Guess the number!&quot;);

    println!(&quot;Please input your guess.&quot;);

// let 으로 변수를 선언하고 mut 으로 해당 변수를 가변 변수로 명시 
// 가변 변수 guess 를 String 타입으로 선언 및 저장 공간 할당
// guess 변수에 String 인스턴스가 bind 됨 - 값을 확정 짓는 것
// :: 는 new 가 String 타입의 &quot;연관함수&quot; 임을 나타냄 &amp;lt;- 정적 메서드
// new : 빈 String 생성
    let mut guess = String::new();

// io 라이브러리의 연관함수인 stdin 호출
// read_line() 은 &amp;amp;mut guess를 인자로 하는 사용자 입력을 받는 메서드
// read_line 은 입력마다 문자열에 저장하므로 값을 저장할 공간이 필요 -&amp;gt; 매번 변경되므로 가변이어야 함
// &amp;amp; 는 참조자로 메모리를 여러번 복사하지 않고 접근하는 방법을 제공
// (&amp;amp;가 불변이라 &amp;amp;mut 으로 가변으로 바꿈)
    io::stdin().read_line(&amp;amp;mut guess)
        .expect(&quot;Failed to read line&quot;); // Result 타입

// 변경자(placeholder) 로 값 출력
    println!(&quot;You guessed: {}&quot;, guess);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Result 타입으로 잠재된 실패 다루기&lt;/p&gt;
&lt;pre id=&quot;code_1689626118513&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;io::stdin().read_line(&amp;amp;mut guess)
    .expect(&quot;Failed to read line&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서, read_line은 인자로 넘긴 문자열(&amp;amp;mut guess)에 입력을 저장하며, io::Result 값을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Result 타입은 열거형(enumerations, enums)으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 정해진 값만 가질 수 있으며, 이 정해진 값들을 열거형의 variants 라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Result 의 variants 는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ok : 처리가 성공했음을 나타냄. 내부적으로 성공적으로 생성된 결과를 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Err : 처리가 실패했음을 나타냄. 그 이유에 대한 정보를 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;io::Result는 expect 메서드를 가지는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;io::Result 가 Ok 일 경우 -&amp;gt; Ok 가 가진 결과값(표준입력으로 들어온 바이트 수)을 반환해 사용할 수 있도록 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;io::Result 가 Err 일 경우 -&amp;gt; 프로그램이 작동을 멈추고 expect에 인자로 넘겼던 (에러)메시지를 출력하도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- read_line 에서 Err 를 반환했다면, 운영체제로부터 생긴 에러 일 경우가 큼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- expect 를 호출하지 않는 경우, 컴파일은 되지만 Result를 사용하지 않았다는 warning 을 도출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) prinln! 변경자(placeholder)를 이용한 값 출력&lt;/p&gt;
&lt;pre id=&quot;code_1689627401609&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;println!(&quot;You guessed: {}&quot;, guess);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{} 는 변경자로 값이 표시되는 위치를 나타내며, 하나 이상의 값을 표시할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 {}는 포맷 스트링 뒤 첫번째 값 (여기서는 guess) 를 나타내며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 {} 의 개수 만큼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;포맷 스트링 뒤에 붙는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;인자를 보여줄 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1689627585473&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let x = 5;
let y = 10;

println!(&quot;x = {} and y = {}&quot;, x, y);
// output: x = 5 and y = 10&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 비밀번호 생성하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1~100 사이 매번 랜덤한 번호를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; rand 크레이트를 활용해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* crate : 패키지 (러스트 코드 묶음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* rand crate : 다른 프로그램에서 사용되기 위한 용도의 library crate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 크레이트를 사용하려면 Cargo.toml 의 [dependencies] 에 추가하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1689627844090&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[dependencies]

rand = &quot;0.3.14&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- [dependencies]는 프로젝트가 의존하고 있는 외부 크레이트와 그 버전을 명시하는 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; cargo build 혹은 cargo run로&amp;nbsp; rand 라이브러리를 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dependencies 에는 rand만 추가했지만, rand 가 libc 에 의존하므로 같이 다운로드 받아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Cargo 는 Crates.io (러스트 오픈소스) 데이터의 복사본인 레지스트리에서 라이브러리들을 가져온다.&lt;/p&gt;
&lt;pre id=&quot;code_1689628032745&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo build
    Updating registry `https://github.com/rust-lang/crates.io-index`
 Downloading rand v0.3.14
 Downloading libc v0.2.14
   Compiling libc v0.2.14
   Compiling rand v0.3.14
   Compiling guessing_game v0.1.0 (file:///projects/guessing_game)
    Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Cargo.lock&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cargo.lock 은 모든 의존 패키지의 버전을 확인하고 이를 기록해 빌드 시 그 안에 명시된 버전을 사용하도록 하는 기능을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, dependencies 에 기재된 버전을 업그레이드 하지 않는 이상, 기재된 버전을 사용함으로써 안정된 버전을 사용하는 것을 보장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 크레이트를 업그레이드 하고 싶다면, update 명령어를 사용하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 새로운 버전을 사용하게 하고, 만약 새 버전이 문제가 없다면 Cargo.lock 에 기재해 사용할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 현재 Cargo.toml에 v.0.3.~ 버전이 기재되어 있으므로 아래처럼 0.3.~ 버전대에서 업그레이드 할 수 있는 버전(0.3.15)을 찾는다.&lt;/p&gt;
&lt;pre id=&quot;code_1689628620866&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo update
    Updating registry `https://github.com/rust-lang/crates.io-index`
    Updating rand v0.3.14 -&amp;gt; v0.3.15&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 버전대로 업그레이드 하고 싶다면, Cargo.toml 을 변경하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1689628968489&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[dependencies]

rand = &quot;0.4.0&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;임의의 숫자 생성하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 코드에서는 어떻게 달라지는지 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1689629040498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extern crate rand;

use std::io;
use rand::Rng;

fn main() {
    ...
    
// read::thread_rng: OS가 seed 를 정하고 현재 스레드에서만 사용되는 정수 생성기를 반환
// get_range : 두 숫자를 인자로 받고 두 수 사이의 임의의 숫자를 반환(1 ~ 99 중 하나를 반환)
    let secret_number = rand::thread_rng().gen_range(1, 101);

    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단에 rand 크레이트를 외부에서 가져오고, use 하는 문구가 추가되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 rand:: 를 이용해 rand 내의 모든 것을 호출할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rand::Rng 는 정수 생성기가 구현한 메서드들을 정의한 trait 이다. (trait은 나중에 알아본다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 크레이트에 대한 내용은 cargo doc --open 으로 공식 문서를 열어 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 비밀번호와 추리값 비교하기&lt;/h3&gt;
&lt;pre id=&quot;code_1689630380163&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extern crate rand;

use std::io;
// Less, Greater, Equal 열거형을 나타냄
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    ...

// 여기서 guess 를 u32 타입으로 섀도우해주어 match에서 타입 에러가 나지 않게 한다.
// trim : String 앞, 뒤의 스페이스 제거
// parse : String 을 정수형으로 파싱
// expect : 파싱 실패 시 에러 메시지 출력
    let guess: u32 = guess.trim().parse()
        .expect(&quot;Please type a number!&quot;);

    ...

// cmp : 두 값을 비교하며, 비교 가능한 모든 것에 대해 호출한다.
// 인자로 &amp;amp;secret_number를 받아 guess 와 비교한다.
// match 는 표현문으로 guess와 secret_number를 비교한 결과에 따라 어떤 println! 이 나올지 결정한다.
    match guess.cmp(&amp;amp;secret_number) {
        Ordering::Less    =&amp;gt; println!(&quot;Too small!&quot;),
        Ordering::Greater =&amp;gt; println!(&quot;Too big!&quot;),
        Ordering::Equal   =&amp;gt; println!(&quot;You win!&quot;),
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;match 표현식은 arm 으로 이뤄져있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- arm : match 의 각 케이스 ex) Ordering::Less&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;gt; println!(&quot;Too small!&quot;)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매칭은 처음부터 순서대로 수행되는데, 만약 중간(Greater쯤)에서 매칭이 이뤄진다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당하는 코드 (println!)를 실행하고 match문을 빠져나간다. (break 필요 x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 반복으로 여러 번 추리하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- loop 키워드를 사용해 반복문을 돌린다.&lt;/p&gt;
&lt;pre id=&quot;code_1689722526781&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;loop {
    문장 ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- break 키워드로 빠져나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;break 키워드가 없으면, 무한 루프를 돌기 때문에 Ctrl+c 나 프로그램 내 비정상 종료 (Result expect - Err)일 경우에 빠져나갈 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- continue 키워드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 입력을 받지 못한 경우 입력 다음 처리를 건너뛰어 다시 루프를 시작하게 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689722676670&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 반복 시작
    loop {
        ...
        
// expect -&amp;gt; match 로 바꿔 Err 시 종료를 Err 시 continue 처리로 바꾼다.
        let guess: u32 = match guess.trim().parse() {
            Ok(num) =&amp;gt; num,     // &amp;lt;- guess 는 num 값을 갖게 된다.
            Err(_) =&amp;gt; continue, // &amp;lt;- 여기서 해당 반복을 건너뛰고 다음 반복을 시작할 수 있다.
        };

        ...
        
        match guess.cmp(&amp;amp;secret_number) {
            Ordering::Less    =&amp;gt; println!(&quot;Too small!&quot;),
            Ordering::Greater =&amp;gt; println!(&quot;Too big!&quot;),
            Ordering::Equal   =&amp;gt; {
                println!(&quot;You win!&quot;);
                break; // &amp;lt;- 여기서 loop 를 빠져나갈 수 있다.
            }
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* _ 는 모든 값과 매칭할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 코드&lt;/p&gt;
&lt;pre id=&quot;code_1689724498974&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extern crate rand;

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

fn main() {
    println!(&quot;Guess the number!&quot;);

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

    loop {
        println!(&quot;Please input your guess.&quot;);

        let mut guess = String::new();

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

        let guess: u32 = match guess.trim().parse() {
            Ok(num) =&amp;gt; num,
            Err(_) =&amp;gt; continue,
        };

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

        match guess.cmp(&amp;amp;secret_number) {
            Ordering::Less    =&amp;gt; println!(&quot;Too small!&quot;),
            Ordering::Greater =&amp;gt; println!(&quot;Too big!&quot;),
            Ordering::Equal   =&amp;gt; {
                println!(&quot;You win!&quot;);
                break;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/Rust</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/104</guid>
      <comments>https://soso-study.tistory.com/104#entry104comment</comments>
      <pubDate>Tue, 18 Jul 2023 05:55:52 +0900</pubDate>
    </item>
    <item>
      <title>[러스트] 불변성</title>
      <link>https://soso-study.tistory.com/103</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;모든 프로그래밍 언어 대부분이 가진 개념을 러스트가 어떻게 다루는지 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수, 기본 타입들, 함수, 주석, 제어문 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변수와 가변성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 변수는 &lt;b&gt;불변성&lt;/b&gt; 즉, 변하지 않는다. =&amp;gt; 안전성과 손쉬운 동시성을 가질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수가 불변인 경우, 값이 이름에 bind 되면 해당 값을 변경할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 처럼 variables 디렉터리를 생성해 확인해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1689599607379&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cargo new --bin variables&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/main.rs&lt;/p&gt;
&lt;pre id=&quot;code_1689599667565&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let x = 5;
    println!(&quot;The value of x is: {}&quot;, x);
    x = 6;
    println!(&quot;The value of x is: {}&quot;, x);
}


//
error[E0384]: cannot assign twice to immutable variable `x`
 --&amp;gt; src/main.rs:4:5
  |
2 |     let x = 5;
  |         -
  |         |
  |         first assignment to `x`
  |         help: consider making this binding mutable: `mut x`
3 |     println!(&quot;The value of x is: {}&quot;, x);
4 |     x = 6;
  |     ^^^^^ cannot assign twice to immutable variable

For more information about this error, try `rustc --explain E0384`.
error: could not compile `variables` (bin &quot;variables&quot;) due to previous error&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러가 나는데, 이는 불변성 변수 x에 재할당을 했기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;러스트는 변수의 불변성을 보장함으로써 변수의 값이 변경되어 버그가 일어나는 경우(고통의 트래킹!)를 방지함으로써 코드를 더 합리적으로 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 러스트는 가변성의 유용성 역시 놓치지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로, mut 을 사용함으로써 변수를 가변적으로 만드는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mut 은 x에 bind된 값을 변경할 수 있게 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1689600168440&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let mut x = 5;
    println!(&quot;The value of x is: {}&quot;, x);
    x = 6;
    println!(&quot;The value of x is: {}&quot;, x);
}

// 
$ cargo run
   Compiling variables v0.1.0 (file:///projects/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.30 secs
     Running `target/debug/variables`
The value of x is: 5
The value of x is: 6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가변 변수가 유용한 경우는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;대규모 데이터 구조체를 다루는 경우이다. -&amp;gt; 가변 인스턴스를 사용하는 것이 새로 인스턴스를 할당하고 반환하는 것보다 빠를 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그러나, 데이터 규모가 작을수록 새 인스턴스를 생성하고 함수적 프로그래밍 스타일로 작성하는 것이 더 합리적이고, 약간의 성능 하락을 통해 가독성을 확보할 수 있다면 그것이 더 가치있을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;언뜻 불변성의 변수는 상수(constant)와 비슷해보이지만 상수는 mut 을 허용하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;상수는 let 대신 const 키워드를 사용하고 값의 타입을 함께 선언해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;상수는 오직 상수 표현식만 설정될 수 있으며 함수 호출의 결과값이나 그 외 런타임에 결정되는 값으로 설정될 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;다음의 예제처럼 상수 (MAX_POINTS)는 값의 타입과 함께 선언한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689601066277&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const MAX_POINTS: u32 = 100_000;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상수는 선언된 영역 내에서 항상 유효하므로 유용하다. (한 게임에서 획득할 수 있는 최대 포인트 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Shadowing&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;let으로 이전에 선언한 변수와 동명의 새 변수를 선언할 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 변수는 이전 변수를 shadow 한다. 이를 첫 변수가 두번째 변수에 의해 shadowed 되었다고 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 해당 변수명이 두번째 변수의 값을 갖게 된다는 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 예제와 같이 활용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1689601454690&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    let x = 5; // x &amp;lt;- 5

    let x = x + 1; // x &amp;lt;- 6 

    let x = x * 2; // x &amp;lt;- 12

    println!(&quot;The value of x is: {}&quot;, x);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 mut 으로 선언한 것과는 차이가 있는데, let 없이 변수에 새 값을 대입하려고 하면 컴파일 에러가 발생하기 때문.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mut 과 let 의 차이는 let 은 효과적으로 동명의 새 변수를 선언하고 &lt;b&gt;값 타입을 변경&lt;/b&gt;할 수 있다는 것이다. (새롭게 정의된 변수이기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예제에서 spaces 는 처음에 string 값을 가지지만 두번째 라인에서 정수 값을 가진다.&lt;/p&gt;
&lt;pre id=&quot;code_1689601602930&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let spaces = &quot;   &quot;;
let spaces = spaces.len();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 아래처럼 mut을 사용하면, 가변 변수의 값의 타입을 변경하게 되어 컴파일 에러가 발생한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689601686984&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let mut spaces = &quot;   &quot;;
spaces = spaces.len();&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/Rust</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/103</guid>
      <comments>https://soso-study.tistory.com/103#entry103comment</comments>
      <pubDate>Mon, 17 Jul 2023 22:49:03 +0900</pubDate>
    </item>
    <item>
      <title>[러스트] 러스트 시작하기 - Hello World!</title>
      <link>https://soso-study.tistory.com/101</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-02-hello-world.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://rinthel.github.io/rust-lang-book-ko/ch01-02-hello-world.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689549360620&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Hello, World! - The Rust Programming Language&quot; data-og-description=&quot;여러분이 러스트를 설치했으니, 이제 여러분의 첫번째 러스트 프로그램을 작성해봅시다. 새로운 언어를 배울 때면 &amp;ldquo;Hello, world!&amp;rdquo;라는 텍스트를 스크린에 출력하는 짧은 프로그램을 작성하는 &quot; data-og-host=&quot;rinthel.github.io&quot; data-og-source-url=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-02-hello-world.html&quot; data-og-url=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-02-hello-world.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-02-hello-world.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-02-hello-world.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Hello, World! - The Rust Programming Language&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;여러분이 러스트를 설치했으니, 이제 여러분의 첫번째 러스트 프로그램을 작성해봅시다. 새로운 언어를 배울 때면 &amp;ldquo;Hello, world!&amp;rdquo;라는 텍스트를 스크린에 출력하는 짧은 프로그램을 작성하는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rinthel.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에 아래 명령어를 실행해 폴더를 만들어 프로젝트를 진행해보자.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;// home 디렉터리에 projects 디렉터리 생성
$ mkdir ~/projects

// projects 디렉터리로 이동
$ cd ~/projects

// hello_world 디렉터리 생성
$ mkdir hello_world

// hello_world 디렉터리로 이동
$ cd hello_world&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일명은 &lt;b&gt;main.rs&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689591773012&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn main() {
    println!(&quot;Hello, world!&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 main.rs를 실행시켜준다.&lt;/p&gt;
&lt;pre id=&quot;code_1689591819048&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컴파일
$ rustc main.rs

// 실행
$ ./main
Hello, world!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와! 첫 rust 프로그램을 실행했다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fn 은 함수를 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 main은 모든 실행 가능한 러스트 프로그램 중 첫번째로 실행되는 코드다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 본체는 {}로 감싼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 Hello, world! 를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 러스트 스타일은 탭이 아닌 4개의 스페이스로 들여쓰기를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;println!&lt;/span&gt; 은 &lt;b&gt;러스트 매크로&lt;/b&gt;라고 한다. (함수는 println() 으로 쓰여야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; ! 는 보통 함수 대신 매크로를 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &quot;Hello, world!&quot; string 을 사용한다. 매크로에 string 을 인자로 넘기고 이 string 이 화면에 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 세미콜론 ; 으로 표현식을 끝낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rustfmt 라는 자동 포맷팅 도구가 있으며 코드를 특정한 스타일로 포매팅하고자 할 때 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rustc 로 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 컴파일 후 실행가능한 바이너리를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;러스트는 ahead-of-time compiled 언어로 프로그램을 컴파일하고 나면 실행파일을 통해 러스트를 설치하지 않고도 이를 실행할 수 있다는 의미이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 프로그램은 rustc 로 컴파일해도 되지만, 프로젝트가 커지면 컴파일하기 힘들어지기 때문에 &lt;b&gt;Cargo&lt;/b&gt; 를 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cargo&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 러스트의 빌드 시스템 및 패키지 매니저&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 빌드하고, 라이브러리를 다운해주고, 그 라이브러리를 빌드하는 등 많은 작업을 다룸&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(코드가 필요로 하는 라이브러리를 의존성(dependency)라고 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo 가 있는지 확인하려면 아래처럼 확인 가능&lt;/p&gt;
&lt;pre id=&quot;code_1689595152627&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cargo --version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo 를 이용해 새로운 프로젝트를 만들어보자.&lt;/p&gt;
&lt;pre id=&quot;code_1689596085682&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo new hello_cargo --bin
$ cd hello_cargo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo new hello_cargo --bin =&amp;gt; 실행 가능한 바이너리를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--bin =&amp;gt; 인자가 라이브러리가 아닌 실행 가능한 애플리케이션으로 만들어준다. (= 바이너리 파일)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo는 hello_cargo 디렉터리에 프로젝트 파일(Cargo.toml, src/main.rs)을 생성한다. 또한 .gitignore 와 함께 새로운 Git 저장소도 초기화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cargo.toml&lt;/p&gt;
&lt;pre id=&quot;code_1689596379710&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[package]
name = &quot;hello_cargo&quot;
version = &quot;0.1.0&quot;
authors = [&quot;Your Name &amp;lt;you@example.com&amp;gt;&quot;]

[dependencies]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 파일은 TOML(&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Tom&amp;rsquo;s Obvious, Minimal Language&lt;/span&gt;) 이라는 Cargo 환경 설정 포맷이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- [package] 는 환경설정을 나타내는 섹션의 시작점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다음의 3 라인은 컴파일하기 위해 필요로 하는 정보에 대한 설정. cargo 는 환경에서 사용자의 이름과 이메일 정보를 얻어내므로 정확치 않다면 수정 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- [dependencies] 는 프로젝트의 의존성 리스트를 적을 수 있는 섹션의 시작점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;러스트는 코드의 패키지를 크레이트(crate)라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo는 소스 파일이 src 디렉터리 안에 있을 것으로 예상하기 때문에 소스 코드는 src 안에 넣어두고, 관련 없는 readme, 라이센스 정보, Cargo.toml 등은 상위에 빼놓는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cargo 프로젝트를 빌드하고 실행하기&lt;/p&gt;
&lt;pre id=&quot;code_1689596896475&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo build
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; cargo build&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 실행 파일을 생성하고, 생성된 파일은 &lt;b&gt;&lt;span style=&quot;background-color: #f6f7f6; color: #000000; text-align: start;&quot;&gt;./target/debug/hello_cargo&lt;/span&gt;&lt;/b&gt; 을 통해 실행할 수 있다. =&amp;gt; ./(파일 경로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo build 를 실행하면, Cargo.lock 파일을 최상위 디렉터리에 생성한다. -&amp;gt; 이는 프로젝트에 어떠한 의존성도 가지고 있지 않고 파일의 내용이 얼마 없다. 신경 쓸 필요 x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 빌드된 파일의 저장경로는 target/debug 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo run&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단숨에 프로젝트를 빌드하고 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 코드를 수정한다면, run 내용에 컴파일 내용이 추가된다.&lt;/p&gt;
&lt;pre id=&quot;code_1689597234190&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cargo run
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
     Running `target/debug/hello_cargo`
Hello, world!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo check&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드가 컴파일되는지 빠르게 확인해주지만, 실행 파일을 생성하지 않는 컴파일 체크 커맨드 =&amp;gt; 실행 파일을 만들지 않아 더 빠르게 컴파일할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 파일을 사용할 준비가 되면 cargo build 로 실행파일을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;릴리즈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cargo build --release&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최적화와 함께 컴파일 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- target/debug 대신 target/release 에 실행 파일 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배포용 릴리즈 빌드: 빠르게 실행되지만 만들어지는데 오래걸림 vs 개발용 빌드: 빠르게 생성되지만 실행되는데 오래 걸림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Rust</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/101</guid>
      <comments>https://soso-study.tistory.com/101#entry101comment</comments>
      <pubDate>Mon, 17 Jul 2023 08:20:48 +0900</pubDate>
    </item>
    <item>
      <title>[Rust] 설치하기</title>
      <link>https://soso-study.tistory.com/100</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;참고 문서 &lt;a href=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-01-installation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://rinthel.github.io/rust-lang-book-ko/ch01-01-installation.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689548994840&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;설치하기 - The Rust Programming Language&quot; data-og-description=&quot;첫 번째 단계는 러스트를 설치하는 것입니다. 우리는 rustup이라고 하는 러스트 버전 및 관련 도구들을 관리하기 위한 커멘드 라인 도구를 통하여 러스트를 다운로드할 것입니다. 다운로드를 위&quot; data-og-host=&quot;rinthel.github.io&quot; data-og-source-url=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-01-installation.html&quot; data-og-url=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-01-installation.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-01-installation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://rinthel.github.io/rust-lang-book-ko/ch01-01-installation.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;설치하기 - The Rust Programming Language&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 단계는 러스트를 설치하는 것입니다. 우리는 rustup이라고 하는 러스트 버전 및 관련 도구들을 관리하기 위한 커멘드 라인 도구를 통하여 러스트를 다운로드할 것입니다. 다운로드를 위&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rinthel.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;러스트 프로그래밍 언어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 권한 분산에 관한 언어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 메모리 관리, 데이터 표현, 동시성에 대한 저수준의 디테일을 다루는 시스템 레벨의 일을 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초심자에게는...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 속도와 메모리 사용 측면에서 효율적이면서 안정적인 코드를 작성할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숙련자에게는...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 저위험성 연산으로 병령성을 다룸 -&amp;gt; 더 공격적인 최적화가 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;러스트는?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컴파일러 단에서 (찾기 힘든) 버그를 거부함으로써 개발자로 하여금 버그 추적보다 프로그램 로직에 집중할 수 있게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Cargo 라는 의존성 관리자 및 빌드 도구로 의존성을 추가하고 컴파일하고 관리하도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;gt; 패키지 매니저이자 빌드 시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Rustfmt 으로 일관된 코딩 스타일을 반드시 따르도록 해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Rust Language Server 는 코드 자동완성 및 인라인 에러 메시지를 위한 IDE 로의 결합을 도움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;러스트 설치하기 - for mac&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. rustup 설치&lt;span style=&quot;background-color: #1d1f21; color: #c5c8c6; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1689548350469&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;참고
$ : 일반적인 커맨드 시작
# : 관리자 커맨드 시작
&amp;gt; : 파워쉘 커맨드 시작&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 커맨드&lt;/p&gt;
&lt;pre id=&quot;code_1689548309615&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ curl https://sh.rustup.rs -sSf | sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tDfkS/btsnGNKUHut/Bhjp5K0jbfhG7EauKz4SC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tDfkS/btsnGNKUHut/Bhjp5K0jbfhG7EauKz4SC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tDfkS/btsnGNKUHut/Bhjp5K0jbfhG7EauKz4SC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtDfkS%2FbtsnGNKUHut%2FBhjp5K0jbfhG7EauKz4SC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;442&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 다음 로그인 이후에 러스트를 자동적으로 시스템 패스에 추가하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널을 재시작하지 않고 러스트를 바로 사용하려면 아래 커맨드를 입력해 시스템 패스 추가&lt;/p&gt;
&lt;pre id=&quot;code_1689548544572&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ source $HOME/.cargo/env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 ~/.bash_profile에 시스템 패스를 추가할 수도 있음(~/.bash_profile 안에 작성)&lt;/p&gt;
&lt;pre id=&quot;code_1689548667660&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ export PATH=&quot;$HOME/.cargo/bin:$PATH&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;nbsp;링커 설치 -&amp;gt; 만약 컴파일시에 링커가 없다는 에러가 나오면 c 컴파일러를 설치할 것&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 러스트 업데이트 및 삭제&lt;/h4&gt;
&lt;pre id=&quot;code_1689548899674&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 업데이트
$ rustup update

// 삭제
$ rustup self uninstall&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 버전 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제대로 설치되었는지 확인&lt;/p&gt;
&lt;pre id=&quot;code_1689548940335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ rustc --version
// output ex: rustc x.y.z (abcabcabc yyyy-mm-dd)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;로컬 문서 열어보기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로컬에서 공식 문서를 볼 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1689549210076&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ rustup doc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/Rust</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/100</guid>
      <comments>https://soso-study.tistory.com/100#entry100comment</comments>
      <pubDate>Mon, 17 Jul 2023 08:14:21 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스 | C#] 명예의 전당 (1) List.Sort, heap 삽입-제거 구현</title>
      <link>https://soso-study.tistory.com/97</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/138477&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/138477&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675503134620&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/138477&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/w231o/hyRvklqF1M/WQ65U2ygZks88w2nKKnrKK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dcF2W9/hyRvdT8tjW/xDPrWIkce7vsurbB4dCr31/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/138477&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/138477&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/w231o/hyRvklqF1M/WQ65U2ygZks88w2nKKnrKK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dcF2W9/hyRvdT8tjW/xDPrWIkce7vsurbB4dCr31/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;코드&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 주마다 점수를 받고, 그 주 마다 k 번째 순위 안에 드는 점수 중 가장 낮은 점수를 answer 배열에 넣어 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 주마다 받은 모든 점수는 score 배열에 들어있다.&lt;/p&gt;
&lt;pre id=&quot;code_1675504857326&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    public class 명예의_전당__1_
    {
        // static void Main()
        // {
        //     var answer = solution(3, new [] { 10, 100, 20, 150, 1, 100, 200 });
        //     foreach (var a in answer)
        //     {
        //         Console.Write(a + &quot; &quot;);
        //     }
        // }

        public static int[] solution(int k, int[] score) 
        {
            int[] answer = new int[score.Length];
            List&amp;lt;int&amp;gt; rank = new List&amp;lt;int&amp;gt;();
            for (int i = 0; i &amp;lt; score.Length; i++)
            {
            	// 1)
                if (rank.Count &amp;lt; k)
                {
                    rank.Add(score[i]);
                }
                // 2)
                else
                {
                    if (rank[0] &amp;lt; score[i])
                    {
                        rank[0] = score[i];
                    }
                }
                // 3)
                rank.Sort();
                answer[i] = rank[0];
            }
            return answer;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) k명의 사람이 채워지기 전에는 모든 사람이 k개의 순위권에 든다. 따라서 순위 리스트 rank를 변경하지 않고 값을 Add만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) k명이 다 채워졌다면, 순위 리스트를 변경해야한다. 또한 매 주마다 새로운 점수가 들어오기 때문에 새로 들어온 값 score[i]가 현재 순위권 안에 있는 점수보다 크다면 순위 리스트를 변경해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 변경된 순위 리스트를 오름차순으로 정렬한다. 정렬한 후에는 0번째에 있는 값이 가장 낮은 값이 되므로 rank[0]을 answer 배열에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;List.Sort&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;List를 정렬하는 메서드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본형은 아래와 같으며, 매개변수 comparision은 비교 조건이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교 조건을 넣지 않으면 해결 코드와 같이 오름차순으로 정렬된다.&lt;/p&gt;
&lt;pre id=&quot;code_1675505217273&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void Sort (Comparison&amp;lt;T&amp;gt; comparison);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 비교 조건을 넣어 내림차순으로 만들 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 상세한 조건을 넣으려면 비교 클래스를 만들어 매개변수로 넣어 쓸 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1675505636206&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    internal class Program
    {
        static void Main()
        {
            List&amp;lt;int&amp;gt; list = new List&amp;lt;int&amp;gt; { 5, 3, 1, 4, 2 };
            list.Sort(new Comparison&amp;lt;int&amp;gt;((n1, n2) =&amp;gt; n2.CompareTo(n1)));
            foreach (var val in list)
            {
                Console.Write($&quot;{val}, &quot;);
            }
            // 출력: 5, 4, 3, 2, 1,
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.sort?view=net-7.0&quot;&gt;https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.sort?view=net-7.0&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1675505185540&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;List&amp;lt;T&amp;gt;.Sort 메서드 (System.Collections.Generic)&quot; data-og-description=&quot;지정된 또는 기본 IComparer&amp;lt;T&amp;gt; 구현 또는 제공된 Comparison&amp;lt;T&amp;gt; 대리자를 사용하여 List&amp;lt;T&amp;gt;의 요소 또는 요소의 일부를 정렬하여 목록 요소를 비교합니다.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.sort?view=net-7.0&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.sort?view=net-7.0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gbZfL/hyRvhChrwj/eb0oMxlB0YR6PNIw2rmi3K/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.sort?view=net-7.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.generic.list-1.sort?view=net-7.0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gbZfL/hyRvhChrwj/eb0oMxlB0YR6PNIw2rmi3K/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;List&amp;lt;T&amp;gt;.Sort 메서드 (System.Collections.Generic)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지정된 또는 기본 IComparer&amp;lt;T&amp;gt; 구현 또는 제공된 Comparison&amp;lt;T&amp;gt; 대리자를 사용하여 List&amp;lt;T&amp;gt;의 요소 또는 요소의 일부를 정렬하여 목록 요소를 비교합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;heap 삽입(HInsert), 제거(HDelete)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;heap(힙)은 완전 이진 트리로, 모든 노드에 저장된 값이 자식 노드에 저장된 값보다 크거나 같아야 하는 조건을 가진다. 즉, 루트 노드의 값이 가장 커야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙은&amp;nbsp;min heap, max &amp;nbsp;heap 이 있는데, max heap은 루트 노드의 값이 가장 큰 조건일 때의 heap이고, min heap은 루트 노드의 값이 가장 작을 때의 heap이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에 적용해보면 힙에 들어갈 수 있는 점수 수를 k로 제한하고 힙에 점수가 들어갈 때마다 가장 작은 값이 루트에 놓이게 하여 결론적으로 루트 값을 answer 배열에 넣으면 문제를 풀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드에서는 min heap의 삽입, 제거를 보인다.&lt;/p&gt;
&lt;pre id=&quot;code_1675344266040&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void HInsert(ref List&amp;lt;int&amp;gt; buf, int item)
{
    buf.Add(item);
    int index = buf.Count - 1;
    while (index &amp;gt; 0)
    {
        int parent = (index - 1) / 2;
        if (buf[parent] &amp;gt; buf[index])
        {
            int tmp = buf[parent];
            buf[parent] = buf[index];
            buf[index] = tmp;
            index = parent;
        }
        else break;
    }
}

void HDelete(ref List&amp;lt;int&amp;gt; buf)
{
    int root = buf[0];
    buf[0] = buf[buf.Count - 1];
    buf.RemoveAt(buf.Count - 1);

    int index = 0;
    int last = buf.Count - 1;
    while (index &amp;lt; last)
    {
        int child = index * 2 + 1;
        if (child &amp;lt; last &amp;amp;&amp;amp; buf[child] &amp;gt; buf[child + 1])
            child = child + 1;
        if (child &amp;gt; last || buf[index] &amp;lt;= buf[child])
            break;
                    
        int tmp = buf[child];
        buf[child] = buf[index];
        buf[index] = tmp;
        index = child;                                    
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 삽입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삽입된 원소는 트리의 가장 마지막에 포함된다. 들어온 원소가 부모 노드의 값보다 작으면 들어온 값과 부모 값을 swap한다. 그 값을 계속 위로 비교-swap한다. 만약 들어온 값이 루트 값 보다 작다면 루트 노드까지 swap이 이루어지며 결론적으로 루트 노드의 값이 바뀌게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루트 노드의 값을 제거한다. 그 후 트리의 가장 마지막 값을 루트에 넣고 루트에 넣은 값을 자식 노드의 값과 비교하며 자식 노드와 현재 노드를 swap한다. 만약 루트에 들어간 값이 가장 큰 값이라면 루트의 마지막 위치에 놓일 때까지 계속 자식 노드와 비교하며 swap한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에 적용한다면 아래와 같이 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1675506484500&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static int[] solution(int k, int[] score) 
{
    int[] answer = new int[score.Length];
    List&amp;lt;int&amp;gt; buffer = new List&amp;lt;int&amp;gt;();
    for (int i = 0; i &amp;lt; score.Length; i++)
    {
        HInsert(ref buffer, score[i]);
        if (buffer.Count &amp;gt; k)
            HDelete(ref buffer);
        answer[i] = buffer[0];
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍/C#</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/97</guid>
      <comments>https://soso-study.tistory.com/97#entry97comment</comments>
      <pubDate>Sat, 4 Feb 2023 19:28:10 +0900</pubDate>
    </item>
    <item>
      <title>[C#] 문자열 처리 [자리표시자, 문자열 보간]</title>
      <link>https://soso-study.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2023.02.05 추가 (3항 연산자의 경우 문자열 보간)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C# 에서 문자열을 처리하는 방법은 다양하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중 자리표시자, 문자열 보간에 대해 알아보도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;자리 표시자&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 출력할 때 가장 쉬운 방법은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1675345912746&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Console.WriteLine(&quot;hello&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 메서드 안에 string 문자열을 넣어주면 된다. 그런데 변수를 함께 출력하고 싶다면 어떻게 해야할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, [나이]를 출력한다고 해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1675346003430&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int age = 10;
Console.WriteLine(&quot;my age is &quot; + age);
// 출력: my age is 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ 연산자로 문자열을 연결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 예시는 자리 표시자를 사용하는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1675346199535&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int age = 10;
Console.WriteLine(&quot;my age is {0}&quot;, age);
// 출력: my age is 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자리 표시자는 위의 코드처럼 문자열 안에 {정수}를 넣어 정수에 해당하는 번지에 있는 변수를 대치시키는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 {0}이라면 0 번째 변수를, {1}이라면 1번째 변수를 문자열 내 해당 위치에 대치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자리표시자의 장점은 변수의 위치를 조정할 수 있다는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1675346361203&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int age = 10;
int tmp = 2;
Console.WriteLine(&quot;my age is {1}, {0}&quot;, age, tmp);
// 출력: my age is 2, 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1번째 위치에 있는 tmp가 {1} 자리에 오고 0번째 위치에 있는 age가 {0} 자리에 옴으로써&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;my age is 2, 10 을 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자리표시자는 매개변수가 늘어날수록 호출 문장도 길어진다는 단점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C#6에서는 문자열 보간(interpolated string)이 등장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;문자열 보간&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 보간은 간단하다. &quot;&quot; 쌍따옴표 앞에 $ 문자만 붙여주고, 문자열 안에 변수를 나타낼 때 {} 중괄호를 씌워주기만 하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1675346731779&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int age = 10;
int tmp = 2;
Console.WriteLine($&quot;my age is {age}, {tmp}&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Console.WriteLine 문장이 자리표시자에 비해 간결해지고 가독성이 좋아졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 문자열 보간과 자리표시자를 이용해 동적인 값을 포함한 문자열을 처리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 문자열의 포맷을 지정해주려면 : 로 뒤에 어떤 포맷인지 지정해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1675575044208&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; // $&quot;{변수:서식}&quot;
 var date = new DateTime(2023, 2, 5);
 Console.WriteLine($&quot;Today is {date:dddd, MMMM dd, yyyy}&quot;);
 // 출력: Today is 일요일, 2월 05, 2023
 
 Console.WriteLine($&quot;{3.141592:F1}&quot;);
 // 출력: 3.1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 서식에 대한 자세한 내용은 공식 문서에 자세히 나와있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/composite-formatting#format-string-component&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/composite-formatting#format-string-component&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675575243150&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;복합 형식 지정&quot; data-og-description=&quot;입력으로 개체 목록을 사용하는 .NET 복합 서식 지정과 인덱싱된 자리 표시자를 사용하는 고정 텍스트가 포함된 복합 서식 문자열에 대해 알아봅니다.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/composite-formatting#format-string-component&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/composite-formatting&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bA2ds3/hyRwzBP70r/emaQXOwBXoTvKydksNN8t0/img.png?width=636&amp;amp;height=300&amp;amp;face=0_0_636_300&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/composite-formatting#format-string-component&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/composite-formatting#format-string-component&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bA2ds3/hyRwzBP70r/emaQXOwBXoTvKydksNN8t0/img.png?width=636&amp;amp;height=300&amp;amp;face=0_0_636_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;복합 형식 지정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;입력으로 개체 목록을 사용하는 .NET 복합 서식 지정과 인덱싱된 자리 표시자를 사용하는 고정 텍스트가 포함된 복합 서식 문자열에 대해 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 3항 연산자(?:)의 경우 보간 문자열에서 &quot;:&quot;를 쓰게 되면 서식 지정과 충돌이 나게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 괄호로 조건식을 나타내면 해결 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1675575430438&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Console.WriteLine($&quot;{(3 &amp;lt; 4 ? 3 : 4)}&quot;);  // 출력: 3

Console.WriteLine($&quot;{3 &amp;lt; 4 ? 3 : 4}&quot;);  // 에러&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/csharp/tutorials/string-interpolation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://learn.microsoft.com/ko-kr/dotnet/csharp/tutorials/string-interpolation&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675346834965&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;C#의 문자열 보간&quot; data-og-description=&quot;문자열 보간을 사용하여 C#으로 결과 문자열에 서식이 지정된 식 결과를 포함하는 방법을 알아봅니다.&quot; data-og-host=&quot;learn.microsoft.com&quot; data-og-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/csharp/tutorials/string-interpolation&quot; data-og-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/csharp/tutorials/string-interpolation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qsYnd/hyRtTIuwVi/xNoKx1Z7LlNWhquBOnNzV0/img.png?width=64&amp;amp;height=64&amp;amp;face=0_0_64_64&quot;&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/dotnet/csharp/tutorials/string-interpolation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://learn.microsoft.com/ko-kr/dotnet/csharp/tutorials/string-interpolation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qsYnd/hyRtTIuwVi/xNoKx1Z7LlNWhquBOnNzV0/img.png?width=64&amp;amp;height=64&amp;amp;face=0_0_64_64');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;C#의 문자열 보간&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문자열 보간을 사용하여 C#으로 결과 문자열에 서식이 지정된 식 결과를 포함하는 방법을 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;learn.microsoft.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍/C#</category>
      <author>이내내</author>
      <guid isPermaLink="true">https://soso-study.tistory.com/96</guid>
      <comments>https://soso-study.tistory.com/96#entry96comment</comments>
      <pubDate>Thu, 2 Feb 2023 23:07:17 +0900</pubDate>
    </item>
  </channel>
</rss>