본문 바로가기

Programming

Java의 equals, == 연산자와 String의 비교, JVM의 Heap 과 Constant Pool, Stack 등..

간략한 Java의 메모리 할당 영역을 살펴본다.

 

아래 그림의 JVM 윗부분 전체는 Runtime Data 영역에 포함된다. (Runtime Data Areas)

 

 

- Stack 영역 은 함수 호출 시 각각이 Call stack에 쌓이며 함수 내에서의 변수와 포인터 등이 저장되는 영역으로, 함수 종료 시 다같이 해제되며 사라짐.

 

- Heap 영역 은 할당되어 사용되는 것들이 메모리에 쌓이는 영역. 프로그래머가 할당/해제 관리함. C계열에서는 잘 관리하는 것이 필요하고, Java에서는 레퍼런스가 끊어진 할당 객체들이 쌓이면 Garbage Collector가 동작하여 수거하고 메모리 해제를 해준다.

 

- Constant Pool Method Area(클래스 파일 정보 저장 위치)에 속하고, 상수 자료형을 저장해두고, 동일한 값의 중복을 막아 메모리 낭비를 방지한다. 즉, 이미 있는 값이 들어오면 새로 만들지 않고 먼저 들어있던 같은 값의 주소를 같이 참조하게 한다.

 

이제 String 객체의 생성 방식과 비교 방식에 대해서 본다.

String tempString1 = “”;                      // 1.

String tempString2 = new String(“”);       // 2.

 

1, 2번 생성 방식에 따라서 할당되는 위치가 다르다.

- 1번의 경우에는 위의 Contant Pool에 저장되어 == 연산자(operator)로 비교한다.

- 2번의 경우에는 위의 Heap영역에 저장되어 equals 함수로 비교한다.

 

 

다시, == equals 각각 비교하는 방법에서 차이가 나는 이유를 알아본다.

- == 연산자는 주소 값을 비교하고,

- equals 함수는 값 자체를 비교한다.

 

즉, == 연산자는 Constant Pool에 할당된 문자열은 같다고 하겠지만, Heap에 할당된 문자열은 다르다고 할 수 있다.

equals는 Heap에 할당된 문자열 값이 같은지 확인한다.

 

 우리는 보통 String 의 문자열 값이 같은지를 알고 싶다.

따라서 문자열 객체 String을 비교할 때 보통 equals를 쓰는 이유가 되겠다.