Menu
Coddy logo textTech

동등성 트레이트

Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 38번째.

Rust에서 사용자 정의 구조체의 두 인스턴스를 ==로 비교하는 것은 기본적으로 작동하지 않습니다. 컴파일러는 두 구조체가 같은지 판단하는 방법을 모르기 때문에, PartialEq 트레이트를 구현하여 이를 알려주어야 합니다.

DebugCopy와 마찬가지로, PartialEq를 자동으로 구현(derive)할 수 있습니다:

#[derive(PartialEq)]
struct Coordinate {
    x: i32,
    y: i32,
}

let a = Coordinate { x: 5, y: 10 };
let b = Coordinate { x: 5, y: 10 };
let c = Coordinate { x: 3, y: 7 };

println!("{}", a == b);  // true
println!("{}", a == c);  // false

파생될 때, PartialEq는 구조체의 각 필드를 비교합니다. 두 인스턴스는 모든 해당 필드가 일치하는 경우에만 동일합니다.

또한 Eq를 접하게 될 텐데, 이는 전체 동등성(total equality)을 나타내는 마커 트레이트입니다. 즉, 모든 값이 자기 자신과 같음을 의미합니다. 대부분의 타입은 이를 만족하지만, 부동 소수점 숫자는 그렇지 않습니다(NaN != NaN이기 때문입니다). 정수 필드를 가진 구조체의 경우, 두 가지 모두를 안전하게 파생(derive)할 수 있습니다:

#[derive(PartialEq, Eq)]
struct Coordinate {
    x: i32,
    y: i32,
}

Eq는 자체 메서드가 없습니다. 이는 단순히 해당 타입이 재귀적 동등성(reflexive equality)을 가짐을 나타냅니다. 일부 표준 라이브러리 기능은 PartialEq 외에도 Eq를 요구하므로, 자격이 되는 타입에 대해 두 가지를 함께 파생(derive)하는 것이 일반적입니다.

challenge icon

챌린지

쉬움

PartialEqEq 트레이트가 어떻게 구조체 인스턴스 간의 비교를 가능하게 하는지 보여주는 색상 일치 시스템을 만들어 봅시다!

색상 비교 로직을 구성하기 위해 두 개의 파일을 생성합니다:

  • color.rs: 세 개의 공개 필드 red, green, blue (모두 u8 타입)를 가진 공개 Color 구조체를 정의하세요. PartialEqEq를 모두 파생(derive)하여 ==를 사용해 두 색상을 비교할 수 있도록 합니다. 파생될 때, Rust는 세 가지 RGB 구성 요소가 모두 정확히 일치하는 경우에만 두 색상이 같다고 간주합니다.
  • main.rs: color 모듈을 가져와 제공된 입력을 사용하여 두 개의 Color 인스턴스를 생성합니다. ==를 사용하여 비교하고 일치 여부를 출력합니다.

출력은 두 색상이 동일한지 여부를 나타내야 합니다:

Color 1: rgb({r1}, {g1}, {b1})
Color 2: rgb({r2}, {g2}, {b2})
Colors match: {true/false}

예를 들어, 입력값이 255, 128, 0, 255, 128, 0인 경우:

Color 1: rgb(255, 128, 0)
Color 2: rgb(255, 128, 0)
Colors match: true

그리고 입력값이 100, 100, 100, 200, 200, 200인 경우:

Color 1: rgb(100, 100, 100)
Color 2: rgb(200, 200, 200)
Colors match: false

여섯 개의 입력을 받게 됩니다: 첫 번째 색상의 RGB 값(세 개)과 이어서 두 번째 색상의 RGB 값(세 개)입니다. 각 값을 u8로 파싱하세요.

치트 시트

사용자 정의 구조체를 ==를 사용하여 비교하려면, PartialEq 트레이트를 파생(derive)하여 구현하세요:

#[derive(PartialEq)]
struct Coordinate {
    x: i32,
    y: i32,
}

let a = Coordinate { x: 5, y: 10 };
let b = Coordinate { x: 5, y: 10 };

println!("{}", a == b);  // true

파생될 때, PartialEq는 모든 필드를 비교합니다—두 인스턴스는 모든 대응하는 필드가 일치할 때만 동일합니다.

Eq 트레이트는 전체 동등성(total equality)(모든 값은 자기 자신과 같다)을 나타내는 마커 트레이트입니다. 부동 소수점 숫자(NaN != NaN이기 때문)를 제외한 대부분의 타입이 이를 만족합니다. 정수 필드를 가진 구조체의 경우, 두 트레이트를 함께 파생시키세요:

#[derive(PartialEq, Eq)]
struct Coordinate {
    x: i32,
    y: i32,
}

Eq는 메서드가 없습니다—이는 반사적 동등성(reflexive equality)을 나타냅니다. 일부 표준 라이브러리 기능은 PartialEq 외에도 Eq를 요구합니다.

직접 해보기

mod color;

use color::Color;

fn main() {
    // 6개의 RGB 값을 읽습니다
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let r1: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let g1: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let b1: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let r2: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let g2: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let b2: u8 = input.trim().parse().expect("Invalid input");

    // TODO: 파싱된 값들을 사용하여 두 개의 Color 인스턴스를 생성하세요

    // TODO: Color 1을 다음 형식으로 출력하세요: Color 1: rgb(r, g, b)

    // TODO: Color 2를 다음 형식으로 출력하세요: Color 2: rgb(r, g, b)

    // TODO: ==를 사용하여 두 색상을 비교하고 다음을 출력하세요: Colors match: {true/false}
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨