23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
4주차 스터디는 5월 27일일에 진행 했습니다. 슬슬 내용이 어려워져 가고 있었습니다.
이번 스터디는 책의 "7장 커져 가는 프로젝트를 패키지, 크레이트, 모듈로 관리하기", "8장 일반적인 컬렉션"에 대해 노현님과, 김지수님이 정리하여 발표해 주셨습니다.
7장, 8장에 대한 간략한 내용 정리.
러스트에서는 패키지, 크레이트, 모듈을 사용하여 큰 프로젝트를 구조화하고 관리할 수 있습니다. 이러한 구조화는 코드의 가독성, 유지보수성, 재사용성을 높이는 데 중요한 역할을 합니다. 이번 글에서는 패키지와 크레이트, 모듈을 정의하여 스코프와 공개 여부를 제어하는 방법, 경로를 사용하여 모듈 트리의 아이템을 참조하는 방법, use 키워드를 사용하여 경로를 스코프 안으로 가져오는 방법, 그리고 모듈을 별도의 파일로 분리하는 방법에 대해 자세히 알아보겠습니다.
패키지는 하나 이상의 크레이트로 구성된 러스트 프로젝트의 단위입니다. 패키지는 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 파일을 만듭니다.
모듈은 관련된 코드를 그룹화하여 스코프와 접근 제어를 관리하는 데 사용됩니다. 모듈은 mod 키워드를 사용하여 정의합니다.
mod network {
fn connect() {
println!("Connecting to network...");
}
}모듈 내의 아이템은 기본적으로 비공개(private)입니다. pub 키워드를 사용하여 공개(public)로 설정할 수 있습니다.
mod network {
pub fn connect() {
println!("Connecting to network...");
}
}이제 network::connect 함수는 모듈 외부에서도 접근할 수 있습니다.
모듈의 아이템을 참조할 때는 경로(path)를 사용합니다. 경로는 절대 경로와 상대 경로로 나뉩니다.
mod network {
pub fn connect() {
println!("Connecting to network...");
}
}
fn main() {
// 절대 경로
crate::network::connect();
// 상대 경로
network::connect();
}절대 경로는 crate 키워드로 시작하며, 상대 경로는 현재 모듈에서 시작합니다.
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();
}모듈을 별도의 파일로 분리하여 코드의 구조를 더 깔끔하게 유지할 수 있습니다. 예를 들어, 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();
}러스트에서는 데이터를 효율적으로 저장하고 조작할 수 있는 다양한 컬렉션을 제공합니다. 이 글에서는 벡터, 문자열, 해시맵과 같은 일반적인 컬렉션을 사용하여 데이터를 저장하고 조작하는 방법을 자세히 알아보겠습니다.
벡터(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;
}러스트의 문자열(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);
}해시맵(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 인코딩된 텍스트를 저장하고 조작하는 데 사용됩니다. 해시맵은 키와 값의 쌍을 저장하여 데이터를 연관 짓고, 필요한 경우 쉽게 접근할 수 있습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.