본문 바로가기
Java/Java Story

[Java] String 객체 생성 2가지 방식의 차이점 (new String vs "")

by 잭피 2020. 9. 6.

 

안녕하세요~ 잭코딩입니다!

new String("") vs ""

이번 내용에서는 String 객체를 생성하는 2가지 방식과 그 차이점을 설명하겠습니다

String은 다른 일반 객체와 달리 Heap 영역 안에 String Pool 영역에서도 관리해주는데,

그와 관련된 내용을 정리해볼게요!


평소에 String으로 객체를 생성할 때, 

String name = "jackcoding"

단순히 이렇게 ""(큰 따옴표)로 생성했다.

 

그런데 이펙티브자바 ITEM6을 공부하면서,

new String("jackcoding") 이렇게 생성하면 성능에 좋지 않다는 내용을 봤다.

""로 생성하면 한번만 객체가 생성되지만, new로 생성하면 객체가 계속 생성된다고 한다

https://jackjeong.tistory.com/12'

 

[이펙티브자바 3판] ITEM6. 불필요한 객체 생성을 피하라

이번장의 핵심은... 기존 객체를 재사용해야 한다면 새로운 객체를 만들지 말자 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다 특히, 불변 객체는 언��

jackjeong.tistory.com

조금 더 자세히 알아보았다

 

우선, Java의 String은 Immutable Class (불변 클래스)이고, 

기본 타입(Primitive Type)이 아닌 참조 타입(Reference Type)이다.

이와 관련된 내용은 나중에 포스팅하겠다.

 

따라서 String의 값은 Stack Memory 영역이 아닌 Heap Memory 영역에 저장이 된다.

그런데 String은 다른 객체들과 달리 조금 특별한 클래스이다.

String은 Heap Memory 영역에 String Pool 이라는 영역을 따로 두어 그곳에 저장한다 (Java 7이상)

(Java 7 이전에는 Perm 영역에서 관리됨)

 

한번 코드와 그림을 보며 이해해보자

String s1 = "jackCoding";
String s2 = "jackCoding";
String s3 = new String("jackCoding");
String s4 = new String("jackCoding");
System.out.println(System.identityHashCode(s1)); // 1854778591
System.out.println(System.identityHashCode(s2)); // 1854778591
System.out.println(System.identityHashCode(s3)); // 2054798982
System.out.println(System.identityHashCode(s4)); // 885951223

s1, s2처럼 큰 따옴표로 String 객체를 생성하면, 

먼저 String pool에 같은 값이 있는지 확인하고 있으면 그 주소값을 리턴하고,

없다면 새로운 객체를 만들어 String pool에 할당한 뒤 그 주소값을 리턴한다

 

s3, s4처럼 new로 생성하면,

다른 객체들처럼 강제로 Heap 영역에 생성하고 그 주소값을 리턴한다.

그런데, 다른 객체들과 다른 점이 하나 있다.

만약 "jackCoding"이 String pool에 없었다면,

String pool 영역에 1개, heap 영역에 1개 총 2개의 객체를 생성한다.

위에는 이미 "jackCoding"이라는 값을 가진 객체가 String pool에 있기 때문에 heap 영역에만 생성되었다

(참고 : new로 생성한 String 객체에서 intern() 메소드를 사용하면 String pool에서 같은 값을 갖는 메모리를 가져올 수 있다)

 

 

댓글