We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Originally posted by bunsung92 March 9, 2023 ๐ ๊ตฌ์ฑ
Table of contents generated with markdown-toc
Thread-Safe ํ๊ณ ์ฑ๋ฅ ์ด์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ StringBuilder, StringBuffer, String ์ค์์ StringBuilder๋ฅผ ์ฌ์ฉํ์.
Thread-Safe
์ฑ๋ฅ ์ด์
StringBuilder
Thread-Safe ํ์ง ์๊ณ String ์ฐ์ฐ์ด ๋ง์ ๊ฒฝ์ฐ๋ StringBuffer์ ์ฌ์ฉ์ด ๊ถ์ฅ๋๋ค.
์๋ฐ์์ ๋ฌธ์์ด์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ String์ ๋ถ๋ณ์ด๋ค. ๋ฌธ์์ด์ด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ณํ์ง ์๋ ๊ฒ์ด๋ค.
+ ์ฐ์ฐ์๋ฅผ ํตํด ๋ค๋ฅธ ๋ฌธ์์ด์ ์ถ๊ฐํ ๋๋ ๊ธฐ์กด ๋ฌธ์์ด์ ์๋ก์ด ๋ฌธ์์ด์ ์ถ๊ฐํด์ฃผ์ง ์๊ณ ์๋ก์ด ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋๊ฒ์ด๋ค. ๊ธฐ์กด์ ๋ ํผ๋ฐ์ค๋ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ ธ Unreachable ์ํ๊ฐ ๋์ด ๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ๋์์ด ๋๋ค.
+
Unreachable
String์ ์กฐ์ํ๋ ์ฐ์ฐ์ ์๊ฐ๊ณผ ์์(๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์ฌ์ฉํ๋ค.
String์ ๋ถ๋ณ๊ณผ ๋ฐ๋๋ก StringBuilder์ StringBuffer๋ ๊ฐ๋ณ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค. ์ด ๋์ ๋ฌธ์์ด์ ํ ๋ฒ ๋ง๋ค๊ณ ์ฐ์ฐ์ด ํ์ํ ๋๋ง๋ค ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํด๊ฐ๋ฉฐ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๋ค. ๋ฐ๋ผ์ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋กญ๊ฒ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ String์ ๋นํด ๋ ๋น ๋ฅด๋ค.
๊ทธ๋ ๋ค๋ฉด StringBuilder์ StringBuffer์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น? ๋ฐ๋ก ๋๊ธฐํ ์ด์์ ๋ค๋ฅด๊ฒ ๋์ฒํ๋ค๋ ๊ฒ์ด๋ค.
๋๊ธฐํ
StringBuilder๋ ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค. StringBuffer๋ ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ๋ค.
์๋์ append() ๊ตฌํ์ ๋ณด๋ฉด ๋๊ธฐํ ์ฌ๋ถ์ ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฒ์ ์ ์์๋ค.
append()
public StringBuilder append(String str) { super.append(str); return this; } public synchronized StringBuffer append(String str) { super.append(str); return this; }
synchronized ๊ฐ ๊ฑธ๋ฆฐ ๋ฉ์๋์ ๋์์ด ๋๋ฆด ๊ฑฐ๋ผ๋ ์ถ์ธก์ ๋๊ตฌ๋ ๊ฐ๋ฅํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ์ด์ ๋ถํฐ ์ฑ๋ฅ ์์ฃผ๋ก ํด๋น ๋ฉ์๋๋ค์ ํ ์คํธ ํด๋ณด์.
synchronized
๊ฐ์ฅ ๋จผ์ ์๊ฐ ์ธก์ ๊ณผ ๊ฒฐ๊ณผ ์ถ๋ ฅ ํด๋์ค๋ฅผ ์ ์ธํ๋ค.
์๊ฐ ์ธก์
๊ฒฐ๊ณผ ์ถ๋ ฅ
public class Performance { private long startTime; private long endTime; // ์์ ์๊ฐ์ ์ฒดํฌํ๋ ๋ฉ์๋ public void startClock() { startTime = System.nanoTime(); } // ์ข ๋ฃ ์๊ฐ์ ์ฒดํฌํ๋ ๋ฉ์๋ public void stopClock() { endTime = System.nanoTime(); } // ๊ฒฐ๊ณผ ์ถ๋ ฅ์ ์ํ ๋ฉ์๋ public void printResult(String clockName) { System.out.printf("%s" + ": %.3f seconds %n", clockName, (endTime - startTime) / (double) 1_000_000_000); resetTime(); } // ์๊ฐ ์ด๊ธฐํ ๋ฉ์๋ private void resetTime() { startTime = 0L; endTime = 0L; } }
๊ฐ์ ๋ฉ์ธ ๋ฉ์๋ ๋ด์์ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ํ๊ฒ ๋ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ํผํฌ๋จผ์ค ์ฐจ์ด๊ฐ ์์ ์ ์์ผ๋ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํด์ ํ ์คํธ ํจ.
public class TimeTest { private static final int MAX_LOOP_COUNT = 50_000; public static void main(String[] args) { Performance performance = new Performance(); // StringBuilder StringBuilder builder = new StringBuilder(); performance.startClock(); for (int loop = 1; loop < MAX_LOOP_COUNT; loop++) { builder.append("test") .append(loop) .append("play"); } performance.stopClock(); performance.printResult("StringBuilder"); //String String str = ""; performance.startClock(); for (int loop = 1; loop < MAX_LOOP_COUNT; loop++) { str += "test" + loop + "play"; } performance.stopClock(); performance.printResult("String"); } }
public class TimeTest2 { private static final int MAX_LOOP_COUNT = 50_000; public static void main(String[] args) { Performance performance = new Performance(); //StringBuffer StringBuffer buffer = new StringBuffer(); performance.startClock(); for (int loop = 1; loop < MAX_LOOP_COUNT; loop++) { buffer.append("test") .append(loop) .append("play"); } performance.stopClock(); performance.printResult("StringBuffer"); } }
๊ฐ ํ ์คํธ ์ฝ๋์ ๊ฒฐ๊ณผ๋ค์ ๋ณด๊ฒ๋๋ฉด 5๋ง๋ฒ ํ ์คํธ์์์ ์ฑ๋ฅ์ StringBuilder์ StringBuffer๋ ํฐ ์ฑ๋ฅ์ฐจ์ด๊ฐ ์๋ค. ํ์ง๋ง String ์ฐ์ฐ์ ํ์คํ ๋๋ฆฌ ๋ค๋ ๊ฒ์ ์ ์์๋ค.
์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒ๋๋ฉด ์ฝ 100๋ง ํ๋ฅผ ๊ธฐ์ ์ผ๋ก ์ํ์๊ฐ์ด ์กฐ๊ธ์ฉ ์ฐจ์ด๊ฐ ๋๊ฒ๋๋ค.
์ฐ์ฐ์ด ๋ง์์ง๋ค๋ฉด StringBuilder๊ฐ StringBuffer ๋ณด๋ค ์ํ ๋ฅ๋ ฅ์ด ์ข๋ค.
2023-03-09 ๋ชฉ
The text was updated successfully, but these errors were encountered:
Irisation23
No branches or pull requests
Discussed in https://github.com/orgs/cs-collections/discussions/114
Originally posted by bunsung92 March 9, 2023
๐ ๊ตฌ์ฑ
Table of contents generated with markdown-toc
0. ํต์ฌ ์์ฝ ๐
Thread-Safe
ํ๊ณ์ฑ๋ฅ ์ด์
๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ StringBuilder, StringBuffer, String ์ค์์StringBuilder
๋ฅผ ์ฌ์ฉํ์.Thread-Safe
ํ์ง ์๊ณ String ์ฐ์ฐ์ด ๋ง์ ๊ฒฝ์ฐ๋ StringBuffer์ ์ฌ์ฉ์ด ๊ถ์ฅ๋๋ค.1. String์ Immutable
์๋ฐ์์ ๋ฌธ์์ด์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ String์ ๋ถ๋ณ์ด๋ค.
๋ฌธ์์ด์ด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ณํ์ง ์๋ ๊ฒ์ด๋ค.
+
์ฐ์ฐ์๋ฅผ ํตํด ๋ค๋ฅธ ๋ฌธ์์ด์ ์ถ๊ฐํ ๋๋ ๊ธฐ์กด ๋ฌธ์์ด์ ์๋ก์ด ๋ฌธ์์ด์ ์ถ๊ฐํด์ฃผ์ง ์๊ณ ์๋ก์ด ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋๊ฒ์ด๋ค. ๊ธฐ์กด์ ๋ ํผ๋ฐ์ค๋ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ ธUnreachable
์ํ๊ฐ ๋์ด ๊ฐ๋น์ง ์ปฌ๋ ์ (GC) ๋์์ด ๋๋ค.String์ ์กฐ์ํ๋ ์ฐ์ฐ์ ์๊ฐ๊ณผ ์์(๋ฉ๋ชจ๋ฆฌ)๋ฅผ ์ฌ์ฉํ๋ค.
2. StringBuilder์ StringBuffer
String์ ๋ถ๋ณ๊ณผ ๋ฐ๋๋ก StringBuilder์ StringBuffer๋ ๊ฐ๋ณ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
์ด ๋์ ๋ฌธ์์ด์ ํ ๋ฒ ๋ง๋ค๊ณ ์ฐ์ฐ์ด ํ์ํ ๋๋ง๋ค ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํด๊ฐ๋ฉฐ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๋ค. ๋ฐ๋ผ์ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋กญ๊ฒ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ String์ ๋นํด ๋ ๋น ๋ฅด๋ค.
๊ทธ๋ ๋ค๋ฉด StringBuilder์ StringBuffer์ ์ฐจ์ด๋ ๋ฌด์์ผ๊น?
๋ฐ๋ก
๋๊ธฐํ
์ด์์ ๋ค๋ฅด๊ฒ ๋์ฒํ๋ค๋ ๊ฒ์ด๋ค.StringBuilder๋ ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
StringBuffer๋ ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ๋ค.
์๋์
append()
๊ตฌํ์ ๋ณด๋ฉด ๋๊ธฐํ ์ฌ๋ถ์ ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฒ์ ์ ์์๋ค.synchronized
๊ฐ ๊ฑธ๋ฆฐ ๋ฉ์๋์ ๋์์ด ๋๋ฆด ๊ฑฐ๋ผ๋ ์ถ์ธก์ ๋๊ตฌ๋ ๊ฐ๋ฅํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ์ด์ ๋ถํฐ ์ฑ๋ฅ ์์ฃผ๋ก ํด๋น ๋ฉ์๋๋ค์ ํ ์คํธ ํด๋ณด์.3. StringBuilder & StringBuffer Performance Test
๊ฐ์ฅ ๋จผ์
์๊ฐ ์ธก์
๊ณผ๊ฒฐ๊ณผ ์ถ๋ ฅ
ํด๋์ค๋ฅผ ์ ์ธํ๋ค.๊ฐ์ ๋ฉ์ธ ๋ฉ์๋ ๋ด์์ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ํ๊ฒ ๋ ๊ฒฝ์ฐ ์ฝ๊ฐ์ ํผํฌ๋จผ์ค ์ฐจ์ด๊ฐ ์์ ์ ์์ผ๋ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํด์ ํ ์คํธ ํจ.
์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒ๋๋ฉด ์ฝ 100๋ง ํ๋ฅผ ๊ธฐ์ ์ผ๋ก ์ํ์๊ฐ์ด ์กฐ๊ธ์ฉ ์ฐจ์ด๊ฐ ๋๊ฒ๋๋ค.
์ฐ์ฐ์ด ๋ง์์ง๋ค๋ฉด StringBuilder๊ฐ StringBuffer ๋ณด๋ค ์ํ ๋ฅ๋ ฅ์ด ์ข๋ค.
4. ํ๊ณ ๐งน
2023-03-09 ๋ชฉ
The text was updated successfully, but these errors were encountered: