Structs

Hunter_Joe·2023년 8월 10일
0

Rust 기초

목록 보기
8/8
post-thumbnail

Structs?

  • 잠재적으로 다른 data types을 가질 수 있음

note

  • 다른 data types를 가질 수 있다는 점에서 tuple과 비슷하나 각 항목들의 data type을 정의 해줘야 한다는 점에서 다름

declare a struct

  • struct keyword 사용
  • 구조체의 항목은 key: value 쌍 으로 정의

note

  • struct construct는 이를 초기화하는 함수의 위,아래 어디에서나 선언할 수 있음

syntax

note

  • 네이밍은 PascalCase로 표기
    첫 글자 = 대문자
    ex). ThisIsPascalCase

initialize a struct

  • 구조체 초기화

  • 구조체를 선언하는 것은 사용자 정의 데이터 유형에 대한 청사진을 정의하는 것
  • 그러나 실제로 메모리에 객체나 아티팩트를 생성하지는 않습니다. 그 작업은 해당 유형의 변수가 인스턴스화될 때 이루어집니다.

note

  • 항목에 값을 할당하는 순서는 중요하지 않음

access values from a struct

syntax

StructName.itemame

note

  • 구조체 인스턴스는 기본적으로 변경할 수 없음
  • 따라서 변경 가능하지 않으면 업데이트할 수 없습니다
  • 그러나 값에 액세스할 수 있습니다.

update a struct instance

  • 구조체 인스턴스 let뒤에 mutkeyword 를 추가하여 구조체 인스턴스를 변경 가능하게 만들 수 있음
  • 구조체 인스턴스가 변경 가능하므로 . 연산자를 사용하여 모든 항목에 액세스할 수 있으며 항목 값을 업데이트할 수 있음

example

//declare a struct
struct Course {
   code:i32,
   name:String,
   level:String, 
}

fn main() {
   //initialize
   let mut course1 = Course  {
      name:String::from("Rust"),
      level:String::from("beginner"),
      code:130,
   };
   let course2 = Course  {
      name:String::from("Javascript"),
      level:String::from("beginner"),
      code:122,
   };
   //access
   println!("Name:{}, Level:{}, code: {}", course1.name, course1.level, course1.code);
   println!("Name:{}, Level:{}, code: {}", course2.name, course2.level, course2.code); 
   //update
   course1.name = "Java".to_string();
   course1.code = 134;
   println!("Name:{}, Level:{} ,code: {}", course1.name, course1.level, course1.code);
}
---------------------------------------
*console
Name:Rust, Level:beginner, code: 130
Name:Javascript, Level:beginner, code: 122
Name:Java, Level:beginner ,code: 134

---

function and structs

1. pass structs to a function

  • 구조체는 함수에 전달 될 수 있음

syntax

fn function_name(S:StructName) {
	statement1;
    statement2;
    .
    .
    statementN;
}

example

//declare a struct
struct Course {
   code:i32,
   name:String,
   level:String, 
}
fn display_mycourse_info(c:Course) {
println!("Name:{}, Level:{} ,code: {}", c .name, c .level, c.code);
}
fn main() {
   //initialize
   let course1 = Course  {
      name:String::from("Rust"),
      level:String::from("beginner"),
      code:130
   };
   display_mycourse_info(course1);
    let course2 = Course  {
      name:String::from("Java"),
      level:String::from("beginner"),
      code:130
   };
   display_mycourse_info(course2);
}

2. return structs from a function

syntax

example

//declare a struct
struct Course {
   code:i32,
   name:String,
   level:String, 
}
fn return_rust_course_info(c1:Course, c2:Course)-> Course{
   println!("I got into function and return values from there");
   if c1.name == "Rust" {
      return c1;
   }
   else{
      return c2;
   }
}

fn main() {
   //initialize
   let course1 = Course  {
      name:String::from("Rust"),
      level:String::from("beginner"),
      code:130
   };
    let course2 = Course  {
      name:String::from("Java"),
      level:String::from("beginner"),
      code:130
   };
  
  let choose_course = return_rust_course_info(course1, course2);
  println!("I choose to learn {} {} course with code:{}", choose_course.name, choose_course.level, choose_course.code);
}

---

methods of struct

  • 메소드는 사용자 정의 함수와 같음
  • 함수와 비슷하지만 차이점은 메서드가 구조체 컨텍스트 내에서 구체적으로 선언된다는 것

1. declare a method

  • &self 매개변수가 전달되며 함수 내의 항목은 이를 통해 액세스
self.item

syntax

![(https://velog.velcdn.com/images/hunterjoe98/post/10487f39-15c5-4dc7-8314-27af9c6d82d2/image.PNG)

2. call a method

  • 구조체를 호출하려면 구조체의 인스턴스를 만들어야 합니다. 이는 구조체를 호출하는 것과 비슷

instantiate

note
왜 구조체 메서드를 써야하는가?

  • 가장 큰 장점은 인스턴스와 관련된 모든 데이터를 다른 곳에 두지 않고 impl블록 안에 넣는다는 것
  • impl = implementation

example

//declare a struct
struct Course {
    name: String,
    level: String,
    code:i32
}
//impl construct to define struct methods
impl Course {
    fn name_code(&self) -> String {
        format!("{} {}", self.name, self.code)
    }
}

fn main() {
    let course_1 = Course {
        name: "Rust".to_string(),
        level:"beginner".to_string(),
        code:132
    };
    //call the non-static method
    println!("This is a {} course: {}", course_1.level, course_1.name_code());
}

---

static method of structs

  • 구조체의 정적 메서드
  • 정적 메서드 : 구조체를 인스턴스화 시키지 않고 호출할 수 있음

1. declare a static method

note

  • 구문이 implkeywordh로 선언된 경우 정적 or 동적 or 둘다 중에 있어야 함

2. invoke a static method

  • :: : membership operator

example

// declare a struct
struct Course {
   name: String,
   level:String,
   code: i32,
}
impl Course {
   // static method
   fn my_static_method(n: String, l: String, c:i32) -> Course {
      Course { 
      name: n, 
      level:l,
      code:c
       }
   }
   //display
   fn display(&self){
      println!("name :{} code:{} of type: {}", self.name, self.code, self.level );
   }
}
fn main(){
   // call the static method
   let c1 = Course::my_static_method("Rust".to_string(), "beginner".to_string(), 132);
   c1.display();
}

note

  • 구조체는 인스턴스화 되지 않음

---

tuple structs

  • tuple struct : tuple 과 struct의 하이브리드 기능을 가진 데이터 타입

1. deine a tuple struct

struct : keyword

syntax

struct tuple_name (datatype, datatype, datatype);

2. initalize a tuple struct

  • tuple 과 동일

syntax

let a = tuple_name (v1,v2,v3);
------------------------------
v : value of variable 

3. access a tuple struct

  • tuple 의 .연산자와 동일

syntax

tuple_name.value

example

//define a tuple struct
struct FruitQuantity(String, i32);
// main function
fn main() {
    // create an instance
    let r1 = FruitQuantity("oranges".to_string(), 12);
    // access values of a tuple struct
    println!("r1--name:{} quantity:{}", r1.0, r1.1);
    // create an instance
    let r2 = FruitQuantity("mangoes".to_string(), 13);
    // access values of a tuple struct
    println!("r2--name:{} quantity:{}", r2.0, r2.1);   
}
profile
hunting season

0개의 댓글