본문 바로가기

Java

[Java] == 연산자 & equals() 차이점

📌== 연산자

== 연산자는 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