String에 대하여 살짝 깊게 알아보자

Choizz·2023년 3월 20일
0

Java

목록 보기
3/11

이번 포스팅은 String대해 포스팅하려고 합니다.
알고리즘을 풀다보면, 연산 속도 때문에 String을 +를 사용해서 문자열을 연결하기 보다 StringBuilder를 사용하곤 합니다.
그래서, 이러한 이유를 알아 보기위해 먼저 String에 대해 공부하며 포스팅하려고 합니다!


String

먼저, String에 대해서 살펴보면, String 클래스는 불변 객체라는 것을 알고 있으셔야 합니다!

String 객체 생성 방법

그리고,String 변수를 만드는 방법은 2가지가 있습니다.

  • 방법 1: 리터럴 값을 직접 변수에 할당하는 방법
  • 방법 2: new 생성자를 통해 인스턴스를 생성하는 방법
String str1 = "test"; // 방법 1
String str2 = new String("test); // 방법 2

System.out.println(str1); //test
System.out.println(str2); //test

str1, str2 변수는 리터럴의 메모리상 주소값을 저장하고있습니다.
그런데 위 변수를 출력해보면, 메모리 참조값이 아닌, 문자열이 출력됩니다.
왜냐하면, String 타입의 변수를 참조하게 되면, String의 메서드인 toString()이 자동으로 호출됩니다.
그래서 참조값에 위치한 문자열의 값을 문자열로 변환해 출력해줍니다.

그렇다면, 위 두 방법의 차이는 무엇일까요??

리터럴 사용 vs new 생성자

리터럴 사용

String str1 = "test";
String str2 = "test";

System.out.println(str1==str2); //true
  • String 객체가 리터럴을 사용해서 생성되면(str1), JVM은 새로운 객체를 생성하고 Heap 메모리 영역에 String Constant Pool 영역에 저장되고 불변 객체로 남습니다.
  • 그리고 동일한 리터럴을 str2에 선언하는 경우, JVM은 새로운 객체를 만들지 않고, String Constant Pool에서 같은 값을 가지고 있는지 찾고, 동일한 값이 존재하면 같은 인스턴스의 참조값을 str2에 할당합니다.
  • 그래서 동일성 검사(==)를 할 시 true가 리턴되게 됩니다. 같은 메모리 주소값을 참조하기 때문이죠!
  • 이렇게 이미 존재하는 값을 사용함으로써, 메모리를 더 효율적으로 사용합니다.

new 생성자 사용

String str1 = new String("test");
String str2 = new String("test");

System.out.println(str1==str2); //false
  • new 생성자를 통해 String 객체를 만들게 되면 Heap 메모리에 인스턴스로 저장됩니다. 그러나 String Constant Pool에 추가되지 않습니다.
  • str1과 str2가 각각 다른 인스턴스 메모리 주소값을 가지고 있는 것입니다. 그냥 일반 객체 인스턴스와 비슷한 것이죠!
  • 그래서 동일성 검사를 할 시 false가 리턴됩니다. 다른 메모리 주소값을 참조하기 때문이죠!

결론적으로, String 객체를 생성할 때는, 리터럴 방식을 사용하는 것이 권장됩니다!

+ 연산자 사용

앞서 언급한 것 처럼, String 객체는 리터럴 방식으로 생성되든, new 방식으로 생성하든 불변 객체입니다.

 String str = "test";

 for (int i = 0; i < 5; i++) {
      String old = str;//이전 문자열
      str = str + i; //새로운 문자열
      
      System.out.println(str);
      System.out.println(old == str);
 }
 
 // 출력 결과
test0
false
test01
false
test012
false
test0123
false
test01234
false

위 코드 처럼 +를 사용해서 문자열을 늘려가는 것은 매번 문자열을 늘려갈 때 마다 새로운 객체를 생성하는 것 입니다.
따라서, + 연산자를 여러 번 사용하여 문자열을 늘려가는 것은 비효율적일 것 입니다.

그래서, StringBuilder라는 클래스를 사용하여 문자열을 늘려나가는 것을 추천합니다!(제가 아니고, 인텔리제이에서 추천해줍니다.)

StringBuiler에 대해서는 다음 포스팅에서 정리해 보겠습니다!!


Reference

profile
집중

0개의 댓글