-
[Camel][Java] StringBuilder와 StringBuffer 클래스Java/개념 정리 2020. 2. 19. 15:13
StringBuilder & StringBuffer 클래스
이전 포스팅에서 다뤘던 String 클래스는 값의 변경이 불가능한 문자열의 표현을 위한 클래스였습니다. 그렇다면 문자열은 값의 변경을 할 수 있는 방법이 정말 없는 것일까? 이번 포스팅에서 다룰 StringBuilder와 StringBuffer 클래스가 바로 값의 변경이 가능한 문자열의 표현을 위한 클래스입니다.
하지만 StringBuffer와 StringBuilder 의 인스턴스는 문자열이라 하지 않는다는 점!
StringBuilder 클래스란?
StringBuilder 클래스는 문자열의 저장 및 변경을 위한 메모리 공간을 내부에 가지고 있습니다. 이 메모리 공간은 크기가 자동으로 조절된다는 특징이 있습니다.
하지만 크기를 수동으로 조절하고 싶다면 조절이 가능합니다. 바로 오버로딩된 다양한 생성자를 활용하는 방법입니다.
가장 많이 사용하는 대표적인 StringBuilder의 생성자는 다음 3가지입니다.
public StringBuilder (); // 16개의 문자를 저장할 수 있는 저장공간을 생성한다. public StringBuilder (int n); // n개의 문자를 저장할 수 있는 저장공간을 생성한다. public StringBuilder (String str); // (str.length()+16)개의 문자를 저장할 수 있는 저장공간을 생성한다.
위와 같은 다양한 크기로의 저장공간 생성방법이 존재하는 이유는 저장공간의 크기를 확장하는 작업은 많은 연산을 요구하기 때문에 성능저하를 불러올 수 있습니다. 따라서 이왕이면 처음에 미리 필요한만큼의 저장공간을 생선한다면 과다한 연산으로 인한 성능저하를 막을 수 있습니다.
다음은 StringBuilder 클래스에서 가장 빈번하게 쓰이고 중요한 메소드인 append와 insert 메소드에 대해 설명하겠습니다.
public StringBuilder append ( ... ... )
append 메소드는 전달된 인자를 StringBuilder 인스턴스가 저장하고 있는 문자열 데이터의 맨 뒤에 문자의 형태로 추가하는 메소드입니다.
이 메소드에서 주목해야할 점은 바로 반환형입니다. 반환형이 클래스의 이름과 동일한 StringBuilder인 것을 확인할 수 있습니다. 이러한 점 때문에 아래 코드에서 처럼 연이은 메소드의 호출이 가능하게 되는 것입니다.
class BuildString { public static void main (String[] args) { StringBuilder strBld = new StringBuilder("Camel"); strBld.append('M'); strBld.append(183).append("Animal"); System.out.println(strBld); // "CamelM183Animal"을 출력한다. } }
또한, append 메소드는 String 클래스의 valueOf 메소드와 마찬가지로 다양한 타입의 인자에 대해 오버로딩이 되어 있습니다. 그렇기 때문에 char형이나 int형과 같은 다양한 타입의 인자를 사용할 수 있습니다.
public StringBuilder insert ( int offset , ... ... )
insert 메소드와 append 메소드의 차이점은 insert라는 영어단어의 뜻만 안다면 바로 알아차릴 수 있습니다. 사용자가 원하는 위치에 원하는 데이터를 삽입하는 것입니다. insert 메소드의 첫번째 인자는 int형으로 두 번째 인자를 저장하고자하는 위치를 의미하며, 이를 통해 데이터의 삽입이 원하는 위치를 지정할 수 있습니다.
class BuildString2 { public static void main (String[] args) { StringBuilder strBld = new StringBuilder("Camel"); // 첫번째 인자 0은 StringBuilder 인스턴스의 맨 앞을 의미한다. strBld.insert(0,'M'); // strBld.length()는 StringBulider에 의해 생성된 저장공간의 크기가 아닌 // 저장된 문자의 개수를 반환한다. 따라서 아래의 코드는 strBld.append(183)과 같은 동작을 수행한다. strBld.insert(strBld.length(), 183); System.out.println(strBld); } }
StringBuffer 클래스란? 그리고 둘의 차이점은?
StringBuffer 클래서는 StringBuilder 클래스가 제공하는 메소드는 동일합니다. 메소드의 수, 기능, 이름, 매개변수 형 모두 동일합니다.
그렇다면 왜 StringBuilder와 StringBuffer 두가지로 분리되어 존재하는 것일까?
두 클래스에는 큰 차이점이 존재하기 때문입니다. 그것은 동기화 여부입니다.
StringBuffer는 Thread에 안전하다고 할 수 있지만 StringBuilder는 Thread에 안전하지 못하다는 것입니다. StringBuffer는 메소드별로 Synchronized Keyword가 존재하여, 멀티 Thread 환경에서도 동기화를 지원합니다. 반면에 StringBuilder는 동기화를 보장하지 않습니다.
그렇기때문에 멀티 Thread 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고, 단일 Thread 환경이라면 StringBuilder를 사용하는 것이 좋습니다. 단일 Thread환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 좋은 성능을 기대할 수 없습니다.
'Java > 개념 정리' 카테고리의 다른 글
[Camel][Java] Multi-Dimensional Array(다차원배열) feat. 2차원배열 (0) 2020.02.19 [Camel][Java] Array ( 배열 ) (0) 2020.02.19 [Camel][Java] Console Input - 콘솔 입력 (Scanner) (0) 2020.02.19 [Camel][Java] String 클래스의 다양하고 유용한 함수(Method) (0) 2020.02.18 [Camel][Java] String 클래스에 대해서 (0) 2020.02.18