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

신고하기

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

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

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

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

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

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

      임시저장함

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

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

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

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

      회원정보 연결

      Openlab - 3차 Rust 스터디

      lambda 24.05.14
      112 0 0
      DEVOTEE 요약
      3주차 스터디에서는 러스트의 구조체와 열거형 및 패턴 매칭에 대해 다뤘습니다. 구조체는 관련 데이터를 하나의 타입으로 묶어 관리와 이해를 쉽게 하며, 메서드를 통해 기능을 확장할 수 있습니다. 열거형과 패턴 매칭은 다양한 값을 하나의 타입으로 관리하고, match와 if let 구문을 통해 값을 간결하고 명확하게 처리할 수 있게 합니다.
      DEVOTEE 추천 블로그

      3주차 스터디 소개

      3주차 부터는 격주 월요일 스터디를 진행 했습니다. 3주차 스터디는 5월 13일일에 진행 했습니다.

      이번 스터디는 책의 "5장 구조체로 연관된 데이터를 구조화하기", "6장 열거형과 패턴 매칭"에 대해 공유 하는 시간이었고, 강제가 아닌? 자발적인 참여를 목적으로 시작한 스터디인 만큼 정스호님과 임중현님이 자원하셔서 내용에 대해 발표해 주셨습니다.




      5장, 6장에 대한 간략한 내용 정리.

      5. 구조체로 연관된 데이터를 구조화하기

      러스트에서 구조체(struct)는 관련된 데이터를 하나의 타입으로 묶어주는 역할을 합니다. 구조체를 사용하면 더 나은 데이터 관리를 할 수 있으며, 코드를 더 이해하기 쉽게 만들어줍니다. 이번 글에서는 구조체를 정의하고 인스턴스화하는 방법, 구조체를 사용한 예제 프로그램, 그리고 구조체 메서드 문법에 대해 알아보겠습니다.

      5.1. 구조체 정의 및 인스턴스화

      구조체는 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");

      5.2. 구조체를 사용한 예제 프로그램

      구조체를 사용하여 실제 프로그램을 만들어 보겠습니다. 이번 예제에서는 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 구조체의 인스턴스를 생성하고, 필드 값을 출력합니다.

      5.3. 메서드 문법

      러스트에서는 구조체와 연관된 함수를 정의할 수 있습니다. 이러한 함수는 구조체의 메서드(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을 포함할 수 있는지 확인합니다.

      6. 열거형과 패턴 매칭

      러스트에서 열거형(enum)은 여러 관련된 값을 하나의 타입으로 정의할 수 있게 해주는 강력한 기능입니다. 이를 통해 다양한 값들을 하나의 타입으로 관리하고, 패턴 매칭을 통해 값에 대한 처리를 간결하고 명확하게 작성할 수 있습니다. 이번 글에서는 열거형을 정의하는 방법, match 제어 흐름 구조, 그리고 if let을 사용한 간결한 제어 흐름에 대해 알아보겠습니다.

      6.1. 열거형 정의하기

      열거형(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 변형을 가집니다.

      6.2. match 제어 흐름 구조

      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!"),
          _ => (),
      }

      위 예제에서 _는 와일드카드 패턴으로, 매칭되지 않은 모든 값에 대해 실행됩니다.

      6.3. if let을 사용한 간결한 제어 흐름

      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 구문을 적절히 활용하면 더욱 안전하고 가독성 높은 코드를 작성할 수 있습니다. 이러한 개념을 잘 이해하고 활용하여 러스트 프로그램의 안정성과 효율성을 높여보세요.

      댓글 0

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

      lambda 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기