Menu
Coddy logo textTech

equals()와 hashCode()

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 42번째.

Java에서 객체를 비교할 때 == 연산자는 두 참조가 동일한 메모리 위치를 가리키는지 확인합니다. 객체의 실제 내용을 비교하려면 equals() 메서드를 재정의해야 합니다.

public class Person {
    private String name;
    private int age;
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name);
    }
}

equals() method는 표준 패턴을 따릅니다. 먼저 동일한 객체인지 확인하고, 그런 다음 유형을 검증한 후, 마지막으로 관련된 fields를 비교합니다.

equals()를 재정의할 때마다 hashCode()도 반드시 재정의해야 합니다. 이는 Java의 규칙입니다. 서로 같은 객체는 동일한 해시 코드를 가져야 합니다. HashMapHashSet과 같은 해시 기반 컬렉션은 올바르게 작동하기 위해 이 규칙에 의존합니다.

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

Objects.hash() 유틸리티 메서드는 equals()에서 사용된 것과 동일한 필드로부터 해시 코드를 생성합니다. 두 Person 객체의 이름과 나이가 같으면 동일한 것으로 간주되며 동일한 해시 코드를 생성하므로, 컬렉션에서 일관된 동작이 보장됩니다.

challenge icon

챌린지

쉬움

메모리에서 동일한 객체인지 여부와 관계없이, 동일한 student ID와 name을 가지면 두 학생이 같은 것으로 간주되도록 object equality를 올바르게 구현하는 student record system을 만들어 봅시다. Student class를 만들고, 동일한 student ID와 name을 가진 두 학생을 같은 것으로 간주하도록 합니다.

코드를 두 파일로 구성합니다:

  • Student.java: 학생을 나타내는 class를 Create하고, 세 개의 private fields를 포함합니다: studentId (String), name (String), gpa (double). 모든 fields를 초기화하는 constructor와 각 field에 대한 getter methods를 포함합니다.

    equals() method를 Override하여, 동일한 studentId AND 동일한 name을 가진 두 Student 객체가 같은 것으로 간주되도록 합니다. 표준 패턴을 따르세요: 동일한 reference인지 Check하고, Null 및 type을 Check한 다음, 관련 fields를 compare합니다.

    equals()에서 사용한 것과 동일한 fields를 사용하여 Objects.hash()hashCode() method를 Override합니다. 파일 상단에서 java.util.Objects를 import하는 것을 잊지 마세요.

  • Main.java: Student class를 사용하여 student 객체를 compare합니다. 두 학생을 나타내는 six inputs를 받습니다. 첫 번째 학생의 ID, name, GPA followed by 두 번째 학생의 ID, name, GPA입니다.

    두 Student 객체를 Create한 다음, 세 번 compare하고 결과를 print합니다:

    1. Same reference: 를 print하고 첫 번째 student가 itself와 equals하는지 출력합니다 (항상 true여야 함)
    2. Content equality: 를 print하고 첫 번째 student가 두 번째 student와 equals하는지 출력합니다 (사용자가 구현한 equals에 따름)
    3. Hash codes match: 를 print하고 두 학생이 동일한 hash code를 have하는지 출력합니다

six inputs를 받습니다: 첫 번째 학생의 ID (String), 첫 번째 학생의 name (String), 첫 번째 학생의 GPA (double), 두 번째 학생의 ID (String), 두 번째 학생의 name (String), 두 번째 학생의 GPA (double)입니다.

두 학생의 ID와 name이 match할 때 equals()가 true를 returns하고 AND hash codes도 일치하는 것을 확인하세요. 이것이 유지해야 하는 contract입니다!

REQUIRED OUTPUT FORMAT: [번역된 콘텐츠]

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 첫 번째 학생의 데이터 읽기
        String id1 = scanner.nextLine();
        String name1 = scanner.nextLine();
        double gpa1 = scanner.nextDouble();
        scanner.nextLine(); // 개행 문자 소비
        
        // 두 번째 학생의 데이터 읽기
        String id2 = scanner.nextLine();
        String name2 = scanner.nextLine();
        double gpa2 = scanner.nextDouble();
        
        // TODO: 입력 데이터를 사용하여 두 개의 Student 객체 생성
        
        // TODO: Print "Same reference: " followed by whether student1 equals itself
        
        // TODO: Print "Content equality: " followed by whether student1 equals student2
        
        // TODO: Print "Hash codes match: " followed by whether both students have the same hash code
    }
}
quiz icon실력 점검

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

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Java 컴파일러