에러리포트
JAVA equals() 와 == 에 대한 실험
캡틴쿼카
2021. 8. 10. 00:41
반응형
문제인식
코딩을 하다보면 분명눈으로 보기엔 같은데 == 비교를하면 다르다고 나오는 경우를 종종 찾아볼 수 있다.
해당 문제에 대해 이번에 한번 자세히 살펴보고 정리해보도록 한다.
소스코드 및 결과
1.
public static void main(String[] args) {
String stringA = "abc";
String copyStringA = stringA;
String newString = new String("abc");
// equals() 메소드 : 객체끼리 내용 비교 할 수 있도록함
System.out.println("----------------equals 비교는 값 비교");
System.out.println("stringA.equals(copyStringA) : " + stringA.equals(copyStringA));
System.out.println("stringA.equals(newString) : " + stringA.equals(newString));
System.out.println("copyStringA.equals(newString) : " + copyStringA.equals(newString));
System.out.println("");
}
결과 :
----------------equals 비교는 값 비교
stringA.equals(copyStringA) : true
stringA.equals(newString) : true
copyStringA.equals(newString) : true
2.
public static void main(String[] args) {
String stringA = "abc";
String copyStringA = stringA;
String newString = new String("abc");
// == : 대상의 주소 비교
System.out.println("---------------- == 주소 비교");
System.out.println("stringA == copyStringA : " + (stringA == copyStringA));
System.out.println("stringA == newString : " + (stringA == newString));
System.out.println("copyStringA == newString : " + (copyStringA == newString));
System.out.println("");
}
결과 :
---------------- == 주소 비교
stringA == copyStringA : true
stringA == newString : false
copyStringA == newString : false
3.
public static void main(String[] args) {
String stringA = "abc";
String copyStringA = stringA;
String newString = new String("abc");
// stringA 와 copyStringA는 주소값이 같으므로 stringA를 변경한다면?
System.out.println("---------------- stringA 변경전 주소값 비교");
System.out.println("stringA 주소값 : " + System.identityHashCode(stringA));
System.out.println("copyStringA 주소값 : " + System.identityHashCode(copyStringA));
System.out.println("stringA == copyStringA : " + (stringA == copyStringA));
System.out.println("---------------- stringA 변경");
stringA = "def";
System.out.println("stringA : " + stringA);
System.out.println("copyStringA : " + copyStringA);
System.out.println("def의 주소값 : " + System.identityHashCode("def"));
System.out.println("stringA 주소값 : " + System.identityHashCode(stringA));
System.out.println("copyStringA 주소값 : " + System.identityHashCode(copyStringA));
System.out.println("stringA == copyStringA : " + (stringA == copyStringA));
System.out.println("");
}
결과 :
---------------- stringA 변경전 주소값 비교
stringA 주소값 : 916419490
copyStringA 주소값 : 916419490
stringA == copyStringA : true
---------------- stringA 변경
stringA : def
copyStringA : abc
def의 주소값 : 2106620844
stringA 주소값 : 2106620844
copyStringA 주소값 : 916419490
stringA == copyStringA : false
4.
public static void main(String[] args) {
System.out.println("---------------- Shallow, Deep Copy");
int[] array_1 = new int[]{0,1,2};
// 얕은복사 : Shallow Copy
int[] array_2 = array_1;
// 깊은복사 : Deep Copy
int[] array_3 = array_1.clone();
array_1[0] = 100;
System.out.println("array_1[0][1] 주소값 : " + System.identityHashCode(array_1[0]));
System.out.println("array_2[0][1] 주소값 : " + System.identityHashCode(array_2[0]));
System.out.println("array_3[0][1] 주소값 : " + System.identityHashCode(array_3[0]));
System.out.println("array_1[0][1] 값 : " + array_1[0]);
System.out.println("array_2[0][1] 값 : " + array_2[0]);
System.out.println("array_3[0][1] 값 : " + array_3[0]);
}
결과 :
---------------- Shallow, Deep Copy
array_1[0][1] 주소값 : 2006034581
array_2[0][1] 주소값 : 2006034581
array_3[0][1] 주소값 : 979294118
array_1[0][1] 값 : 100
array_2[0][1] 값 : 100
array_3[0][1] 값 : 0
결과
- 1번을 통해 equals() 메소드는 객체 값을 비교하는 메소드임을 알 수 있다.
- 2번을 통해 == 는 객체의 주소값을 비교하는 것을 알 수 있다.
- 3번을 통해 대입연산 시, =의 [우항값의 주소]를 [좌항변수의 주소]에 대입하는것을 알 수 있다.
- 4번을 통해 얕은복사와 깊은복사의 차이를 알아보고, 깊은복사시에는 clone()을 사용할 수 있다.
- 얕은복사(Shallow Copy)는 주소만 복사하므로 원 값이 바뀌면 대입되어진 변수 값도 바뀜
- 깊은복사(Deep Copy)는 주소와 값을 모두 복사하므로 원 값이 바뀌어도 대입되어진 변수는 안바뀜
- 참고소스코드 : https://github.com/greenzoo-quokka/greenzoo-java/tree/master/java-equals
GitHub - greenzoo-quokka/greenzoo-java: GreenZoo 블로그에서 개발한 Java 프로젝트
GreenZoo 블로그에서 개발한 Java 프로젝트. Contribute to greenzoo-quokka/greenzoo-java development by creating an account on GitHub.
github.com
본 포스팅은 정답노트라기 보다는
경험과 생각을 정리한 낙서장입니다.
반응형