๐กJava ์์ ๋ฌธ์์ด์ ๋ค๋ฃจ๋ฅผ ๋ํ์ ์ธ ํด๋์ค๋ก String , StringBuffer, StringBuilder ์ ์ฐจ์ด์ ์ ์์๋ณด๊ณ ์ ํ๋ค.
String์ ๋ฌธ์๋ค์ ์ ๋์ฝ๋๋ก ๋ณด๊ด ํ๋ค.
String์ ๋ถ๋ณ์ฑ์ ๊ฐ์ง
private final byte[] value;
๋๋ฌธ์ ๋ณํ์ง ์๋ ๋ฌธ์์ด์ ์์ฃผ ์ฝ์ด๋ค์ด๋ ๊ฒฝ์ฐ String์ ์ฌ์ฉํด ์ฃผ์๋ฉด ์ข์ ์ฑ๋ฅ ๋ณด์ฌ์ค๋ค.
๋ฌธ์์ด ์ถ๊ฐ,์์ ,์ญ์ ๋ฑ์ ์ฐ์ฐ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ String ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฉ๋ชจ๋ฆฌ(Heap)์ ๋ง์ ์์ ๊ฐ๋น์ง(Garbage)๊ฐ ์์ฑ๋์ด GC ๋๋ full GC๊ฐ ์์ฃผ ๋ฐ์ํ ์ ์์.
String์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํ ํด๋์ค
StringBuffer : ๋ฌธ์์ด ์ฐ์ฐ์ด ๋ง๊ณ ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์ผ ๊ฒฝ์ฐ
StringBuilder : ๋ฌธ์์ด ์ฐ์ฐ์ด ๋ง๊ณ ๋จ์ผ์ฐ๋ ๋์ด๊ฑฐ๋ ๋๊ธฐํ๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ ๊ฒฝ์ฐ
@Override
public synchronized int length() {
return count;
}
@Override
public synchronized void setCharAt(int index, char ch) {
toStringCache = null;
super.setCharAt(index, ch);
}
synchronized ํค์๋๋ฅผ ํตํด ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ ์ด๊ฐ๋ฅ
synchronized๋ 4๊ฐ์ง ์ ์ธ ๋ฐฉ์์ผ๋ก ์ ์ด๊ฐ ๋ค๋ฅด๊ฒ ์๋ํ๋ค.
synchronized method๋ ํด๋์ค์ ์ธ์คํด์ค์ ๋ํ์ฌ lock์ ๊ฑด๋ค.
์ค๋ ๋1 lock
์ค๋ ๋1 unlock
์ค๋ ๋2 lock
์ค๋ ๋2 unlock
์์๋๋ก lock์ ํ๋ํ๊ณ ๋ฐ๋ฉ ( ์ค๋ ๋1unlock ->์ค๋ ๋2lock ๋ฐ๋ก ์ถ๋ ฅ)
์ค๋ ๋1 lock
์ค๋ ๋2 lock
์ค๋ ๋1 unlock
์ค๋ ๋2 unlock
์ด ์ํฉ์์๋ lock์ ๊ณต์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
์ธ์คํด์ค ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌ ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฉ์๋์ฌ๋ ๊ฐ์ ์ธ์คํด์ค ์์์ synchronizedํค์๋๋ฅผ ์ ์ฉํ์๊ฒฝ์ฐ ๋๊ธฐํ๊ฐ ๋ฐ์ํ๋ค.
๐กsynchronize๋ฉ์๋๋ ์ธ์คํด์ค ๋จ์๋ก lock์ ๊ฑด๋ค. ์ด๋, synchronized๊ฐ ์ ์ฉ๋ ๋ชจ๋ object์ ๋ํด์ lock์ ๊ณต์ ํ๋ค.
static์ด ํฌํจ๋ synchronized method๋ฐฉ์์ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ๋ static์ ์ฑ์ง์ ๊ฐ๋๋ค. ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค ๋จ์๋ก lock์ด ๋ฐ์ํ๋ค.
๋ค๋ฅธ ์ธ์คํด์ค์ด์ง๋ง ๋์ผํ ํด๋์ค์ด๊ธฐ ๋์ด์ ํด๋์ค ๋จ์๋ก lock์ด ๋ฐ์ํ๋ค.