[Rust 공식문서 한국어 정리] 104. Rust PartialEq/Eq 트레이트 가이드
[Rust 공식문서 한국어 정리] 104. Rust PartialEq/Eq 트레이트 가이드
원문 제목: Trait std::cmp::PartialEq
작성자: The Rust Project
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PartialEq와 Eq 트레이트가 제공하는 동등성 비교 메커니즘을 상세히 다룹니다.
부분 동등성과 완전 동등성의 차이, 수학적 의미를 학습합니다.
#[derive(PartialEq, Eq)]의 자동 구현과 수동 구현 방법을 정리합니다.
HashMap 키나 assert_eq!에서 Eq가 요구되는 이유를 설명합니다.
부동소수점 타입이 PartialEq만 구현하는 이유와 그 의미를 다룹니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① PartialEq — 동등성 비교(반사, 대칭, 전이성 보장 불필요)
② Eq — 완전 동등성(반사, 대칭, 전이성 모두 보장)
③ eq/ne — ==와 != 연산자의 기본이 되는 메서드
④ assert_eq! — PartialEq를 요구하는 매크로
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PartialEq는 ==와 != 연산자의 기반이 되는 트레이트입니다.
eq 메서드는 두 값이 논리적으로 동등한지를 판단합니다.
ne 메서드는 기본적으로 eq의 반환값을 부정하므로 직접 구현할 필요가 없습니다.
Eq는 PartialEq를 상속하며 추가적인 계약을 요구합니다.
Eq의 계약은 반사성(a == a), 대칭성(a == b면 b == a), 전이성(a == b고 b == c면 a == c)입니다.
부동소수점 f32와 f64는 NaN != NaN이므로 반사성이 깨져 Eq를 구현할 수 없습니다.
따라서 f32와 f64는 PartialEq만 구현하고 Eq는 구현하지 않습니다.
대부분의 타입은 #[derive(PartialEq, Eq)]로 두 트레이트를 한 번에 자동 구현합니다.
Eq를 요구하는 제네릭 경계는 HashMap 키나 BTreeMap 키 등에서 사용됩니다.
완전 동등성이 보장되어야 하는 알고리즘과 자료구조가 Eq를 필요로 합니다.
수동 구현 시 필드별로 eq를 호출하여 논리적 동등성을 정의할 수 있습니다.
표현상 다르지만 논리적으로 동등한 값을 eq에서 true로 판단할 수 있습니다.
반대로 표현상 같지만 논리적으로 다른 값을 eq에서 false로 판단할 수도 있습니다.
PartialEq의 자동 구현은 모든 필드가 PartialEq이면 구조체도 PartialEq가 됩니다.
Eq의 자동 구현은 모든 필드가 Eq이면 구조체도 Eq가 됩니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
모든 사용자 정의 타입에 #[derive(PartialEq, Eq)]를 붙여 비교와 테스트를 용이하게 합니다.
HashMap 키로 사용할 타입은 Eq까지 구현해야 합니다.
부동소수점을 포함하는 타입은 Eq를 derive할 수 없음을 인지하고 설계합니다.
수동 eq 구현으로 필드 일부를 비교에서 제외하거나 논리적 동등성을 재정의합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PartialEq는 ==와 !=의 기본이며 Eq는 더 강력한 동등성 계약을 보장합니다.
부동소수점 타입은 NaN 때문에 Eq를 구현할 수 없습니다.
#[derive]로 자동 구현이 가능한 경우가 대부분이며 수동 구현은 신중히 해야 합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html
Eq Trait: https://doc.rust-lang.org/std/cmp/trait.Eq.html
#Rust #PartialEq #Eq #동등성 #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30