해당 포스트 작성의 목적
String의 '==' 동등비교연산자의 동작원리에 대해서 알아본다.
리터럴 생성과 new연산자로 생성한 객체들에 대해서 '=='연산자를 사용할때, 결과가 어떤지, 동작을 어떻게 하는지에 대해서 알아본다. 이미 'equals()와 =='를 통해 알아본적 있으나, 중요한 내용이므로 복습 겸 알아보도록 하자.
== 연산이란?
동등비교연산자로써, 비교하는 두 변수가 동일한지 true와 false로 반환해주는 연산자이다.
이때 두 변수가 기본자료형이라면 변수의 값을 비교, true/false로 알려주지만, 해당 변수의 타입이 참조 자료형이라면 해당 변수에 할당된
객체의 주소값을 비교하게된다. 즉, 참조자료형의 값을 비교할때는 '==' 연산자를 쓰는것은 옳지 못하다.
String에서의 '==' 연산
그렇다면 String에서의 '==' 연산은 무엇이 다를까?? 기본적으로 String도 참조자료형인데, 다른점이 있을까??
String Pool의 존재
String은 여타 다른 참조자료형과 달리 new연산자 외에도, 객체를 생성할 수 있는 방법이 한가지 더있다. 그것은 마치 기본자료형처럼 '='할당 연산자를 통해 바로 값을 할당 할수있는
리터럴생성이 있다. 그리고 이렇게 각기 다른 방식으로 생성된 String객체들은 저장되는 공간또한 달라진다.
그중 리터럴 생성으로 만들어진 객체가 저장되는 공간이 바로 String Pool 인것이다.
String Pool은 힙 메모리에 위치하고 있다. (new연산 역시 힙메모리에 객체가 생성되지만,
String Pool에 저장되지는 않는다. 즉 힙 메모리에 같이 위치하고 있지만, 별개의 공간에 저장된다.)
String의 리터럴 생성
String을 = 연산자로 리터럴생성시, 내부적으로 intern()메소드를 호출하게 된다.
intern()메소드는 해당 메소드를 사용한 String객체의 값을
String Pool에서 검색하고,
존재하면 해당 문자열의 주소값을 반환, 존재하지 않으면 String Pool에 그 값을 생성하고
새로운 주소값을 할당하여 반환한다. 즉, 리터럴생성으로 동일한 값의 두 String을 생성한다면, 값만 같은 서로다른 객체를 생성하는 것이 아니라, String Pool 내부에 존재하는 객체의 주소값을 할당 받게 되는 것이다.
String a = "string";
String b = "string";
if(a==b){
System.out.println("a==b");
}
/*
a==b
*/
그렇다면 String의 리터럴생성과 String Pool의 존재가 '==' 연산시 어떻게 영향을 미치는지 알아보자
리터럴 생성과 new생성의 '=='비교
String a0 = new String("a");
String a1 = "a";
String a2 = "a";
String a3 = a0;
if(a0==a1){
System.out.println("a0==a1");
}
if(a1==a2){
System.out.println("a1==a2");
}
if(a0==a3){
System.out.println("a0==a3");
}
if(a0.intern()==a1){
System.out.println("a0.intern()==a1");
}
/*
a1==a2
a0==a3
a0.intern()==a1
*/
new연산으로 생성한 a0은 a1과 값이 같음에도 불구하고, false가 나온다. StringPool에 생성된 객체와 다른 객체의 주소값을 갖고 있기 때문이다. 그러나 intern()메소드로 StringPool에 저장된 객체의 주소값을 할당 받자 true를 반환 하는 것을 볼 수있다.
포스트 작성으로 알게된점
리터럴생성과 new연산자의 생성시 차이점에 대해서는 이미 알고있었으나, 리터럴생성시 내부적으로 intern()메소드를 호출한다는 사실은 미처 알지못했다. 이렇게 알고있던 내용도 다시한번 복습하면서 빠트린 부분을 주워가니 좋은것 같다.
References
자바의 String 객체와 String 리터럴
String Constant Pool의 이해
'프로그래밍 > Java' 카테고리의 다른 글
클래스 안의 클래스-1 (0) | 2021.05.13 |
---|---|
JVM이란 무엇인가 (0) | 2021.05.13 |
equals() 와 == (0) | 2021.05.12 |
Buffer VS Cache (0) | 2021.05.12 |
캐시는 어느영역에서 사용되나? (0) | 2021.05.11 |
Uploaded by Notion2Tistory v1.1.0