Programming

Rust기초 알기 - 5.1 구조체 정의와 사용

IT오이시이 2023. 7. 2. 22:56
728x90

 

Rust기초알기(5) - 구조체와 열거형

5.1 구조체 정의와 사용
5.2 열거형 정의와 사용
5.3 메서드와 연관 함수

[목차] Rust Programming - Rust 기초 알기 목차.Zip

#Rust프로그래밍  #Rust언어기초 #Rust기초문법 #Rust기초알기

 
 

Rust기초 알기 - 5.1 구조체(Struct) 정의와 사용

 

구조체(Struct)

구조체는 관련된 데이터 필드(field)를 하나의 단위로 묶는 데 사용되며, 이를 통해 복잡한 데이터 구조를 만들고 관리할 수 있습니다.
 

구조체의 정의 문법

구조체를 정의하기 위해 struct 키워드를 사용합니다. 일반적인 구조체 정의의 형태는 다음과 같습니다:

struct `구조체이름` {
    필드1: 타입1,
    필드2: 타입2,
    // ...
}

 

  • struct `구조체이름` : 구조체 이름을 지정합니다.
  • 필드1: 타입1 : 필드 이름과 필드 타입으로 구성하여 구조체 내에 포함되는 각각의 데이터 필드를 나타냅니다.

 
 

구조체 정의 예시

 구조체는 struct Person은 구조체의 이름을 정의하고 , name, age, address등의  구조체의 필드를 정의 합니다. 각 필드는 각자 자신의 데이터 타입을 가지고 있습니다. name과 address가 문자열(String) 타입이고, age가 부호 없는 32비트 정수(u32) 타입을 정의합니다.

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

 
 

구조체 초기화

구조체는  let 키워드를 사용하여 변수를 선언하고 인스턴스를 초기화합니다, 

// 구조체의 인스턴스 초기화
let 변수명 = 구조체이름 {
    필드1: 값1,
    필드2: 값2,
    // ...
};

 
let 키워드를 이용하여 Person 구조체를  초기화 합니다.

//구조체 초기화
let person1 = Person {
    name: String::from("John"),
    age: 30,
    address: String::from("123 Main St"),
};

 

구조체의 필드에 접근:  `. `(도트) 연산자를 사용

person1은 Person 구조체의 인스턴스이며 구조체의 필드에 접근할 때는`. `연산자를 사용합니다:

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

 
 

구조체의 필드 값의 변경

구조체의 필드 값을 수정하려면 해당 필드에 대입 연산자(=)를 사용하여 새로운 값을 할당합니다.

// 구조체 필드의 값을 직접 수정 합니다.
변수명.필드 = 새로운값;

 

let mut person2 = Person {
    name: String::from("Alice"),
    age: 25,
    address: String::from("456 Elm St"),
};

// 필드의 값에 직접 수정을 합니다.
person2.age = 26;
  • 위의 코드에서 person2의 age 필드를 26으로 변경하고 있습니다.

 
 

구조체의 참조

또한, 구조체를 참조하는 변수를 선언하고자 할 때는 &를 사용하여 참조를 생성할 수도 있습니다.
Rust 변수는 불변 성질을 기본으로 하고 있어서, 값의 변경이 필요 할 경우 가변참조(mut )로 선언 하여야 합니다.

// 변수의 참조와 마찬가지로 불변 참조와 가변참조가 있음

let 변수명 = &구조체변수;   //불변 참조
let 변수명 =  &mut구조체변수;   //가변 참조

let person_ref = &person;  // person의 불변 참조
let person_ref = &mut person;  // person의 가변 참조

 
 

구조체 메소드 정의

구조체는 메소드(method)도 가질 수 있습니다. 메소드는 구조체에 대해 정의된 특정 동작을 구현하는 함수입니다. 메소드를 정의하려면 impl 블록을 사용합니다

impl 구조체이름 {
    fn 메소드이름(&self, 매개변수1: 타입1, 매개변수2: 타입2) -> 반환타입 {
        // 메소드 구현
    }
}

 
 impl Person 블록을 사용하여 메소드를 정의합니다.

impl Person {
    fn say_hello(&self) {
        println!("Hello, my name is {}.", self.name);
    }
}
  •  say_hello는 Person 구조체에 대한 메소드입니다. self는 메소드를 호출한 구조체 인스턴스를 참조하는 데 사용

 

구조체 이용시 유의 사항

가변 참조와 불변 참조

1) 불변 참조를 이용한 구조체 활용

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

fn main() {
    let person = Person {
        name: String::from("John"),
        age: 30,
    };

    let person_ref = &person;  // person의 불변 참조

    println!("Name: {}", person_ref.name);
    println!("Age: {}", person_ref.age);
}

 

  • person의 필드에 접근하여 값을 읽을 수 있습니다. 
  • person_ref를 통해 필드 값을 변경하려고 하면 컴파일 오류가 발생 합니다.

 
2) 가변 참조를 이용한 구조체 활용

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

fn main() {
    let mut person = Person {
        name: String::from("John"),
        age: 30,
    };

    let person_ref = &mut person;  // person의 가변 참조

    person_ref.age = 31;  // person의 age 필드 변경

    println!("Name: {}", person_ref.name);
    println!("Age: {}", person_ref.age);
}

 

  • person_ref는 person의 가변 참조 : person의 필드에 접근하여 값을 변경할 수 있습니다.
  • person_ref.age = 31;은 person의 age 필드 값을 31로 변경 합니다.

 
 

728x90
반응형