JAVA

[JAVA] == 와 equals의 차이점

HJLIM 2021. 3. 11. 12:03

우선 ==는 객체의 주소값을 비교한다. 

 

예를들어 

 

String a = "java";

String b = a;

String c = new String("java"); 가 있다고 본다면 우선  

 

a == b의 결과는 true이다. 왜냐하면 ==는 주소값을 비교한다고 했는데 String b= a 라고 선언해놨기 때문이다.

그렇다면 a == c는 어떤 결과가 나올까 ? 결과는 false이다.

 

이유는 String a = "java"; 와 String c = new String("java"); 는 서로 저장되는 위치가 다르기 때문이다.

우선 우리가 자주 사용하는 String a = "java"와 같은 리터럴 방식은 Heap영역의 String constant pool이라는 리터럴 상수값을 저장하는 공간에 저장이되고

String c = new String("java");는 Heap영역에 저장이되기 때문에 서로 저장되는 주소값이 다르다.

 

즉!  a와 b는 같으므로 임의의 주소값 100을 할당받고 c는 임의의 주소값 200을 할당받아 

a=b //true 

a=c //false

b=c //false 라는 결과가 나오게 된다.

 

또한

 

String str1 = "hello";

String str2 = "hello"; 가 있다고 했을 때 

 

str1==str2는 어떤 결과가 나올까? 결과는 true이다.

==연산자는 주소값을 비교한다고 했는데 true라는 결과가 나온 이유는 String은 불변성(Immutable)이라는 성질을 가지고 있기 때문이다. 즉 같은 값의 문자열에 대해서는 단 하나의 문자열 객체만을 생성하도록 설계 되어있기 때문이다.

 

또한 Java의 Heap영역에는 String객체들을 관리하는 String pool이라는 영역이 있다. 이 String객체를 생성하면

String pool에 기존에 같은 값을 가지고 있는 String 객체가 있는지 검사를 한다. 만약 같은 값을 가진 객체가 있다면 그 객체의 참조값을 리턴하고 같은 값을 가진 객체가 없다면 새로운 String객체를 생성하고 그 참조값을 리턴한다.

 

다음은 equals이다.

equals는 객체의 내용, 즉 값을 비교하는 메서드이다.

 

아까와 같이 

String a = "java";

String b = a;

String c = new String("java"); 가 있다고 본다면

 

a.equals(b) // true  

a.equlas(c) // true

c.equals(b) // true

 

값은 모두 "java"로 동일하므로 eqauls()메서드로 비교했을 때 모두 true가 출력되는 것을 확인할 수 있다.

 

 

<결론>

 

*String은 불변성(immutable)속성을 가짐 ->  같은 값의 문자열에 대해서는 단 하나의 문자열 객체만을 생성

 

*String a = "hello" -> Heap영역의 String Constant Pool(리터럴 상수값을 저장하는 곳)에 저장

*String b = new String("world!") -> Heap영역에 저장

 

*== -> 객체의 주소값을 비교

*equals() -> 객체의 값(내용)을 비교