김태오

동일성과 동등성 본문

Spring Boot

동일성과 동등성

ystc1247 2023. 11. 29. 11:38

동일성 (identity) 와 동등성 (equality) 는 자주 헷갈리는 개념이다. 전자는 Java 에서 ('==') operator 의 개념이고, 후자는 (equals()) method 개념이다.

 

Identity

우선 자바에서는 모든 객체가 참조로 접근된다. '==' 연산자를 쓸 때는 좌우의 실제값이 아닌 reference 자체로 접근된다.

단, primitive type (int, char, float ...) 에서는 실제값으로 접근된다.

 

reference 로 접근한다는 것은, 실제 값이 같을지언정 주소값이 다르다면 '==' 연산에서는 false 가 나온다는 뜻이다.

 

Integer x = 100;
Integer y = 100;
System.out.println(x == y);

 

이런 코드에서는 false 가 출력될 것이다. 단, JVM 의 integer caching 에 따라 -128~127 까지의 값은 true 로 출력된다.

 

Equality

equals() method 는 logical equivalence 를 확인한다. 두 객체의 data 자체를 확인한다는 뜻이다.

 

이 method 를 클래스에서 override 하는 것도 가능하다. 내 뜻대로 equality 가 무엇인지 정의할 수 있다는 뜻이다.

이 때는 hashCode() 까지 override 하는것이 좋다. HashSet과 HashMap 등의 Java Collection 이 존재하여 양쪽의 method 를 모두 사용해야 제대로 작동하기 때문이다.

public class Person {
    private String name;
    private int age;

    // Constructor
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Override equals() method
    @Override
    public boolean equals(Object obj) {
        // Check if the object is compared with itself
        if (this == obj) {
            return true;
        }

        // Check if obj is an instance of Person
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }

        // Typecast obj to Person so that we can compare data members
        Person person = (Person) obj;

        // Compare the data members and return accordingly
        return name.equals(person.name) && age == person.age;
    }

    // Override hashCode() method
    @Override
    public int hashCode() {
        // Use a prime number to calculate the hash code
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        return result;
    }

    // Getters and setters for name and age
    // ...
}

 

equals() 를 구현할 때 null-safe (null argument 일 때의 exception 처리) 를 하는 것이 중요하다.

 

 

결론 :

- primitive data type 에는 '==' 를 사용하자

- 객체 비교에는 equals() 를 사용하자.

- equals() 와 hashCode() 를 함께 override 하자.

- '==' 를 String 에서 사용하지 말자. (String 은 object이기 때문)

- equals() override 에서 null check 를 반드시 하자.

 

 

 

'Spring Boot' 카테고리의 다른 글

FeignClient 사용시 PATCH method 가 안되는 오류  (0) 2024.03.11
async 작업 시 thread 의 traceId 전파  (0) 2024.03.09
@Getter 와 @Setter 남용  (0) 2023.11.02
Parameter handling in Controllers  (0) 2023.07.15
JpaAuditing  (0) 2023.04.10