구조체(Struct)

2020년 10월 6일


구조체란?

  • Object Composition의 일종 [1]
    • 원시 데이터 타입을 묶어서 새로운 데이터 타입으로 라벨링 하는 것
    • 여기서 상속과 함수(메쏘드)를 포함하도록 만들어서 객체 지향 언어의 객체라는 개념을 만듬
  • Rust의 구조체는 상속은 없지만 메쏘드를 선언할 수 있고, 생성자를 만들 수 있는 것과 같이 객체 지향 언어의 객체와 굉장히 비슷한 특징을 가짐.

구조체의 정의

  • 구조체의 선언에는 구조체의 이름, 필드의 이름과 타입을 나열해야 한다.

#![allow(unused)]
fn main() {
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool
}
}
  • Tuple struct : 필드의 이름이 없는 튜플을 통해서도 구조체를 만들 수 있다.

#![allow(unused)]
fn main() {
struct Color(i32, i32, i32);
}

구조체 인스턴스의 생성과 이용

  • 인스턴스 : 어떤 설계도(클래스, 생성자, 구조체 등)을 통해 만들어지는 대상

#![allow(unused)]
fn main() {
let some_color = Color(0, 0, 0);
let user_1 = User{
    username: String::from("hello"),
    email:String::from("hello"),
    sign_in_count: 0,
    active: false
};

println!("{}", some_clor.1); // 0
println!("{}", user_1.username) // hello
}

구조체 인스턴스를 반환하는 함수

  • 구조체를 반환하는 함수를 만들 수 있다.

#![allow(unused)]
fn main() {
fn make_user(email: String, username: String) -> User {
    return User {
      username,
      email,
      sign_in_count: 0,
      active: false
    }
}
}

derive 어노테이션으로 디버깅 하기

  • #[derive] attribute를 통해, 우리는 이미 기본적으로 구현된 몇몇 trait을 사용할 수 있게 해줌.
  • 그 중 하나가 {:?}를 통해 값을 포맷팅 할 수 있게 해주는 Debug [2]
  • 기본적으로 Display를 구현하지 않더라도 출력할 수 있게 해줌

#![allow(unused)]
fn main() {
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

let rect1 = Rectangle {
    width: 30,
    height: 50,
};

println!("rect1: {:?}", rect1);
}

메쏘드

  • 그 객체 인스턴스와 그 데이터에 접근 가능한 서브루틴 : 함수와 유사하다.
  • &self인자를 통해 접근 가능하며, 이 외에도 다른 매개변수를 받을 수 있다.
  • 위의 Rectangle 구조체의 넓이를 구하는 메쏘드를 구현해보자.

#![allow(unused)]
fn main() {
impl Rectangle {
    fn get_area(&self) -> u32{ //&self를 인자로 인스턴스와 그 데이터에 접근한다.
      self.width * self.height
    }
}
}

연관 함수

  • 메쏘드와 유사하나, 인스턴스와 데이터에 접근하지 않는 함수(== &self를 인자로 가지지 않는 함수)
  • 생성자(새로운 인스턴스를 리턴하는 함수)를 만드는 데 주로 사용됨.
  • 객체 지향 언어의 정적 메소드와 비슷한 개념(단, 일반적으로 생성자는 정적 메소드가 아님.) [3]

#![allow(unused)]
fn main() {
impl Rectangle {
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}
}

참고문헌

[1] “Object composition,” Wikipedia. Sep. 21, 2020, Accessed: Sep. 28, 2020. [Online]. Available: https://en.wikipedia.org/w/index.php?title=Object_composition&oldid=979633822.

[2] “Derive - Rust By Example.” https://doc.rust-lang.org/stable/rust-by-example/trait/derive.html (accessed Sep. 29, 2020).

[3] Aron and K. Tugay, “java - Constructor is static or non static,” Stack Overflow, 27 2019. https://stackoverflow.com/questions/12940421/constructor-is-static-or-non-static (accessed Sep. 30, 2020).