반응형
자바를 공부하면서 제일 헷갈리는게 equals와 ==여서 한 번 정리하고 넘어가려 합니다.
우선 제일 상위 클래스고 모든 클래스를 포함하는 Object 클래스에서 equals와 == 는 '주소값 비교'라는 같은 역할을 수행합니다. 그런데 단 한가지 클래스! String 클래스에선 equals가 주소값이 아닌 '값을 비교'하도록 오버라이딩 되어 있습니다.
그러니 String 외의 다른 모든 클래스를 equals로 비교하면 주소값을 비교해서 리턴하고 String 클래스의 값을 equals로 비교하면 값을 비교합니다.
//같은 값을 가졌지만 주소값은 다르게 두 객체를 만들어주기
String str1 = new String("str");
String str2 = new String("str");
//equals 와 == 비교
System.out.println(str1.equals(str2));
System.out.println(str1==str2);
위의 코드에서 String 변수들을 비교해주기 위해 두 객체를 생성해주었는데 이렇게 한 이유는 객체를 강제로 생성해주지 않는 이상 자바는 존재하는 객체를 참조하기만 하기 때문입니다!
<객체를 따로 생성해주지 않으면>
1. str1에 "str" 저장
- 자바는 3000이라는 주소값에 원본 "str" 저장
- str1에 3000이라는 주소값을 저장
2.str2에 "str" 저장 (new 사용x)
- str2에 3000이라는 주소값을 저장
그리고 String은 클래스이고 int형은 원시타입입니다. int, double 등 이러한 타입은 모두 primitive 타입으로 클래스가 아닌데요. 이러한 변수 타입에서 ==를 사용할 경우 '값 비교'를 합니다.
기본적으로 equals와 == 모두 '주소값 비교'
String 클래스는 equals가 값 비교 ==는 주소값 비교
원시타입은 equals(객체가 아님으로 해당없음) ==는 값비교
끝!
반응형
'개발 공부 > Java' 카테고리의 다른 글
[자바다] 자바에서 for문이 while문의 속도 차이와 그 이유 (아마...) (0) | 2022.09.27 |
---|---|
[자바다] System.in.read() 사용법을 반복문 그리고 엔터와 함께 살펴보기 (0) | 2022.09.27 |
[자바다] 클래스, 객체, 인스턴스란 무엇일까? 각 개념의 차이점 (0) | 2022.09.19 |
[자바다] 윈도우와 맥에서의 캐리지리턴(\r), 라인피드(\n) (0) | 2022.09.15 |
[자바다] printStackTrace(), toString(), getMessage() 의 차이점! (0) | 2022.09.15 |
댓글