[Rust/러스트] 구조체(struct) 정리

2022. 2. 17. 17:04Programming Language/Rust

반응형

■ 구조체

구조체는 튜플과 유사하게 구조체의 구성요소들을 각각 다른 타입으로 가질 수 있습니다.

튜플은 구성요소에 접근하기 위해 색인을 이용하지만, 구조체는 각 구성요소들을 명명함으로써 구성요소에 접근할 때 순서에 의존하지 않고 접근할 수 있습니다.


◆ 구조체 인스턴스 생성

Person 구조체를 정의하고 인스턴스를 생성하여 모든 구성요소를 출력합니다.

구조체가 구성요소에 접근할 때는 튜플과 동일하게 점(.)을 이용합니다.

struct Person{
    name : String,
    age : u32,
    address : String,
    email : String,
}

fn main(){
    // 인스턴스 생성
    let person = Person{
        name : String::from("Hyunmin han"),
        age : 29,
        address : String::from("서울시 강남구 역삼동"),
        email : String::from("hyunmin@gmail.com"),
    };
    
    // 구성요소에 접근
    println!("Name : {}", person.name);
    println!("Age : {}", person.age);
    println!("Address : {}", person.address);
    println!("Email : {}", person.email);
}

▶ 출력 결과

Name : Hyunmin han
Age : 29
Address : 서울시 강남구 역삼동
Email : hyunmin@gmail.com

◆ 구조체의 필드명과 변수명이 같을 경우 변수명으로 초기화 가능

구조체의 필드명과 변수명이 같을 때는 필드명 : 값 형식이 아닌 변수명 으로 초기화 할 수 있습니다.

struct Person{
    name : String,
    age : u32,
    address : String,
    email : String,
}

fn build_person(name : String, age : u32, address : String, email : String) -> Person{
    // 필드와 변수명이 같을 때 초기화
    Person { 
        name, 
        age, 
        address, 
        email 
    }
}

fn main(){
    let person = build_person(
        String::from("Hyunmin han"),
        29,
        String::from("서울시 강남구 역삼동"),
        String::from("hyunmin@gmail.com")
    );

    println!("Name : {}", person.name);
    println!("Age : {}", person.age);
    println!("Address : {}", person.address);
    println!("Email : {}", person.email);
}

▶ 출력 결과

Name : Hyunmin han
Age : 29
Address : 서울시 강남구 역삼동
Email : hyunmin@gmail.com

◆ 구조체의 갱신

A 인스턴스를 활용하여 B 인스턴스를 생성할 때 A 인스턴스의 필드를 그대로 사용해야 할 경우 구조체의 갱신법을 사용할 수 있습니다.

struct Person{
    name : String,
    age : u32,
    address : String,
    email : String,
}

fn main(){
    let person1 = Person{
        name : String::from("Hyunmin han"),
        age : 29,
        address : String::from("서울시 강남구 역삼동"),
        email : String::from("hyunmin@gmail.com"),
    };

    let person2 = Person{
        name : String::from("Donghun lee"),
        age : 28,
        // person1의 address, email 필드를 그대로 가져와서 사용
        ..person1
    };

    println!("Name : {}", person2.name);
    println!("Age : {}", person2.age);
    println!("Address : {}", person2.address);
    println!("Email : {}", person2.email);
}

▶ 출력 결과

Name : Donghun lee
Age : 28
Address : 서울시 강남구 역삼동
Email : hyunmin@gmail.com

◆ 튜플 구조체

구조체에 필드명을 명명하지 않고 타입만을 정의하여 사용합니다.

튜플의 데이터 접근 방식과 동일하게 색인(인덱스)으로 데이터에 접근합니다.

struct Location(i32, i32, i32);

fn main(){
    let top = Location(100, 100, 100);
    let bottom = Location(0, 0, 0);

    println!("Top : X : {}, Y :{}, Z :{}", top.0, top.1, top.2);
    println!("Bottom : X : {}, Y :{}, Z :{}", bottom.0, bottom.1, bottom.2);
}

▶ 출력 결과

Top : X : 100, Y :100, Z :100
Bottom : X : 0, Y :0, Z :0
반응형