메뉴

목차

구조체(Structure)

구조체(Structure)는 관련 속성 하나로 묶은(구조화한) 데이터 유형으로 데이터를 캡슐화하는데 사용한다. 개발자가 어떤 개체를 설계해야 한다면 구조체를 이용하게 된다. 예를 들어 User라는 개체는 아래와 같이 나타낼 수 있을 것이다.
struct User {
    name: String,
    age: u8,
    address: String,
    gender: u8,
}

구조체에는 3가지 변형이 있다.

C 유사 구조체 C언어의 struct와 유사하다. 아래의 예제를 보자.
struct Color {
    red: u8,
    green: u8,
    blue: u8
}

fn main() {
    let black = Color{red:0, green:0, blue:0};

    println!("black = Color({}, {}, {})", black.red, black.green, black.blue);

    let mut link_color = Color {red:0, green:0, blue: 0};
    link_color.blue = 238;

    println!("Link Color = Color({}, {}, {})", link_color.red, link_color.green, link_color.blue);
}

튜플 구조체(Tuple structure) 튜플 구조체가 하나의 값만을 가지는 경우 이를 뉴타입 패턴(newtype pattern)이라고 한다. 새로운 유형을 만드는데 도움이 되기 때문이다. 아래 예제처럼 튜플 구조체는 뉴타입 패턴과 함께 사용한다.
struct Color(u8,u8,u8);
struct Kilometers(i32);

fn main() {
    let black = Color(0,0,0);
    let Color(r,g,b) = black;
    println!("Black = reg({},{},{})", r, g, b);

    let distance = Kilometers(40);
    let Kilometers(distance_in_km) = distance;
    println!("The distance: {} km", distance_in_km);
}

단위 구조체(Unit structure) 단위 구조체는 이름만 가지는 구조체형식으로 만들어진다.
struct Nothing {}
let x = Nothing {};
단위 구조체는 빈 튜플과 비슷하지만 차이점이 있다. 튜플은 이름이 없기 때문에 하나의 단위 유형만 있을 수 있지만, 단위 구조체는 이름이 있으므로 단위와 유사한 여러 구조체를 만들 수 있다. 단위 구조체는 값이 없지만 Copy 특성을 구현하지 않는 데이터 유형을 사용하려는 경우에 유용하다.

중첩된 구조체

Rust의 구조체는 필드에 구조체를 선언하는 식으로 중첩된 구조체를 선언할 수 있다.
struct Address {
    state: String,
    city: String,
    postal_code: String, 
}

struct User {
    name: String,
    email: String,
    phone: String,
    age: u8,
    addr: Address,
}

fn main() {
    let addr_01=Address{
        state: String::from("Gyeonnggi-do"),
        city: String::from("seoul"),
        postal_code: String::from("incheon"),
    };
    let user_01=User {
        name: String::from("yundream"),
        email: String::from("yundream@gmail.com"),
        phone: String::from("111-111-1111"),
        age: 45,
        addr: addr_01,
    };
    println!("{:?} {:?}", user_01.name, user_01.addr.city);
}

구조체와 구현

구조체를 이용해서 개발자는 사용자 지정 데이터 유형을 만들 수 있다. 객체지향 언어에 익숙하다면 데이터 속성을 저장하는 클래스와 메서드를 이용해서 객체를 조작 할 수 있다는 것을 알고 있을 것이다.

Rust의 구조체 역시 고유한 방식으로 클래스(객체)의 유연성을 제공한다. 일단 아래의 주요 키워드들을 숙지하자.

struct: 구조체라고 부르며, 여러 데이터를 저장할 수 있는 이름을 가지고 있으며 이를 패키징 할 수 있는 사용자 지정 데이터 유형이다.

impl : rust의 스트럭처는 "impl"키워드를 이용해서 메서드를 만들 수 있다. 구조체는 여러 개의 impl 블록을 가질 수 있다. 메서드 : 메서드는 함수와 유사하며 fn 뒤에 따라오는 이름을 가지고 매개변수와 반환 값을 가질 수 있다. 반면 메서드는 구조체의 컨텍스트 내에서 정의되고 첫 번째 매개변수가 항상 "self"라는 점이 함수와 다르다.

self: "self"키워드는 self:Self의 약어로 구조체의 인스턴스를 나타낸다. self:&Self에 해당하는 &self와 "self:&mut Self"에 해당하는 &mut self가 있다.

Associated Function: "self"를 매개변수로 사용하지 않는 impl 블록내부의 함수로 구조체와 연결되기 때문에 관련함수(Associated Function)이라고 한다. 이 함수들은 작업할 구조체의 인스턴스가 없기 때문에 메스드가 아닌 함수다. 관련함수는 구조쳬의 새 인스턴스를 반환하는 생성자용으로 자주 사용한다.

아래 예제코드는 struct, impl, methods, self의 조합을 포함하고 있다.

... 계속

참고