자바에서 문자열은 String이라는 타입을 사용하는데,
String은 데이터 타입이 아니라 클래스이다. (기본형이 아닌 참조형 변수로 분류)
그러나 String은 참조형 타입이지만, 기본형처럼 값을 직접 할당해서 사용할 수 있다.
즉, String에 값을 할당하는 방법은 2가지가 존재한다.
String str = new String("JAVA"); // 생성자를 통한 참조형
String str = "JAVA"; // 기본 자료형처럼 직접 할당
후자와 같이 data를 할당 시 JVM 메모리 상수풀이라는 곳에 "JAVA" 라는 값을 str에 할당한다.
따라서
String str01 = "JAVA";
String str02 = "JAVA";
로 모두 JAVA라는 값을 할당 받았을 때,
같은 주소 값을 가지고 있다.
str01이 JVM 상수풀 메모리 공간에 이미 JAVA를 할당 받고 있었고,
str02는 새로 메모리를 생성하지 않고 str01이 가리키고 있는 JAVA를 같이 가리키게 되기 때문이다.
하지만 다음과 같은 경우는 다르다.
String str01 = new String("JAVA");
String str02 = "JAVA";
str01은 JVM 안에 있는 heap 영역에 인스턴스가 생성되고 JAVA라는 값을 가지고 있다. 주소값을 새로 할당 받는다.
하지만 .str02는 JVM 안에 상수풀 안에 있는 메모리에 JAVA를 만들고 그 메모리 주소를 가리키고 있다.
따라서 둘은 data 값이 같더라도 데이터를 가리키고 있는 주소 값이 다르다.
== 비교연산자
== 비교연산자는 문자열 데이터 값을 비교하는 것이 아닌
주소 값을 비교한다.
따라서 str01 == str02는 false다.
equals() 메서드
equals는 주소 값이 아닌 data를 비교한다.
따라서 str01.equals(str02)는 true다.
'Languages > Java' 카테고리의 다른 글
[Java] try-with-resources 예외 처리 (0) | 2024.08.22 |
---|---|
[Java] Scanner vs BufferedReader 사용자 입력 받기 (0) | 2024.08.08 |
[Java] 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy) (0) | 2024.06.28 |
[Java] 자바는 컴파일 언어? 인터프리터 언어? (0) | 2024.06.27 |