만자의 개발일지

[Rust] 구조체와 메서드 & 연관 함수 본문

Rust

[Rust] 구조체와 메서드 & 연관 함수

박만자 2025. 5. 4. 15:36

저번 포스팅에서는 조건문과 반복문에 대해 알아보았습니다. 이번 포스팅에서는 커스텀 타입 중 하나인 구조체와 메서드 & 연관 함수에 대해 알아보도록 하겠습니다.

구조체(Structs)

앞서 변수와 타입 절에서 구조체는 여러 변수들을 하나로 묶어주는 타입이라고 설명했었습니다. 사실 구조체는 꼭 여러 개의 변수를 묶는 용도로만 사용되진 않습니다. Rust에서는 다양한 방식으로 구조체를 사용할 수 있으며 총 3가지 종류의 구조체가 있습니다.

Classic C structs

가장 일반적인 형태의 구조체입니다. 여러 변수를 하나의 구조체로 묶을 수 있습니다. 각 변수를 필드(field)라고 부르며, 이름과 타입으로 구성됩니다. 아래는 구조체 선언 예시입니다.

struct Person {
    name: String,
    age: u8
}

구조체는 struct 키워드를 사용하여 정의합니다. 각 필드는 이름과 타입을 명시해야 합니다.

 

다음과 같이 구조체 인스턴스를 생성하여 사용할 수 있습니다. 구조체의 필드에 접근할 때는 . 연산자를 사용하여 접근합니다.

struct Person {
    name: String,
    age: u8
}

fn main() {
    let peter = Person { 
        name: String::from("Peter"),
        age: 27
    };
    
    println!("Name of person is : {}", peter.name); 
    println!("Age of person is : {}", peter.age); 
}

일반적으로 구조체의 인스턴스를 생성할 때에는 필드에 저장할 값을 key: value 형태로 작성해야 합니다.

 

하지만 다음과 같이 변수명과 필드명이 동일한 경우 필드 초기화 축약법(field init shorthand)을 사용해서 적은 타이핑으로 인스턴스를 생성할 수 있습니다.

struct Person {
    name: String,
    age: u8
}

fn main() {
    // Create struct instance with field init shorthand
    let name = String::from("Peter");
    let age = 27;
    let peter = Person { name, age };
    
    println!("Name of person is : {}", peter.name); 
    println!("Age of person is : {}", peter.age); 
}

일반적인 구조체 처럼 필드명을 일일이 명시하다보면 너무 장황하거나 불필요한 경우가 있습니다. 

이 경우에 Rust에서는 튜플 구조체를 사용하여 해결할 수 있습니다.

Tuple structs

튜플 구조체필드의 이름 없이 타입만 나열된 구조체로, 튜플 전체에 이름을 지어주어 다른 튜플과 구분하거나, 각 필드의 의미를 크게 따지지 않을 때 유용합니다. 아래는 튜플 구조체 선언 예시입니다.

struct RGB(u8, u8, u8);
struct Point(f64, f64);

 

다음과 같이 튜플 구조체 인스턴스를 생성할 수 있습니다. 

struct RGB(u8, u8, u8);
struct Point(f64, f64);

fn main() {
    let rgb = RGB(143, 235, 57);
    let p = Point(10.2, 0.3);
    
    println!("Red: {}, Green: {}, Blue: {}", rgb.0, rgb.1, rgb.2);
    println!("point coordinates: ({}, {})", p.0, p.1);
}

튜플 구조체는 일반적인 구조체와 달리 필드명이 없기 때문에 각 요소를 인덱스를 통해 접근합니다.

Unit structs

유닛 구조체는 필드가 없는 구조체입니다. 유닛 구조체는 타입 내부에 데이터를 저장할 필요가 없는 경우, 즉 값이 아닌 타입 자체가 의미를 가지는 경우 많이 사용합니다. 

아래는 유닛 구조체 선언 예시입니다.

struct Unit;

 

다음과 같이 유닛 구조체 인스턴스를 생성할 수 있습니다.

#[derive(Debug)]
struct Unit;

fn main() {
    let unit = Unit;
    println!("{:?}", unit);
}

유닛 구조체는 데이터를 저장하지 않지만, 타입 시스템 내에서 특정 의미를 전달하거나 타입에 대해 제약을 거는데 유용하게 사용합니다.

메서드(Methods)와 연관 함수(Associated functions)

특정 타입에 대해서도 함수를 정의할 수 있습니다. Rust는 이 함수를 두 가지로 분류하는데, 바로 메서드연관 함수 입니다. 각각의 특징은 다음과 같습니다.

  • 메서드self 를 인자로 받으며, 인스턴스를 통해 호출합니다.
  • 연관함수self 를 받지 않으며, 타입을 통해 호출합니다.

메서드와 연관 함수는 self 의 유무에 따라 역할이 구분됩니다.

메서드(Methods)

메서드는 인스턴스와 관련된 동작을 정의하는 함수입니다. 메서드와 연관 함수는 impl 블록을 사용해 정의합니다.

impl 키워드 뒤에 메서드를 정의할 타입을 명시합니다. 아래는 메서드 사용 예시입니다.

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

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

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

    println!(
        "The area of the rectangle is {} square pixels.",
        rect.area()
    );
}

메서드는 반드시 self, &self, &mut self하나를 첫번째 매개변수로 가져야 합니다. 위 예시에서는 &self 를 사용했습니다. 이는 불변참조라고 이는 후에 다룰 소유권 부분에서 자세히 설명하도록 하겠습니다.

메서드는 인스턴스를 통해 호출됩니다. 구조체 필드에 접근할 때 사용했던 . 연산자를 사용하여 호출할 수 있습니다.

연관 함수(Associated functions)

연관 함수는 타입과 관련된 동작을 정의하는 함수입니다. 사용 방식은 메서드와 같습니다.

struct Rectangle {
    width: u32,
    height: u32
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

impl Rectangle {
    fn new(width: u32, height: u32) -> Self {
        Self { width, height }
    }
}

fn main() {
    let rect = Rectangle::new(50, 30);

    println!(
        "The area of the rectangle is {} square pixels.",
        rect.area()
    );
}

연관 함수는 self매개 변수로 가지지 않습니다. 연관 함수는 타입에 대한 동작이기 때문에 인스턴스를 생성하지 않고 바로 호출할 수 있습니다. 연관 함수는 타입 뒤에 이중 콜론(::)을 사용하여 호출합니다.

impl 블록에서 selfSelf 는 다음과 같은 차이점이 있습니다.

  • self, 메서드가 호출되는 현재 인스턴스를 가르킵니다. 
  • Self, 타입 그 자체를 가르킵니다. 위 예시에서는 Rectangle 을 가르킵니다.

또한 각 타입들은 여러 개의 impl 블록을 가질 수 있습니다.


이번 포스팅에서는 구조체와 메서드 & 연관 함수에 대해 알아보았습니다. 다음 포스팅에서는 열거형에 대해 알아보도록 하겠습니다.

 

참고

'Rust' 카테고리의 다른 글

[Rust] 열거형  (0) 2025.05.18
[Rust] 조건문과 반복문  (0) 2025.05.02
[Rust] 함수와 표현식  (0) 2025.04.29
[Rust] 변수와 타입  (0) 2025.04.28
Comments