๋ฌธ์์ด์ ์ถ๊ฐํ ๋ ํํ StringBuilder ์ StringBuffer ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
๊ทธ ๋์์ ๋ฉํฐ ์ฐ๋ ๋์ ์ฐจ์ด๋ผ๊ณ ๋ง ์๊ณ ์์๋๋ฐ ์ด๋ฒ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ป๊ฒ ๋ค๋ฅธ ์ง ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด์๋ค.
StringBuilder VS StringBuffer


๊ธฐ๋ณธ์ ์ผ๋ก ์คํธ๋ง ๋ฒํผ์ ์คํธ๋ง ๋น๋ ๋ชจ๋ AbstractStringBuilder ๋ผ๋ ์ถ์ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค.

๋ํ์ ์ผ๋ก ์ฌ์ฉํ๋ append ํจ์์ ๊ตฌํ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋๋ค super() ๋ฉ์๋๋ฅผ ํตํด AbstractStringBuilder ์ ํจ์๋ฅผ ํธ์ถํ๋ค.
๊ทผ๋ฐ ์คํธ๋ง ๋ฒํผ์๋ง ์๋ ๊ฒ๋ค์ด ๋ช๊ฐ์ง ์๋ค.
1. synchronize
2. toStringCache
๊ฐ๊ฐ์ด ์ด๋ค ์ญํ ์ ํ๋ ์ง ์์๋ณด์
synchronize
- ์ด ํค์๋๋ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์์ ๋๊ธฐํ๋ฅผ ์ง์ํ๋ค.
- ๊ณต์ ๋ฐ์ดํฐ์ lock์ ๊ฑธ์ด ์์ ์ค์ด๋ ์ฐ๋ ๋๊ฐ ๋ง์น ๋๊น์ง ๋ค๋ฅธ ์ฐ๋ ๋์๊ฒ ์ ์ด๊ถ์ด ๋์ด๊ฐ์ง ์๊ฒ ๋ณดํธํ๋ค.
์ด ํค์๋๋ฅผ ํตํด ์คํธ๋ง ๋ฒํผ๋ฅผ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ง์ํด์ค๋ค.
toStringCache
- ์ด๋ฆ ๊ทธ๋๋ก toString() ํจ์์ ์บ์ ๊ฐ์ ๋ณ์์ด๋ค.
toString() ํจ์ ํธ์ถ ์์ ์ด value ๋ฐฐ์ด์ ๋ณ๊ฒฝ์ด ์๋ค๋ฉด, toStringCache์ ์ด์ฉํด์ String์ ๋ง๋ ๋ค.

์คํธ๋ง ๋ฒํผ๋ ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค toStringCache ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ด๊ธฐํ ํด์ค๋ค.
๊ทธ ์ํ์์ toString()์ ํธ์ถํ๋ฉด toStringCache ๋ null ์ด๊ธฐ๋๋ฌธ์ ์๋ก์ด value ๊ฐ์ผ๋ก String ์ ๋ง๋๋ ๊ฒ์ด๋ค !
@HotSpotIntrinsicCandidate
public synchronized String toString() {
return this.toStringCache == null ? (this.toStringCache = this.isLatin1() ? StringLatin1.newString(this.value, 0, this.count) : StringUTF16.newString(this.value, 0, this.count)) : new String(this.toStringCache);
}
์ด๋ฏธ ์ ์ฅ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๊ธฐ์กด ๊ฐ์ ์ด์ฉํด String ์ ๋ง๋ ๋ค.
๊ทธ๊ฒ ์๋๋ผ๋ฉด ์๋ก์ด ๊ฐ์ผ๋ก String ์ ๋ง๋ ๋ค.
๊ทผ๋ฐ ์ toStringCache ๋ณ์๋ ์คํธ๋ง ๋ฒํผ์๋ง ์์๊น ?
๊ทธ ์ด์ ๋ ์คํธ๋ง ๋น๋๋ ๋จ์ผ ์ฐ๋ ๋ ํ๊ฒฝ์์๋ง ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฒ ๋ฌด์จ ์๋ฏธ๋๋ฉด, ์คํธ๋ง ๋ฒํผ๋ ๋ฉํฐ ์ฐ๋ ๋์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ณํ์ง ์์ ์ํ์์ ์ฌ๋ฌ๋ฒ ๋ถ๋ฆด ์ ์์ง๋ง
๋จ์ผ ์ฐ๋ ๋์์ ์คํ๋๋ ์คํธ๋ง ๋น๋๋ ์๋์ ์ผ๋ก ์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ์ ๋ค.
๊ฒฐ๊ตญ ์ต์ ํ์ ์ฐจ์ด์ด๋ค.
๊ฒฐ๋ก
๊ณตํต์
์คํธ๋ง ๋น๋์ ์คํธ๋ง ๋ฒํผ ๋ชจ๋ ๊ฐ์ ์ถ์ ํด๋์ค๋ฅผ ์์ ๋ฐ๋๋ค.
์ฐจ์ด์
์คํธ๋ง ๋น๋ : ๋จ์ผ ์ค๋ ๋์ด๊ฑฐ๋ ๋๊ธฐํ๋ฅผ ์ ๊ฒฝ ์ฐ์ง์์๋ ๋๋ ๊ณณ
์คํธ๋ง ๋ฒํผ : ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉ
์ฐธ๊ณ ํ ์ฌ์ดํธ
https://woooongs.tistory.com/98?category=798806
StringBuilder ์ StringBuffer ๋น๊ต
StringBuilder ์ StringBuffer ๋ชจ๋ AbstractStringBuilder ๋ฅผ ์์๋ฐ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ณ ์๋ค. ๋ ํด๋์ค๋ ๋ชจ๋ String ์ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ๋์ง๋ง ์ด๋ค ์ฐจ์ด์ ์ผ๋ก ์ธํด ๊ตฌ๋ถ๋์ด์๋์ง๋ฅผ ํ์ธํด๋ณธ๋ค. appen
woooongs.tistory.com
Why StringBuffer has a toStringCache while StringBuilder not?
In JDK 8, StringBuffer class has a toStringCache, while StringBuilder doesn't. /** * A cache of the last value returned by toString. Cleared * whenever the StringBuffer is modified. */ private
stackoverflow.com
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Application Context VS Bean Factory (0) | 2023.06.24 |
|---|---|
| [๋์์ธ ํจํด] ์ถ์ ํฉํ ๋ฆฌ ํจํด์ด๋? (0) | 2023.06.09 |
| [TIL] ์ธ์ ์ธ์ฆ๊ณผ ํ ํฐ ์ธ์ฆ ๋ฐฉ์ (0) | 2023.03.22 |
| [java] ์ ๋ค๋ฆญ (0) | 2023.03.07 |
| [java] ์คํธ๋ฆผ ์์ ์ฒ๋ฆฌ (0) | 2023.02.28 |