RUST의 구조체

전지현·2024년 9월 4일

Rust

목록 보기
11/17

구조체 선언

struct User {
    name: String,
    email: String,
    active: bool,
}

구조체 인스턴스 생성

fn main() {
    let user = User {
        name: String::from("rust"),
        email: String::from("rust@email.com"),
        active: true
    };

    println!("name = {}", user.name);
}

구조체 필드 변경
변수와 마찬가지로 인스턴스 생성 시 mut을 붙여줘야 한다.

fn main() {
    let mut user = User {
        name: String::from("rust"),
        email: String::from("rust@email.com"),
        active: true
    };

    user.email = String::from("rust@example.com");

    println!("name = {}", user.name);
}

구조체 생성 함수 사용

// 매번 선언하기 귀찮으니 구조체 만드는 함수 선언해서 그때그때 호출해서 인스턴스 생성.
// 디폴트 값 (ex. active=true)을 매번 넣어주지 않아도 된다.


fn build_user(name: String, email: String) -> User {  // 인스턴스 생성해서 소유권 포함 반환.
    User {
        name: name,
        email: email,
        active: true,  // true로 고정.
    }
}

fn main(){
    let mut user = build_user(name: String::from("홍길동"), email:String::from("gildong@example.com"));
}

구조체 축약형

fn build_user(name: String, email: String) -> User {  
    User {
        name,   // 이름이 같은 경우 생략 가능
        email,  // 이름이 같은 경우 생략 가능
        active: true,  
    }
}

fn main() {
    let user1 = User {
        name: String::from("홍길동"),
        email: String::from("gildong@example.com"),
        active: true,
    };

    let user2 = User {
        active: false,
        ..user1     // active 필드 제외, user1을 그대로 복사해와서 사용 가능.
    }
}

구조체를 튜플 처럼 사용

구조체를 간략하게 튜플 대신 사용할 수 있다.

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
    let color = Color(1, 2, 3);
    let point = Point(1, 2, 3);
    color.0;
    color.1;
}

예제

  • 사각형 면적 구하기 (튜플 사용)
fn main() {
    let rect = (20, 30);

    println!("해당 사각형의 면적은 {}.", area(rect));
}

fn area(rect: (u32, u32)) -> u32 {
    rect.0 * rect.1
}

  • 사각형 면적 구하기 (구조체 사용)
// 디버깅 목적으로
#[derive (Debug)]  // 컴파일러에게 지시자. Debug를 위한 걸 만들어줘!

struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect = Rectangle {
        width: 20,
        height: 30,
    };

    println!("해당 사각형의 면적은 {}.", area(&rect));
    // println!("사각형 = {:?}", rect);  :? 를 붙이면 디버깅 목적 메소드 호출
    // dbg!(rect);  디버깅 매크로
}

fn area(rect: (u32, u32)) -> u32 {
    rect.width * rect.height
} 





인프런 김대현님의 우아한 고성능 프로그래밍 언어 Rust 입문 및 활용 강좌를 참고하였습니다.

0개의 댓글