데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Openlab - 4차 Rust 스터디

      lambda 24.05.28
      102 0 0
      DEVOTEE 요약
      4주차 스터디는 5월 27일 진행되었으며, 책의 7장과 8장에 대한 내용을 발표했습니다. 7장은 패키지, 크레이트, 모듈을 사용하여 프로젝트를 구조화하고 관리하는 방법을 다뤘으며, 8장은 벡터, 문자열, 해시맵과 같은 일반적인 컬렉션을 설명했습니다. 이를 통해 러스트의 코드 구조와 데이터 저장, 조작 방법에 대해 심도 있게 이해할 수 있었습니다.
      DEVOTEE 추천 블로그

      4주차 스터디 소개

      4주차 스터디는 5월 27일일에 진행 했습니다. 슬슬 내용이 어려워져 가고 있었습니다.

      이번 스터디는 책의 "7장 커져 가는 프로젝트를 패키지, 크레이트, 모듈로 관리하기", "8장 일반적인 컬렉션"에 대해 노현님과, 김지수님이 정리하여 발표해 주셨습니다.


      7장, 8장에 대한 간략한 내용 정리.

      7. 커져 가는 프로젝트를 패키지, 크레이트, 모듈로 관리하기

      러스트에서는 패키지, 크레이트, 모듈을 사용하여 큰 프로젝트를 구조화하고 관리할 수 있습니다. 이러한 구조화는 코드의 가독성, 유지보수성, 재사용성을 높이는 데 중요한 역할을 합니다. 이번 글에서는 패키지와 크레이트, 모듈을 정의하여 스코프와 공개 여부를 제어하는 방법, 경로를 사용하여 모듈 트리의 아이템을 참조하는 방법, use 키워드를 사용하여 경로를 스코프 안으로 가져오는 방법, 그리고 모듈을 별도의 파일로 분리하는 방법에 대해 자세히 알아보겠습니다.

      7.1. 패키지와 크레이트

      패키지

      패키지는 하나 이상의 크레이트로 구성된 러스트 프로젝트의 단위입니다. 패키지는 Cargo.toml 파일을 포함하여 프로젝트의 메타데이터와 의존성을 관리합니다.

      패키지 생성

      패키지를 생성하려면 cargo new 명령어를 사용합니다:

      cargo new my_project

      이 명령어는 my_project 디렉토리를 생성하고, 그 안에 src/main.rs 파일과 Cargo.toml 파일을 만듭니다. Cargo.toml 파일은 패키지의 메타데이터와 의존성을 정의합니다.

      [package]
      name = "my_project"
      version = "0.1.0"
      authors = ["Author <author@example.com>"]
      edition = "2021"
      
      [dependencies]

      크레이트

      크레이트는 러스트의 컴파일 단위로, 라이브러리 크레이트와 바이너리 크레이트로 나뉩니다. 라이브러리 크레이트는 다른 크레이트에서 사용할 수 있는 기능을 제공하고, 바이너리 크레이트는 실행 가능한 프로그램을 생성합니다.

      라이브러리 크레이트

      라이브러리 크레이트를 생성하려면 cargo new --lib 명령어를 사용합니다:

      cargo new --lib my_library

      이 명령어는 my_library 디렉토리를 생성하고, 그 안에 src/lib.rs 파일과 Cargo.toml 파일을 만듭니다.

      7.2. 모듈을 정의하여 스코프 및 공개 여부 제어하기

      모듈은 관련된 코드를 그룹화하여 스코프와 접근 제어를 관리하는 데 사용됩니다. 모듈은 mod 키워드를 사용하여 정의합니다.

      mod network {
          fn connect() {
              println!("Connecting to network...");
          }
      }

      모듈 내의 아이템은 기본적으로 비공개(private)입니다. pub 키워드를 사용하여 공개(public)로 설정할 수 있습니다.

      mod network {
          pub fn connect() {
              println!("Connecting to network...");
          }
      }

      이제 network::connect 함수는 모듈 외부에서도 접근할 수 있습니다.

      7.3. 경로를 사용하여 모듈 트리의 아이템 참조하기

      모듈의 아이템을 참조할 때는 경로(path)를 사용합니다. 경로는 절대 경로와 상대 경로로 나뉩니다.

      mod network {
          pub fn connect() {
              println!("Connecting to network...");
          }
      }
      
      fn main() {
          // 절대 경로
          crate::network::connect();
      
          // 상대 경로
          network::connect();
      }

      절대 경로는 crate 키워드로 시작하며, 상대 경로는 현재 모듈에서 시작합니다.

      7.4. use 키워드로 경로를 스코프 안으로 가져오기

      use 키워드는 경로를 스코프 안으로 가져와 코드의 가독성을 높입니다.

      mod network {
          pub fn connect() {
              println!("Connecting to network...");
          }
      }
      
      use crate::network::connect;
      
      fn main() {
          connect();
      }

      위 예제에서 use 키워드를 사용하여 network::connect 함수를 스코프 안으로 가져왔습니다. 이제 connect 함수는 경로 없이도 사용할 수 있습니다.


      use 키워드는 모듈 내의 여러 아이템을 한 번에 가져올 수도 있습니다.

      mod network {
          pub fn connect() {
              println!("Connecting to network...");
          }
      
          pub fn disconnect() {
              println!("Disconnecting from network...");
          }
      }
      
      use crate::network::{connect, disconnect};
      
      fn main() {
          connect();
          disconnect();
      }

      7.5. 별개의 파일로 모듈 분리하기

      모듈을 별도의 파일로 분리하여 코드의 구조를 더 깔끔하게 유지할 수 있습니다. 예를 들어, network 모듈을 network.rs 파일로 분리할 수 있습니다.


      src/main.rs:

      mod network;
      
      fn main() {
          network::connect();
      }

      src/network.rs:

      pub fn connect() {
          println!("Connecting to network...");
      }

      모듈 내에 또 다른 모듈이 있을 경우, 서브 모듈도 별도의 파일로 분리할 수 있습니다. 예를 들어, client 모듈을 network/client.rs 파일로 분리합니다.


      src/network.rs:

      pub mod client;

      src/network/client.rs:

      pub fn connect() {
          println!("Connecting to client...");
      }

      이제 network 모듈과 client 서브 모듈을 사용할 수 있습니다.

      mod network;
      
      fn main() {
          network::connect();
          network::client::connect();
      }

      8. 일반적인 컬렉션

      러스트에서는 데이터를 효율적으로 저장하고 조작할 수 있는 다양한 컬렉션을 제공합니다. 이 글에서는 벡터, 문자열, 해시맵과 같은 일반적인 컬렉션을 사용하여 데이터를 저장하고 조작하는 방법을 자세히 알아보겠습니다.

      8.1. 벡터에 여러 값의 목록 저장하기

      벡터(Vector)는 동일한 타입의 값들을 저장할 수 있는 동적 배열입니다. Vec<T> 타입을 사용하여 벡터를 생성합니다. 벡터는 크기가 동적으로 변할 수 있어 유연하게 사용할 수 있습니다.

      벡터 생성 및 값 추가

      벡터를 생성하는 방법은 여러 가지가 있습니다.

      let v: Vec<i32> = Vec::new(); // 새로운 빈 벡터 생성
      let v = vec![1, 2, 3]; // 매크로를 사용하여 벡터 생성 및 초기화

      벡터에 값을 추가할 때는 push 메서드를 사용합니다.

      let mut v = Vec::new();
      v.push(1);
      v.push(2);
      v.push(3);

      벡터 값 접근

      벡터의 값에 접근하려면 인덱스를 사용합니다. 인덱스는 0부터 시작합니다.

      let v = vec![1, 2, 3, 4, 5];
      let third: &i32 = &v[2]; // 세 번째 요소에 접근
      println!("The third element is {}", third);

      벡터의 요소에 안전하게 접근하려면 get 메서드를 사용할 수 있습니다. get 메서드는 Option을 반환하여 인덱스가 벗어난 경우를 처리할 수 있습니다.

      match v.get(2) {
          Some(third) => println!("The third element is {}", third),
          None => println!("There is no third element."),
      }

      벡터 값 변경

      벡터의 값은 가변 참조를 사용하여 변경할 수 있습니다.

      let mut v = vec![1, 2, 3, 4, 5];
      let third = &mut v[2];
      *third += 1; // 세 번째 요소 값 변경

      벡터 값 순회

      벡터의 값을 순회하려면 for 루프를 사용할 수 있습니다.

      let v = vec![1, 2, 3, 4, 5];
      for i in &v {
          println!("{}", i);
      }

      벡터의 값을 변경하면서 순회하려면 가변 참조를 사용할 수 있습니다.

      let mut v = vec![1, 2, 3, 4, 5];
      for i in &mut v {
          *i += 1;
      }

      8.2. 문자열에 UTF-8 텍스트 저장하기

      러스트의 문자열(String)은 UTF-8 인코딩된 텍스트를 저장합니다. 문자열은 불변(&str)과 가변(String) 타입으로 나눌 수 있습니다.

      문자열 생성 및 값 추가

      문자열을 생성하는 방법은 여러 가지가 있습니다.

      let s = String::new(); // 새로운 빈 문자열 생성
      let s = "initial contents".to_string(); // &str을 String으로 변환하여 생성
      let s = String::from("initial contents"); // from 함수를 사용하여 생성

      문자열에 값을 추가할 때는 push_str 메서드나 push 메서드를 사용합니다.

      let mut s = String::from("foo");
      s.push_str("bar"); // 문자열 추가
      s.push('!'); // 단일 문자 추가

      문자열 연결

      두 문자열을 연결하려면 + 연산자를 사용하거나 format! 매크로를 사용할 수 있습니다.

      let s1 = String::from("Hello, ");
      let s2 = String::from("world!");
      let s3 = s1 + &s2; // s1은 더 이상 사용할 수 없음
      println!("{}", s3);
      
      let s1 = String::from("Hello, ");
      let s2 = String::from("world!");
      let s3 = format!("{}{}", s1, s2); // s1과 s2는 여전히 유효함
      println!("{}", s3);

      문자열 값 접근

      문자열의 개별 문자를 직접 접근하는 것은 어렵습니다. 대신 문자열 슬라이스를 사용하거나, chars 메서드를 사용하여 문자 단위로 순회할 수 있습니다.

      let hello = "Здравствуйте";
      let s = &hello[0..4]; // UTF-8 문자 슬라이스
      println!("{}", s);
      
      for c in "नमस्ते".chars() {
          println!("{}", c);
      }

      8.3. 해시맵에 서로 연관된 키와 값 저장하기

      해시맵(HashMap)은 키와 값의 쌍을 저장합니다. HashMap<K, V> 타입을 사용하여 해시맵을 생성합니다.

      해시맵 생성 및 값 추가

      해시맵을 생성하는 방법은 여러 가지가 있습니다.

      use std::collections::HashMap;
      
      let mut scores = HashMap::new();
      scores.insert(String::from("Blue"), 10);
      scores.insert(String::from("Yellow"), 50);

      해시맵 값 접근

      해시맵의 값에 접근하려면 키를 사용합니다. 값이 존재하지 않을 수도 있으므로 Option을 반환하는 get 메서드를 사용하는 것이 좋습니다.

      let team_name = String::from("Blue");
      let score = scores.get(&team_name);
      
      match score {
          Some(&score) => println!("Score: {}", score),
          None => println!("No score found for team: {}", team_name),
      }

      해시맵 값 변경

      해시맵의 값을 변경하려면 키를 사용하여 값을 업데이트하거나, 값을 추가할 수 있습니다.

      scores.insert(String::from("Blue"), 25);
      
      scores.entry(String::from("Yellow")).or_insert(50); // 값이 없으면 추가
      scores.entry(String::from("Blue")).or_insert(50); // 값이 있으면 유지

      해시맵 값 순회

      해시맵의 키와 값을 순회하려면 for 루프를 사용할 수 있습니다.

      for (key, value) in &scores {
          println!("{}: {}", key, value);
      }

      결론

      러스트에서는 패키지, 크레이트, 모듈을 사용하여 큰 프로젝트를 구조화하고 관리할 수 있습니다. 패키지와 크레이트를 통해 프로젝트의 메타데이터와 의존성을 관리하고, 모듈을 사용하여 코드의 스코프와 접근 제어를 효율적으로 관리할 수 있습니다. 또한, 경로와 use 키워드를 활용하여 코드의 가독성을 높이고, 모듈을 별도의 파일로 분리하여 구조를 깔끔하게 유지할 수 있습니다.


      벡터, 문자열, 해시맵과 같은 다양한 컬렉션을 사용하여 데이터를 효율적으로 저장하고 조작할 수 있습니다. 벡터는 동적 배열로, 동일한 타입의 값을 저장할 수 있으며, 문자열은 UTF-8 인코딩된 텍스트를 저장하고 조작하는 데 사용됩니다. 해시맵은 키와 값의 쌍을 저장하여 데이터를 연관 짓고, 필요한 경우 쉽게 접근할 수 있습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      lambda 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기