간단히 말해서,
equals 값 자체 비교
== 주소값 비교
1. String 변수 생성 방법 2가지
1) 리터럴 이용
→ Heap 영역 내 string constant pool에 존재
2) new 연산자 이용
→ Heap 영역에 존재
문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
변수는 스택 영역에 생성되고, 문자열 리터럴은 힙 영역에 String 객체로 생성된다. 그리고 변수들에는 String 객체의 번지 값이 저장된다.
new 연산자는 힙 영역에 새로운 객체를 만들 때 사용하는 연산자로, 객체 생성 연산자라고 한다.
new 연산자로 직접 String 객체를 생성하면 같은 문자열이라도 새로 객체가 만들어지고 객체의 번지가 다르므로 ==로 비교할 수 없다.
+
스트링을 리터럴로 선언할 경우, 내부적으로 스트링의 intern() 메서드가 호출된다.
intern() 메서드는 주어진 문자열이 string constant pool 에 존재하는지 검색하고, 있다면 그 주소값을 반환하고 없다면 string constant pool에 넣고 새로운 주소값 반환한다.

2. 기본 타입 vs 참조 타입(클래스)
기본 타입의 int, char 등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형태로 사용된다.
하지만 String은 일반적인 타입이 아니라 클래스이다.
클래스는 기본적으로 Call by Reference 형태로, 생성 시 주소값이 부여된다.
즉, String 타입을 선언하면 같은 값을 부여해도 서로 주소값이 다르다.
3. equals는 값 비교, ==는 주소값 비교


== 연산자는 참조 타입 변수들 간 연산에서 동일한 객체를 참조하는지 다른 객체를 참조하는지 알아볼 때 사용된다.
참조 타입 변수의 값은 힙 영역의 객체 주소이므로 결국 주소 값을 비교하는 것이 되기 때문이다.
String 클래스 안의 equals 메서드를 사용하면 두 비교 대상의 주소 값이 아닌 데이터 값을 비교하므로 String을 어떻게 생성하든 결과가 달라지지 않아 정확한 비교를 할 수 있다.
그렇기 때문에 자바에서 문자열을 비교하려면 equals 메서드를 사용해야 한다.
정리 잘 돼있는 글
출처 : https://coding-factory.tistory.com/536
참고 : 혼자 공부하는 자바
https://joonpyo-hong.tistory.com/entry/Java-equals%EC%99%80-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
'업무 > 공부' 카테고리의 다른 글
| [IntelliJ] serialVersionUID 생성 방법 (0) | 2022.12.26 |
|---|---|
| 리팩토링 주요 기법 + IntelliJ 단축키 (0) | 2022.12.19 |
| [IT] Third Party란? (0) | 2022.12.14 |
| [Spring] Swagger - REST API 개발 (0) | 2022.12.14 |
| [JavaScript] instanceof 클래스 확인하기 + typeof, {}.toString (0) | 2022.12.14 |