반응형
String 문자열 생성 방식
String str1 = new String("Hello");
String str2 = "Hello";
String str3 = "Hello";
1. new 이용한 문자열 생성
2. 문자열 리터럴 생성
두 방식의 차이점
두 방식의 가장 큰 차이점은 메모리 영역에 있다.
new 연산자를 통해 String을 생성하면 Heap 영역에 존재하게 되고, 리터럴을 이용할 경우 string constant pool이라는 영역에 존재하게 된다. (아래 그림 참고)
똑같은 "Hello" 문자열을 사용하는 데 변수 str2 와 str3은 같은 객체를 바라보지만 new String으로 생성한 str1은 다른 메모리 주소의 객체를 바라보는 것이다.
문자열을 비교해보면,
String str1 = new String("Hello");
String str2 = "Hello";
String str3 = "Hello";
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // false
System.out.println(str2 == str3); // true
str1과 str2는 두 변수가 가리키는 객체의 문자열은 "Hello" 인데, 왜 == 연산의 경우 false가 나오는 걸까?
equals 연산자는 단순 문자열을 비교한다면, == 연산자는 두 객체의 주소값을 비교하기 때문에
new 연산자를 통해 Heap 영역에 생성된 String str1과 리터럴을 이용해 String constant Pool 영역에 위치한 String str2과의 주소값은 같을 수가 없는 것이다 !
참고로 Java6까지 string constant pool의 위치는 Perm 영역이었다. Perm 영역에 위치하였던 게 Java7에서 Heap 영역으로 변경되었다.
728x90
반응형
'JVM > Java' 카테고리의 다른 글
[Error] DB Connection 종료 에러 해결: No operations allowed after statement closed (2) | 2019.10.24 |
---|---|
[Java] StringBuffer append("a"+"b") 메모리는 어떻게 할당될까? (0) | 2019.08.01 |
[Java] String, StringBuffer, StringBuilder의 차이점 스윽 (0) | 2019.07.30 |
[Java] JAXB 활용한 Java 객체의 XML 변환 방법 (0) | 2019.07.09 |
[Java] 개발자라면 꼭 필요한 로그관리! Logger 사용 및 log4j2.xml 설정 방법 (0) | 2019.06.22 |
댓글