- 동일성(Identity) : 두 객체의 메모리 주소가 같음을 의미한다.
- 동일성(Equality) : 두 객체의 값이 같음을 의미한다.
void 동일성() {
List<String> crews1 = List.of("ash", "ako", "maco");
List<String> crews2 = crews1;
System.out.println(crews1 == crews2); // true
System.out.println(crews1.equals(crews2)); // true
}
void 동등성() {
List<String> crews1 = List.of("ash", "ako", "maco");
List<String> crews2 = List.of("ash", "ako", "maco");
System.out.println(crews1 == crews2); // false
System.out.println(crews1.equals(crews2)); // true
}
- 동일성() 메소드 :crew1 과 crew2는 메모리상에서 같은 주소 바라보고 있다.
- 동등성() 메소드 : crew1과 crew2는 메모리상 다른 주소를 바보고 있다.
문자열(String)의 동일성/ 동등성
String s1 = "cat";
String s2 = "cat";
System.out.println(s1 == s2); // true
- Java에서 문자열은 String Pool 관리되므로, "ash"라는 두 개의 String 변수를 선언하더라도 JVM Heap 메모리의 String Pool에는 "ash" 라는 문자열 하나만 존재한다.
- 즉 , name1과 name2는 메모리상 같은 주소를 바라본다(동일성)
- 메모리상 다른 주소를 바라보게 하고 싶으면? 새로 객체 생성 해주면 된다.
String s1 = "cat";
String s3 = new String("cat");
System.out.println(s1 == s3); // false
- 이렇게 new 연산자를 이용해 생성해주면, 같은 값이더라도 힙 영역에 새로운 객체 생성된다.
equlas()와 hashcode() 오버라이딩
equals() 오버라이딩
- java에서 동등성을 검사하기 위해서, equals() 를 사용해라 했는데 사실 override 되지 않은 equals() 는 == 과 동일하게 사용된다(원시값의 경우 내용 비교, 객체의 경우 주소 비교)
- 객체의 동등성(equlas)을 비교하기 위해서 equals()를 오버라이딩해서 사용해야한다.
class Crew {
private final String name;
public Crew(String name) {
this.name = name;
}
}
void 객체_동등성_테스트() {
Crew crew1 = new Crew("cat");
Crew crew2 = new Crew("cat");
System.out.println(crew1.equals(crew2)); // false
}
- 오버라이딩하지 않았을 때 동등성 검사는 false인데, 여기서 다음과 같이 equals() 함수를 오버라이딩 해주면, 객체 동등성(equal) 테스트값은 true가 된다.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Crew crew = (Crew) o;
return Objects.equals(name, crew.name);
}
hashCode() 오버라이딩
List<Crew> crews = new ArrayList<>();
crews.add(new Crew("cat"));
crews.add(new Crew("cat"));
System.out.println(crews.size()); // 2
- 중복되지 않은 Crew 인원수를 알고싶다면, List에서 중복값을 허용하지 않는 Set 자료구조를 사용하면 된다.
Set<Crew> crews = new HashSet<>();
crews.add(new Crew("cat"));
crews.add(new Crew("cat"));
System.out.println(crews.size()); // 2
- 출력 값이 2가 나온 이유 : HashMap/HashSet/HashTable과 같은 객체들을 사용하는 경우 해쉬값을 비교해서 동등성(equals)을 비교한다.
- 이 문제를 해결하기 위해 hashCode()를 오버라이딩 해주자
@Override
public int hashCode() {
return Objects.hash(name);
}
출저
https://xxeol.tistory.com/15#%EB%AC%B8%EC%9E%90%EC%97%B4(String)%EC%9D%98%20%EB%8F%99%EC%9D%BC%EC%84%B1%20%2F%20%EB%8F%99%EB%93%B1%EC%84%B1-1
'이론 > 자바' 카테고리의 다른 글
[Java] 자바가 Call by Value 방식인 이유 (0) | 2024.10.10 |
---|---|
[Java] MyBatis (0) | 2024.09.23 |
[Java] 클래스,객체, 인스턴스 차이 (0) | 2024.09.20 |
[Java] Scanner 와 BufferedReader (0) | 2024.09.20 |
[Java] 자바 메모리 구조, JVM (0) | 2024.09.18 |