자바의 문자열클래스에는 String뿐만이 아니라, StringBuffer,StringBuilder이 있다.
String 객체는 한번 생성되면 메모리 공간이 변하지 않는다. +
연산자또는 concat
메소즈응 통해 문자열을 변경해도 문자열에 값이 변경되는 것이 아닌 새로운 문자열이 할당되는 것이다.
따라서 값을 변경하거나 생성할 때마다 메모리가 낭비된다. 문자열 연산이 많은 경우에 코드의 성능에 문제가 생긴다.
➕ String의 생성방법
문자열을 바로 대입하는 경우는 만들어진 문자열의 주소를 가지지만, new
생성자를 이용하면 상수풀에 새로운 문자열을 생성한 뒤 대입하게 된다.
String str = "text";
String str_new = new String("text");
// 각각의 인스턴스 주소는 다르다.
➕ String의 문자열이 변하지 않는 이유
final char[] 배열을 사용하기 때문에 변경할 수 없다.
변경가능한 char[]을 가지기 때문에 문자열을 변경하거나 연장할때 기존 메모리를 사용한다. 따라서 메모리 공간 낭비를 줄일 수 있다. 또한 속도도 String보다 빠르다.
각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원한다.
변경가능한 char[]을 가지기 때문에 문자열을 변경하거나 연장할때 기존 메모리를 사용한다. 따라서 메모리 공간 낭비를 줄일 수 있다. 또한 속도도 String보다 빠르다.
StringBuilder는 동기화를 보장하지 않는다.
🙆짧은 문자열이면 👉 String
🙆멀티 스레드 환경이라면, 스레드에 안전해야한다면 👉 StringBuffer
🙆멀티스레드 프로그램이 아니라면 👉 StringBuilde : 가장 빠르다.
.toString
메소드를 이용하면 된다.
그러면 코테에서는 StringBuilder를 아용해야하나?💭