๐Ÿ“š CS [ComputerScience]/๐Ÿ“š CS ๋ฉด์ ‘

๐Ÿ“š [CS๋ฉด์ ‘] ์›น ๋ฉด์ ‘ ์งˆ๋ฌธ [19] [Java]

Dbswnstjd 2024. 3. 29. 01:33

1. String, Stringbuffer, Stringbuilder

String์€ ๋ถˆ๋ณ€๊ฐ์ฒด(immutable)ํ•œ ๊ฐ์ฒด์ด๋‹ค. ํ•œ๋ฒˆ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฌธ์ž์—ด์„ ์กฐ์ž‘ํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆ๋ณ€์„ฑ ๋•๋ถ„์— thread-safeํ•˜๊ณ , String๊ฐ์ฒด๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

String a = "abc";
a = "abcd";

String b = new String("abc");

์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์—๋Š” ์ด ์ฝ”๋“œ๊ฐ€ abcd๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‹ค์ œ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” abc๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ abcd๋ฅผ ์ €์žฅํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ abc๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” GC์— ์˜ํ•ด ์—†์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„์˜ a๋Š” String Pool(Heap์˜ ๋‚ด๋ถ€)์ด๋ผ๋Š” ๊ณต๊ฐ„์—์„œ ๊ด€๋ฆฌ๋˜์ง€๋งŒ new ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑํ•œ String ๊ฐ์ฒด๋Š” Heap๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น์ด ๋œ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฌธ์ž์—ด์˜ ๋™๋“ฑ์„ ๋น„๊ตํ•  ๋•Œ๋Š” equals()๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

 

Stringbuffer๋Š” ๊ฐ€๋ณ€(mutable) ๊ฐ์ฒด์ด๋‹ค. ๋ฌธ์ž์—ด ์กฐ์ž‘์‹œ์— ๊ธฐ์กด ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์—ฌ thread-safeํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋™๊ธฐํ™”๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์–ด ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค. 

 

Stringbuilder๋Š” ๊ฐ€๋ณ€(mutable) ๊ฐ์ฒด์ด๋‹ค. ๋ฌธ์ž์—ด ์กฐ์ž‘์‹œ์— ๊ธฐ์กด ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ thread-safeํ•˜์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ๋™๊ธฐํ™”์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

- thread-safe / ์˜ค๋ฒ„ํ—ค๋“œ ?

thread-safe๋ž€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ํ•ด๋‹น ์ฝ”๋“œ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๋”๋ผ๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋™๊ธฐํ™”, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜๊ณ  ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค. ๋ฎคํ…์Šค(Mutual Exclusion) / ์„ธ๋งˆํฌ์–ด ์šด์˜์ฒด์ œ ์ˆ˜์ค€์—์„œ ์ œ๊ณต๋˜๋Š” ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋™์‹œ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์˜ค๋ฒ„ํ—ค๋“œ๋ž€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ถ”๊ฐ€์ ์ธ ์ž์›์ด๋‚˜ ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„ฑ๋Šฅ์ €ํ•˜์˜ ์›์ธ์ด ๋˜๋ฉฐ ํŠน์ • ์ž‘์—…์ด๋‚˜ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ถ€๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋™๊ธฐํ™” ์‹œ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ๋Œ€๊ธฐ์‹œ๊ฐ„์ด๋‹ค. ๋™๊ธฐํ™” ๋œ ๋ธ”๋ก ๋˜๋Š” ๋ฉ”์„œ๋“œ์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋“ค์€ ๋Œ€๊ธฐ์ƒํƒœ์— ๋†“์ด๊ฒŒ ๋˜๊ณ  ์‹คํ–‰์ด ์ง€์—ฐ๋œ๋‹ค. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ(Context-switching)์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ๋งˆ๋‹ค ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์€ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ / ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋Œ€๊ธฐ์ค‘์ธ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •์œผ๋กœ ์ž์›์‚ฌ์šฉ๊ณผ ์‹œ๊ฐ„ ์†Œ๋ชจ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

2. Java์˜ ์ ‘๊ทผ ์ œ์–ด์ž

public - ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅprotected - ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค์™€ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ž์‹ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ. ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉdefault - ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋กœ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์˜ ํด๋ž˜์Šค์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅprivate - ์˜ค์ง ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ. ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์บก์Šํ™”ํ•˜๊ณ  ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•  ๋•Œ ์‚ฌ์šฉ