-
Java의 ==, equals 연산자를 통한 문자열 비교Programming/Java 2022. 2. 27. 10:39
Stack 영역
- 함수 호출 시 각각이 Call stack에 쌓이며 함수 내에서의 변수와 포인터 등이 저장되는 영역으로, 함수 종료 시 다같이 해제되며 사라진다.
Heap 영역
- 할당되어 사용되는 것들이 메모리에 쌓이는 영역으로, 프로그래머가 할당/해제 관리한다.
- C계열에서는 잘 관리하는 것이 필요하고, Java에서는 참조가 끊어진 할당 객체들이 쌓이면 Garbage Collector가 동작하여 수거하고 메모리 해제를 해준다.
Constant Pool
- Method Area(클래스 파일 정보 저장 위치)에 속하고, 상수 자료형을 저장해두고, 동일한 값의 중복을 막아 메모리 낭비를 방지한다.
- 즉, 이미 있는 값이 들어오면 새로 만들지 않고 먼저 들어있던 같은 값의 주소를 같이 참조하게 한다.
Java에서의 String 생성과 비교 방식
# String 생성
String ex1 = "hello"; // A String ex2 = new String("hello"); // B
위 코드에서처럼 문자열의 생성 방식에 따라 할당되는 위치가 다르다.
A의 경우, 런타임 데이터 영역의 Constant Pool에 저장되어 == 연산자로 비교 가능하다.
B의 경우, 런타임 데이터 영역의 Heap에 저장되어 equals 함수로 비교한다.
# String 비교
== 연산자 : 주소 값을 비교
equals 함수 : 값 자체를 비교
String ex1 = "hello"; // A String ex2 = new String("hello"); // B System.out.println(ex1 == "hello"); // true System.out.println(ex2.equals("hello")); // true
== 연산자는 주소 값을 비교하므로, 위의 예제에서처럼 Constant Pool에 할당된 리터럴 방식의 문자열 비교 시 같은 값의 주소를 참조하기 때문에 == 연산자로 비교가 가능하다.
equals 함수는 값 자체를 비교하므로, 위의 예제에서처럼 Heap에 할당된 문자열 객체의 문자열 값이 같은지 확인한다.
'Programming > Java' 카테고리의 다른 글
JVM 구조 (0) 2022.02.19 Java 활용 포켓몬 게임 (0) 2022.01.30 [Java] 예외(Exception) (0) 2021.05.19