자바에는 eqauls함수가 있고 == 이라는 연산자를 통해서 값을 비교할 수 있습니다. 어떤차이가 있는지 보겠습니다.
결론부터 말하면
==은 주소값을,
equlas()는 문자열의 실제 값을 비교합니다.
구체적으로 어떤 차이가 있는지 조금 더 자세히 알아보겠습니다.
==을 통한 비교,
String의 특성 이해하기
1. String은 주소값과 알맹이값을 갖습니다.
2. new 하면 객체를 무조건 생성합니다.
그림을 보면서 해석해보겠습니다.
1. String a = "dog" 가 선언되면서 Spring Pool 영역에 dog가 있는지 찾습니다. 없으니 해당 객체를 생성합니다. a라는 변수는 해당 주소지를 가리키고 있으며 101번 주소라고 가정하겠습니다. (Spring Pool영역에서 객체를 찾거나, 생성하며 new가 들어가지 않는 방식을 리터럴을 이용한 방식이라고 칭합니다.)
2. String b = "dog"가 선언되면서 Spring Pool 영역에 dog를 찾습니다. 이미 a가 선언되면서 만들어진 dog가 존재하기 때문에 더 이상 새로 객체를 만들지 않고 기존에 있는 101번 주소를 가리킵니다.
3. String c = new String("dog"); 가 선언되면서 dog라는 객체를 새로 만들며, new를 해서 만든 경우 Spring Pool이 아닌 조금 더 넓은 범위인 Java Heap 영역에 생성됩니다. a, b와는 다른 주소를 가리키게 됩니다.
4. a==b를 통해 검증합니다. == 은 주소값을 비교합니다. 안에 무슨값이 들어있는지까지는 찾아보지 않습니다. 따라서 같은 101번지를 갖고 있는 a와 b를 보고 같다고 생각하며 true를 반환합니다.
5. a==c를 통해 검증합니다. 현재 a는 101번지, c는 501번지 주소를 가지고 있어 다르다고 판단해 false를 반환합니다.
6. String d = new Stinrg("dog");가 선언되면서 새로운 dog가 만들어집니다. new를 했기 때문에 Java Heap 영역에 만들어집니다.
7. 해당 그림에는 없지만 똑같이 new를 해서 만들었다고 해도 c==d를 검증하면 false를 반환해줄것입니다.(서로 다른 주소지를 갖고 있기 때문입니다)
eqluas()를 통한 비교,
String의 특성을 모르신다면 위에 ==을 통한 비교를 먼저 읽어보시는 것이 좋습니다.
차이점만 비교를 해보겠습니다.
a,b는 101번지 주소를 가지며, dog라는 값을 가지고 있습니다.
c는 501번의 주소를 가지고 있으며, dog라는 값을 가지고 있습니다.
d는 502번의 주소를 가지고 있으며, dog라는 값을 가지고 있습니다.
equlas()는 알맹이 값을 비교합니다. 즉, 네개 모두 같다고 판단을 해버리는것이죠 따라서 String 타입의 변수의 값을 안전하게 비교하려면 알맹이를 뒤집어 검사하는 equlas()를 쓴다고 생각하면 됩니다.
위에서 주소지는 이해를 위해 그냥 제가 편하게 지정한 주소입니다. 그냥 이런식으로 자바 내에서 주소값이 부여가된다는 이해를 해주시고 그 안에 실제 값이 있다는 것을 알아주시면 좋을 듯 합니다.
마지막으로 예제보면서 마무리하겠습니다.
간단한 예제
String a = "Car"
String b = "Bus"
String c = new String("Car");
String d = "Bus";
//아래 결과를 예측해주세요
a == c
a.equlas(c)
b == d
b.equals(d)
예제 정답
String a = "Car"
String b = "Bus"
String c = new String("Car");
String d = "Bus";
//아래 결과를 예측해주세요
a == c //false 주소지가 다르기 때문에
a.equlas(c) //true 알맹이가 같기 때문에
b == d //true 같은 주소지를 가리키기 때문에
b.equals(d) //true 알맹이 또한 같기 때문에
'자바&스프링' 카테고리의 다른 글
[자바] java 기본 타입와 wapper(래퍼) 클래스, 박싱과 언박싱 (0) | 2023.04.12 |
---|---|
[자바] java의 특징, 객체지향 언어의 특징 (0) | 2023.04.11 |
[자바] java에서 자주 쓰이는 문자열 함수 10가지 indexOf, substring, replace 등 (0) | 2023.04.08 |
[자바] java 가비지 컬렉터란? 장단점 (0) | 2023.04.07 |
[자바] java 람다식 작성하는 법 & 예제 (1) | 2022.12.19 |