이번 포스팅은 String대해 포스팅하려고 합니다.
알고리즘을 풀다보면, 연산 속도 때문에 String을 +
를 사용해서 문자열을 연결하기 보다 StringBuilder를 사용하곤 합니다.
그래서, 이러한 이유를 알아 보기위해 먼저 String에 대해 공부하며 포스팅하려고 합니다!
먼저, String에 대해서 살펴보면, String 클래스는 불변 객체
라는 것을 알고 있으셔야 합니다!
그리고,String 변수를 만드는 방법은 2가지가 있습니다.
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()이 자동으로 호출됩니다.
그래서 참조값에 위치한 문자열의 값을 문자열로 변환해 출력해줍니다.
그렇다면, 위 두 방법의 차이는 무엇일까요??
String str1 = "test";
String str2 = "test";
System.out.println(str1==str2); //true
str1
), JVM은 새로운 객체를 생성하고 Heap 메모리 영역에 String Constant Pool
영역에 저장되고 불변 객체로 남습니다.String Constant Pool
에서 같은 값을 가지고 있는지 찾고, 동일한 값이 존재하면 같은 인스턴스의 참조값을 str2
에 할당합니다.String str1 = new String("test");
String str2 = new String("test");
System.out.println(str1==str2); //false
String Constant Pool
에 추가되지 않습니다.결론적으로, 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