일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- MSSQL
- Strimzi
- 0 replica
- minreplica
- Kafka
- blue-green
- Software maestro
- logback
- eks
- Salting
- Kubernetes
- propogation
- zset
- SW 마에스트로
- Grafana
- Helm
- keda
- docket
- slow query
- Debezium
- Leaderboard
- Database
- 동등성
- spring boot
- Benchmarks
- traceId
- SW Maestro
- yml
- hammerDB
- 스프링부트
- Today
- Total
김태오
동일성과 동등성 본문
동일성 (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 |