23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
3주차 부터는 격주 월요일 스터디를 진행 했습니다. 3주차 스터디는 5월 13일일에 진행 했습니다.
이번 스터디는 책의 "5장 구조체로 연관된 데이터를 구조화하기", "6장 열거형과 패턴 매칭"에 대해 공유 하는 시간이었고, 강제가 아닌? 자발적인 참여를 목적으로 시작한 스터디인 만큼 정스호님과 임중현님이 자원하셔서 내용에 대해 발표해 주셨습니다.
5장, 6장에 대한 간략한 내용 정리.
러스트에서 구조체(struct)는 관련된 데이터를 하나의 타입으로 묶어주는 역할을 합니다. 구조체를 사용하면 더 나은 데이터 관리를 할 수 있으며, 코드를 더 이해하기 쉽게 만들어줍니다. 이번 글에서는 구조체를 정의하고 인스턴스화하는 방법, 구조체를 사용한 예제 프로그램, 그리고 구조체 메서드 문법에 대해 알아보겠습니다.
구조체는 struct 키워드를 사용하여 정의합니다. 각 필드에는 이름과 타입을 지정합니다.
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}위 예제에서 User 구조체는 username, email, sign_in_count, active 네 개의 필드를 갖고 있습니다.
구조체의 인스턴스를 생성하려면 각 필드에 값을 할당합니다.
let user1 = User {
username: String::from("someone@example.com"),
email: String::from("someusername123"),
sign_in_count: 1,
active: true,
};각 필드의 값을 변경할 수 있습니다. 단, 구조체 인스턴스가 가변(mut)이어야 합니다.
let mut user1 = User {
username: String::from("someone@example.com"),
email: String::from("someusername123"),
sign_in_count: 1,
active: true,
};
user1.email = String::from("anotheremail@example.com");구조체를 사용하여 실제 프로그램을 만들어 보겠습니다. 이번 예제에서는 User 구조체를 이용해 사용자 정보를 출력하는 프로그램을 작성합니다.
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
fn main() {
let user1 = User {
username: String::from("someone@example.com"),
email: String::from("someusername123"),
sign_in_count: 1,
active: true,
};
println!("Username: {}", user1.username);
println!("Email: {}", user1.email);
println!("Sign in count: {}", user1.sign_in_count);
println!("Active: {}", user1.active);
}이 프로그램은 User 구조체의 인스턴스를 생성하고, 필드 값을 출력합니다.
러스트에서는 구조체와 연관된 함수를 정의할 수 있습니다. 이러한 함수는 구조체의 메서드(method)라고 합니다. 메서드는 impl 블록 내에 정의됩니다.
구조체의 인스턴스를 첫 번째 매개변수로 받는 함수는 메서드로 정의됩니다. 첫 번째 매개변수는 self이며, 이는 해당 메서드가 호출될 구조체의 인스턴스를 가리킵니다.
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let rect1 = Rectangle {
width: 30,
height: 50,
};
println!("The area of the rectangle is {} square pixels.", rect1.area());
}이 예제에서 Rectangle 구조체는 width와 height 필드를 가지고 있습니다. impl 블록 내에 area 메서드를 정의하여 Rectangle의 인스턴스에 대해 호출할 수 있게 했습니다. area 메서드는 self 매개변수를 통해 Rectangle 인스턴스의 필드에 접근하고, 넓이를 계산하여 반환합니다.
구조체에 여러 개의 메서드를 정의할 수 있습니다.
impl Rectangle {
fn width(&self) -> bool {
self.width > 0
}
fn can_hold(&self, other: &Rectangle) -> bool {
self.width > other.width && self.height > other.height
}
}
fn main() {
let rect1 = Rectangle {
width: 30,
height: 50,
};
let rect2 = Rectangle {
width: 10,
height: 40,
};
let rect3 = Rectangle {
width: 60,
height: 45,
};
println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
}위 예제에서 Rectangle 구조체는 width, can_hold 두 개의 메서드를 가집니다. width 메서드는 Rectangle의 width가 0보다 큰지 확인하며, can_hold 메서드는 다른 Rectangle 인스턴스를 매개변수로 받아 현재 Rectangle이 다른 Rectangle을 포함할 수 있는지 확인합니다.
러스트에서 열거형(enum)은 여러 관련된 값을 하나의 타입으로 정의할 수 있게 해주는 강력한 기능입니다. 이를 통해 다양한 값들을 하나의 타입으로 관리하고, 패턴 매칭을 통해 값에 대한 처리를 간결하고 명확하게 작성할 수 있습니다. 이번 글에서는 열거형을 정의하는 방법, match 제어 흐름 구조, 그리고 if let을 사용한 간결한 제어 흐름에 대해 알아보겠습니다.
열거형(enum)은 여러 관련된 값을 하나의 타입으로 정의할 수 있게 해줍니다. 열거형은 enum 키워드를 사용하여 정의합니다. 각 열거형은 여러 가지 변형(variants)을 가질 수 있습니다.
enum IpAddrKind {
V4,
V6,
}위 예제에서 IpAddrKind라는 열거형을 정의했으며, 이 열거형은 V4와 V6 두 가지 변형을 가집니다.
열거형의 변형을 사용하여 인스턴스를 생성할 수 있습니다.
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;각 변형은 열거형 이름과 두 개의 콜론을 사용하여 접근합니다.
열거형은 각 변형에 데이터를 추가할 수 있습니다.
enum IpAddr {
V4(String),
V6(String),
}
let home = IpAddr::V4(String::from("127.0.0.1"));
let loopback = IpAddr::V6(String::from("::1"));위 예제에서 IpAddr 열거형은 String 데이터를 포함하는 V4와 V6 변형을 가집니다.
match 키워드는 열거형과 패턴 매칭을 사용하여 값에 대한 처리를 할 수 있게 해줍니다. match 표현식은 주어진 값과 일치하는 패턴을 찾아 그에 해당하는 코드를 실행합니다.
enum Coin {
Penny,
Nickel,
Dime,
Quarter,
}
fn value_in_cents(coin: Coin) -> u32 {
match coin {
Coin::Penny => {
println!("Lucky penny!");
1
}
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter => 25,
}
}
let coin = Coin::Quarter;
println!("The value of the coin is: {} cents", value_in_cents(coin));위 예제에서 Coin 열거형은 여러 변형을 가지며, match 표현식을 사용하여 각 변형에 대한 값을 반환합니다.
match 표현식은 모든 가능한 변형을 다루어야 합니다. 만약 어떤 변형을 처리하지 않으면 컴파일러는 오류를 발생시킵니다. 이는 모든 경우를 명확하게 처리하여 안전성을 높이는 데 도움을 줍니다.
rust코드 복사
let some_u8_value = 0u8;
match some_u8_value {
1 => println!("One!"),
3 => println!("Three!"),
5 => println!("Five!"),
7 => println!("Seven!"),
_ => (),
}위 예제에서 _는 와일드카드 패턴으로, 매칭되지 않은 모든 값에 대해 실행됩니다.
match 표현식은 강력하지만, 모든 경우를 처리할 필요가 없고 특정 경우에만 코드를 실행하고 싶을 때는 다소 장황해질 수 있습니다. 이런 경우 if let 구문을 사용하여 간결하게 작성할 수 있습니다.
let some_option_value = Some(5);
if let Some(value) = some_option_value {
println!("The value is: {}", value);
}위 예제에서 if let 구문은 Some 변형에만 반응하여 값을 처리합니다. 나머지 경우는 무시합니다.
if let 구문에 else 블록을 추가하여 매칭되지 않는 경우도 처리할 수 있습니다.
let some_option_value = Some(5);
if let Some(value) = some_option_value {
println!("The value is: {}", value);
} else {
println!("No value found");
}러스트의 구조체는 관련된 데이터를 하나의 타입으로 묶어주는 강력한 도구입니다. 구조체를 정의하고 인스턴스화하며, 메서드를 통해 기능을 확장하는 방법을 이해하면 더욱 효율적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
열거형과 패턴 매칭은 러스트의 강력한 기능으로, 다양한 값을 하나의 타입으로 관리하고, 값을 명확하고 간결하게 처리할 수 있게 해줍니다. match 표현식과 if let 구문을 적절히 활용하면 더욱 안전하고 가독성 높은 코드를 작성할 수 있습니다. 이러한 개념을 잘 이해하고 활용하여 러스트 프로그램의 안정성과 효율성을 높여보세요.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.