336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
실제 String 객체는 불변으로 String 객체의 문자열은 변경되지 않는다. String 객체의 경우 객체의 문자열이 변경되는 것처럼 보이지만 실제로는 변경된 문자열을 가진 새로운 String 객체가 반환되는 것이다. 그러므로 String 객체의 문자열을 자주 변경하게 되면 지속적으로 새로운 String 객체를 생성하기 때문에 리소스를 생각보다 많이 낭비하게 된다. 그래서 자바에서는 비효율적인 String 객체를 대신 할 수 있는 java.lang.StringBuffer와 java.lang.StringBuilder를 제공한다. StringBuilder클래스는 속도가 StringBuffer 보다는 빠르지만 명시적인 동기화(explicit syncronization)없이는 다중 스레드 컨택스트에서는 사용할 수 없다.
StringBuffer 객체를 초기화하고 문자열 버퍼를 다루는 StringBuffer에 포함되어 있는 자주 사용되는 생성자와 메소드를 소개한다.StringBuilder의 생성자와 메소드는 StringBuffer와 동일하다.
-----------------------------------------------------------------------------------------
StringBuffer()
기본적으로 16개의 문자를 저장할 수 있는 빈 배열로 StringBuffer 객체를 초기화 한다.
StringBuffer( int capacity)
인자 capacity에 지정한 크기의 문자를 저장할 수 있는 빈 배열로 StringBuffer객체를 초기화 한다. capacity의 값이 음수이면 java.lang.NegativeArraySizeException이 던져진다
StringBuffer( String s )
인자 s의 문자들을 갖는 배열로 StringBuffer 객체를 초기화한다. 객체의 기본 저장 크기인 16에 s의 길이가 더해진 배열이 만들어지는데 s가 null 이면 생성자에서 NullPointException을 던진다.
StringBuffer append( boolean b )
인자 b가 true이면 StringBuffer 객체의 배열에 문자열 "true"가 추가되고, 인자 b가 false이면 문자열 "false"를 추가한 후 추가된 StringBuffer객체를 반환한다.
StringBuffer append( char ch )
StringBuffer 객체의 배열에 인자 ch의 문자를 추가하고 추가된 StringBuffer 객체를 반환한다.
StringBuffer append( char[] chars )
StringBuffer 객체의 배열에 인자 chars 배열에 있는 문자들을 추가하고 추가된 StringBuffer 객체를 반환한다. 인자 char이 null이면 NullPointerException을 던진다.
StringBuffer append( double d )
StringBuffer 객체에 d의 배정밀도 부동 소수점 값을 문자열로 변경한 후 추가된 StringBuffer객체를 반환한다.
StringBuffer append( float f )
StringBuffer 객체의 배열에 인자 f의 부동 소수점 값을 문자열로 변경하여 추가한 후 추가된 StringBuffer객체를 반환한다.
StringBuffer append( int i )
StringBuffer 객체의 배열에 인자 i의 정수값을 문자열로 변경하여 추가한 후 추가된 StringBuffer 객체를 반환한다.
StringBuffer append( long l )
StringBuffer 객체의 배열에 인자 l의 배정수 값을 문자열로 변경하여 추가한 후 추가된 StringBuffer 객체를 반환한다.
StringBuffer append( Object obj )
StringBuffer 객체의 배열에 인자 obj의 toString() 메소드를 호출하여 반환된 문자열의 문자들을 추가한다. 만약 obj에서 null이 반환되면 "null" 이 StringBuffer 객체의 배열에 추가가 된다. 추가된 StringBuffer 객체를 반환한다.
StringBuffer append( String s )
StringBuffer 객체의 배열에 인자 s의 문자열을 추가한다. 만일 인자 s의 값이 null이면 "null"이 배열에 추가되고 추가된 StringBuffer 객체가 반환된다.
int capacity()
StringBuffer 객체의 배열에 저장 할 수 있는 문자의 수를 반환한다.
char charAt( int index )
StringBuffer 객체의 배열에서 인자 index가 가리키는 위치에 있는 문자를 반환한다. 만일 index의 값이 음수이거나 또는 StringBuffer 객체의 length 보다 크거나 같으면 StringIndexOutofBoundsException이 던져진다.
void ensureCapacity( int min )
StringBuffer 객체의 저장 용량을 인자 min에 의해 지정된 값보다 반드시 크게 설정한다. 만일 현재 저장 용량이 min보다 작으면 저장 용량을 크게 하기 위해 새로운 내부 배열이 생성되는데 새로운 저장 용량은 min보다 크게 설정된다. 추가되는 크기는 보통 현재 저장 용량에 2를 곱한 후 2를 더한 크기가 되며 만일 인자min값이 0 또는 음수일 때는 아무런 일도 일어나지 않는다.
int length()
StringBuffer 객체의 배열에 저장되어 있는 문자들의 수를 반환한다.
StringBuffer reverse()
StringBuffer 객체의 배열에 있는 내용의 순서를 반대로 바꾼 후 바뀐 StringBuffer 객체를 반환한다.
void setCharAt( int index, char ch )
인자 index로 지정한 위치에 있는 문자를 인자 ch의 값으로 변경한다. index의 값이 음수 또는 StringBuffer 객체의 length 길이보다 크거나 같으면 StringIndexOutofException이 던져진다.
void setLength( int length )
StringBuffer 객체의 배열 length를 지정한 length로 설정한다. 만일 인자로 지정된 length가 현재 length보다 작으면 배열의 내용이 짤리게 되며 인자로 지정된 length가 현재 length보다 크거나 같으면 배열이 추가되고 추가된 배열에는 null문자('\u0000')가 채워진다. length가 음수로 지정되면 StringIndexOutOfBoundsException을 던진다.
String substring( int start )
StringBuffer 객체의 배열에서 인자 start에 지정한 위치부터 배열의 마지막까지 있는 모든 문자를 포함하는 새로운 String 객체를 반환한다. 인자start가 0보다 적거나 StringBuffer 객체의 배열 length보다 크거나 같으면 StringIndexOutOfBoundsException이 던져진다.
String toString()
StringBuffer 객체의 배열에 있는 내용을 문자열로 갖는 새로운 String 객체를 반환한다.
-----------------------------------------------------------------------------------------------------------------------------
StringBuffer 와 StringBuilder 객체의 내부 배열의 크기는 저장 용량과 길이로 구별된다. 저장 용량은 배열에 저장될 수 있는 문자의 최대 개수를 의미하며 길이는 배열에 현재 저장된 문자의 개수를 의미한다.
toAlignBinaryString() 메소드는 다음 드에서 볼 수 있듯 비효율적인 반복문으로 구현되어 있다
int numLeadingZeros=numBits-result.length();
String zeroPrefix="";
for (int j=0; j<numLeadingZeros; j++)
zerosPrefix+="0";
위의 코드에 있는 반복문은 반복될 때마다 StringBuilder 객체와 String 객체를 생성하기 떄문에 비효율적이다. 실제 컴파일러에서는 위의 코드를 다음과 같이 해석한다.
int numLeadingZeros=3;
String zerosPrefix="";
for(int j=0; j<numLeadingZeros; j++)
zerosPrefix = new Stringbuilder().append(zerosPrefix).append("0").toString();
반복문이 반복될 때마다 객체를 생성하는 위의 예를 좀더 효율적인 코드로 만들기 위해서는 StringBuffer/StringBuilder 객체를 반복문 전에 생성한 후 반복될 때마다 append() 메소드를 호출하고 반복이 끝난 후 toString() 메소드를 호출해야 한다. 다음 코드는 좀 더 효율적으로 작성한 것이다.
int numLeadingZeros=3;
StringBuilder sb=new StringBuilder();
for(int j=0; j<numLeadingZeros; j++)
sb.append("0");
String zerosPrefix= sb.toString();
**문자열 결함 연산자는 반복이 많이 되는 반복문에서 불필요하게 많은 StringBuilder와 String 객체를 생성하기 때문에 가급적 사용하지 않는 것이 좋다. **