DEV ℧ Developer Diary

[Java] String Class에 대해서

String 클래스

기존의 다른 언어에서는 문자열을 char형의 배열로 다루었다.

자바에서는 문자열을 위한 String클래스를 제공한다. 변경 불가능한(immutable) 클래스 String클래스에는 문자열을 저장하기 위해서 문자열 배열 변수(char[]) value를 인스턴스 변수로 정의해놓고 있다. 인스턴스 생성시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수(value)에 문자형 배열(char[])로 저장되는 것이다.

한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다.

덧셈 연산자로 연산시마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리 공간을 차지하게 되므로 가능한 결합횟수를 줄이는 것이 좋다.

문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우는 String클래스 대신 StringBuffer클래스를 사용 하는 것이 좋다.

StringBuffer 클래스

StringBuffer클래스의 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.

StringBuffer인스턴스를 생성할 때는 생성자 StringBuffer(int length)를 사용해서 저장될 문자열의 길이를 고려하여 충분한 크기로 지정하는 것이 좋다. 버퍼의 크기를 지정해주지 않으면 15개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.

toString()를 오버라이딩 하기 때문에 StringBuffer인스턴스에 toString()을 호출하면 담고있는 문자열을 String으로 반환한다.

StringBuilder 클래스

StringBuffer는 멀티쓰레드에 안전하도록 동기화 되어있다. 아직은 멀티쓰레드나 동기화에 대해서 배우지 않았지만 동기화가 StringBuffer의 성능을 떨어뜨린다는 것만 이해하면 된다.

멀티쓰레드로 작성된 프로그래밍이 아닌경우, StringBuffer의 동기화는 불필요하게 성능만 떨어뜨리게 된다.

StringBuilder는 StringBuffer에서 쓰레드 동기화만 뺀 나머지는 똑같은 기능으로 작성되어있기 때문에, 타입의 참조변수를 선언한 부분과 StringBuffer의 생성자만 바꾸면 코드가 알아서 돌아간다.

하지만 StringBuffer도 충분이 성능이 좋기 때문에 성능 향상이 반드시 필요한 경우를 제외하고는 기존에 작성한 코드에서 StringBuffer를 StringBuilder로 굳이 바꿀 필요는 없다.