์๋ฐ์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๊ณต๋ถํ๋ค๊ฐ String ๊ณผ StringBuilder๊ฐ ์์๋ก ์์ฃผ ๋ฑ์ฅํจ์ ๋ณด๊ฒ ๋์๋ค.
๋๋ Java๋ฅผ ์ ๋๋ก ๊ณต๋ถํ์ง ์ผ๋ง ์๋์,
์ฌ์ค String, StringBuffer, StringBuilder์ ๋ช
ํํ ์ฐจ์ด๋ฅผ ์๋ชจ๋ฅด๊ณ
๊ทธ๋ฅ ๊ฐ์ ธ๋ค ์ผ๋๋ฐ, ์๋ฐ์ ์ ์์ ์ฝ์ด๋ณด๋ ์ด String์ด ๊ต์ฅํ ํฅ๋ฏธ๋ก์์ ๐
์ด๋ฒ ๊ธฐํ์ ๋ช
ํํ ์ ๋ฆฌํ๊ณ ๊ฐ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค.
String
String์ ์ฐธ ํน์ดํ ์กด์ฌ์ด๋ค.
๋ค๋ฅธ ์ธ์ด์์ ๋ฌธ์์ด์ด๋ ๋๋ถ๋ถ charํ์ ๋ฐฐ์ด๋ก ๋ค๋ฃจ๋๋ฐ,
์๋ฐ์์๋ ์ด ๋ฌธ์์ด์ ์ํ ํด๋์ค๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ด๋ค.
์ด String ํด๋์ค๋ฅผ ๊น๊ฒ ๋ณด๊ธฐ ์ํด String ํด๋์ค๊ฐ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ ธ ์๋์ง ๋ค์ฌ๋ค๋ณด์.
String.java ์ผ๋ถ
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
...
public String() {
this.value = "".value;
}
/**
* Initializes a newly created {@code String} object so that it represents
* the same sequence of characters as the argument; in other words, the
* newly created string is a copy of the argument string. Unless an
* explicit copy of {@code original} is needed, use of this constructor is
* unnecessary since Strings are immutable.
*
* @param original
* A {@code String}
*/
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
/**
* Allocates a new {@code String} so that it represents the sequence of
* characters currently contained in the character array argument. The
* contents of the character array are copied; subsequent modification of
* the character array does not affect the newly created string.
*
* @param value
* The initial value of the string
*/
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
String ํด๋์ค๋ ์ธ์คํด์ค ๋ณ์๋ก ๋ช ๊ฐ์ง๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ
๊ทธ ์ค ๋ฌธ์์ด์ ์ ์ฅํ๊ธฐ ์ํด ๋ฌธ์ํ ๋ฐฐ์ด ๋ณ์ char[] value
๊ฐ ์๋ค.
๋ ์์ฑ์๋ฅผ ๋ณด๋ฉด ์ธ์คํด์ค ์์ฑ ์ ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ก ์
๋ ฅ ๋ฐ๋ ๋ฌธ์์ด์ด
์ด ์ธ์คํด์ค ๋ณ์์ ๋ฌธ์ํ ๋ฐฐ์ด๋ก ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ํ final
ํค์๋๋ก ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ ๋ถ๋ณ ๊ฐ์ฒด์์ ํ์ธํ ์ ์๋ค.
๋ ์์ฑ๋ String ์ธ์คํด์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์์ด์ ์ฝ์ ์๋ง ์๊ณ , ๋ณ๊ฒฝํ ์๋ ์๋ค.(๋ถ๋ณ ๊ฐ์ฒด)
๋ง์ฝ ์ฐ์ฐ์๋ฅผ ํตํด ๋ฌธ์์ด์ ๊ฒฐํฉํ๋ ๊ฒฝ์ฐ๋ String ์ธ์คํด์ค ๋ด์ value ๊ฐ์ด ๋ณํ๋๊ฒ ์๋,
์๋ก์ด ๋ฌธ์์ด์ด ๋ด๊ธด String ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
๋๋ฌธ์ ๋ฌธ์์ด์ ๊ฒฐํฉํ ๋๋ง๋ค ์๋ก์ด ๋ฌธ์์ด์ ๊ฐ์ง String ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
์ด๋ ๋ฌด๋ถ๋ณํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ฐจ์ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
String์ ๋น๊ต
๋ฌธ์์ด์ ๋ง๋ค ๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ง์ ํ๋ ๋ฐฉ๋ฒ๊ณผ String ํด๋์ค์ ์์ฑ์๋ฅผ ์ด์ฉํด ๋ง๋๋ ๋ฒ์ด ์๋ค.
/*๋ฌธ์์ด ๋ฆฌํฐ๋ด*/
String str1 = "amazzi";
String str2 = "amazzi";
/*String ํด๋์ค์ ์์ฑ์*/
String str3 = new String("amazzi");
String str4 = new String("amazzi);
String ํด๋์ค ์์ฑ์
String ํด๋์ค ์์ฑ์๋ new ์ฐ์ฐ์์ ์ํด ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค.
wmr gkdtkd tofhdns String ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ฉฐ ๊ฐ๊ฐ์ ์ฃผ์๊ฐ์ ๊ฐ๋๋ค.
๋ฌธ์์ด ๋ฆฌํฐ๋ด
๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ๋ ์๋์ ์ผ๋ก ์์ฑ๋์ด ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒ์ ์ฌ์ฌ์ฉํ๋ค.
๋๋ฌธ์ ๊ฐ์ ๋ด์ฉ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ํ๋ฒ๋ง ์ ์ฅ๋๋ฉฐ
๊ฐ์ ๋ฌธ์์ด์ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๊ณ ์ฐธ์กฐ๋ณ์๋ง์ด ๋ค๋ฅผ ๋ฟ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก ๋ง๋ str1, str2์
String ํด๋์ค์ ์์ฑ์๋ก ๋ง๋ str3, str4 ๊ฐ๊ฐ์ ๋น๊ต ๊ฒฐ๊ณผ๋ ์ด๋ ํ ๊น?
str1.equals(str2); // true
str3.equals(str4); // true
str1 == str2; // true
str3 == str4 // false
equals()
์ฌ์ฉ์ ํตํ ๋น๊ต์์๋ ๋ ๋ฌธ์์ด์ ๋ด์ฉ์ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ๋ ๋น๊ต ๊ฒฐ๊ณผ ๋ชจ๋ true์ด๋ค.
ํ์ง๋ง ๋ฑ๊ฐ๋น๊ต์ฐ์ฐ์ ==
๋ฅผ ํตํด ์ฃผ์๋ฅผ ๋น๊ตํ์ ๊ฒฝ์ฐ,
str3, str4๋ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฃผ์๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ false๊ฐ ๋์จ๋ค.
StringBuffer
String ํด๋์ค๋ ๋ถ๋ณ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ ์ ์์์ผ๋,
StringBuffer๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
StringBuffer๋ ํ ๋น๋ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋,
String ํด๋์ค์ฒ๋ผ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์๊ณ ๊ธฐ์กด ํ ๋น๋ ๊ฐ์ ์์ ํ๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๋ด๋ถ์ ์ผ๋ก ๋ฌธ์์ด ํธ์ง์ ์ํ ๋ฒํผ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ StringBuffer ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋
๊ทธ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก StringBuffer ํด๋์ค๋ฅผ ๋ค์ฌ๋ค๋ณด์.
StringBuffer.java ์ผ๋ถ
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache;
/** use serialVersionUID from JDK 1.0.2 for interoperability */
static final long serialVersionUID = 3388685877147921107L;
/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}
/**
* Constructs a string buffer with no characters in it and
* the specified initial capacity.
*
* @param capacity the initial capacity.
* @exception NegativeArraySizeException if the {@code capacity}
* argument is less than {@code 0}.
*/
public StringBuffer(int capacity) {
super(capacity);
}
/**
* Constructs a string buffer initialized to the contents of the
* specified string. The initial capacity of the string buffer is
* {@code 16} plus the length of the string argument.
*
* @param str the initial contents of the buffer.
*/
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
/**
* Constructs a string buffer that contains the same characters
* as the specified {@code CharSequence}. The initial capacity of
* the string buffer is {@code 16} plus the length of the
* {@code CharSequence} argument.
* <p>
* If the length of the specified {@code CharSequence} is
* less than or equal to zero, then an empty buffer of capacity
* {@code 16} is returned.
*
* @param seq the sequence to copy.
* @since 1.5
*/
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
๋ฌธ์์ด์ ์ ์ฅํ๊ธฐ ์ํ toStringCache
๋ณ์๊ฐ ๋ณด์ธ๋ค.
String ํด๋์ค์ ์ฐจ์ด์ ์ ์ด ๋ณ์๋ final๋ก ์ ์ธ๋์ด ์์ง ์๋ค๋ ๊ฒ์ด๋ค.
์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋ StringBuffer(int capacity)
์์ฑ์๋ฅผ ํตํด ๊ธธ์ด๋ฅผ ์ง์ ํด ์ค ์ ์์ผ๋,
์ง์ ํด์ฃผ์ง ์๋๋ค๋ฉด 16๊ฐ ๋ฌธ์๋ฅผ ์ ์ฅํ ์ ์๋ ํฌ๊ธฐ์ ๋ฒํผ๋ฅผ ์์ฑํ๋ค.
๋ง์ฝ ๋ฒํผ์ ํฌ๊ธฐ๊ฐ ์์
ํ๋ ค๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ณด๋ค ์์ ๋๋ ๋ด๋ถ์ ์ผ๋ก ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํค๋ ์์
์ด ์ํ๋๋ค.
StringBuffer์ ๋ณ๊ฒฝ
String ํด๋์ค์๋ ๋ฌ๋ฆฌ append() ๋ฉ์๋๋ก ๊ฐ์ ๋ณ๊ฒฝ, ์ถ๊ฐํ ์ ์๋ค.
append()๋ ๋ฐํ ๊ฐ์ด StringBuffer์ด๋ฉฐ ์์ ์ ์ฃผ์๋ฅผ ๋ฐํํ๋ค.
๋๋ฌธ์ ์๋ ์ฝ๋๋ sb์ ์๋ก์ด ๋ฌธ์์ด์ด ์ถ๊ฐ๋๊ณ sb ์์ ์ ์ฃผ์๋ฅผ ๋ฐํํด sb2์๋ sb์ ์ฃผ์๊ฐ ๋ค์ด๊ฐ๋ค.
StringBuffer sb2 = sb.append("zzi");
StringBuffer์ ๋น๊ต
String ํด๋์ค์์๋ equals ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๊ณ ์์ด์ ๋ด์ฉ ๋น๊ต๊ฐ ๊ฐ๋ฅํ์ผ๋,
StringBuffer๋ ๊ทธ๋ ์ง ์๋ค. ๋๋ฌธ์ ==
๋ก ๋น๊ตํ ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.
StringBuffer sb = new StringBuffer("abc");
StringVuffer sb2 = new StringVuffer("abc");
...
sb == sb2; // false
sb.equals(sb2); // false
ํ์ง๋ง toString()
์ ์ค๋ฒ๋ผ์ด๋ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ด์ฉํด ์ธ์คํด์ค๋ฅผ ์ป๊ณ equals()
๋ฅผ ํตํด ๋น๊ตํ ์ ์๋ค.
String s = sb.toString();
String s2 = sb2.toString();
...
s.equals(s2); // true
StringBuilder
StringBuffer๋ ๋ฉํฐ ์ฐ๋ ๋์ ์์ ํ๋๋ก ๋๊ธฐํ๋์ด ์๋ค.
์ด์ ๋ํด ์์ง์ ์ ๋ชจ๋ฅด์ง๋ง ๐ฅฒ ์ผ๋จ ์ด ๋๊ธฐํ๊ฐ StringBuffer์ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฐ๋ค.
๊ทธ๋์ StringBuffer์์ ์ค๋ ๋์ ๋๊ธฐํ๋ง ๋บ ๊ฒ์ด StringBuilder์ด๊ณ
๋์ ๊ธฐ๋ฅ์ ์์ ์ด ๋์ผํ๋ค.