๊ด€๋ฆฌ ๋ฉ”๋‰ด

Tech Log ๐Ÿ› ๏ธ

StringBuilder VS StringBuffer ๋ณธ๋ฌธ

TIL

StringBuilder VS StringBuffer

sehaan 2023. 6. 4. 01:02

๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•  ๋•Œ ํ”ํžˆ 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

https://stackoverflow.com/questions/46294579/why-stringbuffer-has-a-tostringcache-while-stringbuilder-not

 

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