백엔드 개발자라면 대답해야 할 100가지 질문

3. equals와 ==의 차이점이 뭔지 아시나요?

ignuy 2023. 7. 19.

==과 equals는 둘 다 두 가지의 변수나 객체를 비교하며 다르면 false를, 같다면 true를 반환한다는 특징이 있다.

그렇다면 이 둘의 차이점은 무엇인가?

 

본질적인 차이 (메서드 vs 연산자)

equals는 Object 객체의 메서드이고 == 은 비교 연산자이다. 따라서 Object 객체를 상속받지 않는 primitive type변수들은 equals 메서드를 사용할 수 없다.

 

비교 대상 차이 (내용 vs 주소값)

equals는 비교하고자 하는 대상의 내용을 비교하고 == 는 비교하고자 하는 대상의 주소값을 비교한다.

String A = "Java";
String B = A;
String C = new String ("Java");

System.out.println(A == B);
System.out.println(A == C);
System.out.println(B == C);

/**
* true
* false
* false
*/

== 연산자는 비교하고자 하는 대상의 주소값을 비교한다고 앞서 설명했다. 따라서 a == c와 b == c의 결과는 false로 나오게 된다.

 

자바에서 String은 두가지 변수 할당 조건이 있다. String a와 같이 리터럴로 String을 선언하면 String Constant Pool 영역에 존재하고 String c와 같이 new 연산자를 통해 String을 선언하면 Pool 바깥의 Heap 영역에 존재하게 된다.

잠시 이야기가 String 선언으로 빠져나갔지만 본론으로 돌아와서 A의 주소값을 그대로 받은 BA와 같은 주소값을 가르키고 있다. C는 Constant Pool 바깥에 선언되어 다른 주소값을 가진다. 따라서 위 코드의 실행 결과는 주석과 같이 나오는 것이다.

 

반면 equals 는 주소값 비교가 아니라 값 비교라고 언급했다.

System.out.println(A.equals(B));
System.out.println(A.equals(C));
System.out.println(B.equals(C));

/**
* true
* true
* true
*/

따라서 위 코드의 결과같은 주석과 같게 된다.

댓글