📌== 연산자
== 연산자는 int, boolean과 같은primitive type에 대해서는 값을 비교한다. reference type에 대해서는 주소 값을 비교한다. 사실 primitive type도 Constant Pool에 있는 특정 상수를 참조하는 것이기 때문에 결국 주소 값을 비교하는 것으로 볼 수 있다. 같은 상수를 참조하면 주소 값이 같으니 결국 같은 값이면 동일하다고 판단할 수 있다.
리터럴(literal)을 사용해서 값을 생성하면 Constant Pool 영역에 존재하고,
new연산자를 통해값을 생성하면 Heap 영역에 존재하게 된다.
👉 Constant Pool 이란?
- 런타임에 생성되는 static 상수 저장소이고, Constant Pool 객체에 저장된다.
- Constant Pool 은 정적 영역에 있는 메모리이기에 GC (Garbage Collector) 의 대상이 아니다.
👉 리터럴 (literal) 이란?
- 상수와 리터럴을 헷갈리 수 있는데, 리터럴도 상수의 일종이지만, 말 그대로 선언없이 바로 사용할 수 있는, 문자 그대로의(=리터럴한) 상수를 의미한다. immediate value 라고 하기도 한다.
📌 equals()
String 클래스의 equals() 메소드는 비교하고자 하는 두개의 대상의 객체의 값 자체를 비교한다.
📌 코드
A와 B는 String Constant Pool 영역에 만들어진 하나의 객체를 참조하고,
C와 D는 Heap 영역에 각각 개별의 객체가 생성된다.
A와 B 1개 + C와 D 2개 = 3개의 String 객체 생성
📌 결과
A 와 B는 같은 주소값 (같은 영역의 같은 객체)
B 와 C는 다른 주소값 (Constant Pool 영역, Heep 영역)
C 와 D 는 다른 주소값 (각각 Heep 영역의 다른 객체)
'Java' 카테고리의 다른 글
[Java] 객체지향 5원칙 SOLID (0) | 2022.05.24 |
---|---|
[Java] static, final, static final (0) | 2022.05.13 |
[Java] toCharArray(), charAt() (0) | 2022.01.25 |
[Java] Checked Exception, Unchecked Exception (0) | 2022.01.24 |
[Java] 멀티 catch 블록 (0) | 2022.01.19 |