Programming languages/Java

๋ฌธ์ž์—ด String Class

yoooCo 2025. 4. 29. 12:11

๐Ÿ“ƒ ๋ฌธ์ž์—ด String

๐ŸŽฏ String์ด๋ž€?

String์€ ๋ฌธ์ž์˜ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ์ฐธ์กฐํ˜•(๊ฐ์ฒดํ˜•) ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜: ๋ฌธ์ž ํ•˜๋‚˜(char)์™€ ๋ฌธ์ž์—ด(String)์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค!
char letter = 'A';     // ๋ฌธ์ž ํ•˜๋‚˜
String word = "Apple"; // ๋ฌธ์ž์—ด (๊ฐ์ฒด)

๐Ÿ”ฎ String ๊ฐ์ฒด์˜ ํŠน์ง•

๊ตฌ๋ถ„ ์„ค๋ช…
๋ถˆ๋ณ€์„ฑ(Immutable) ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง„ ๋ฌธ์ž์—ด์€ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.
๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๋™์ผํ•œ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•œ๋‹ค.
์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ ๊ธฐ๋ณธํ˜•์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

โš™๏ธ String ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char[] value; // (Java 8 ์ดํ•˜)
    // Java 9 ์ด์ƒ์€ byte[] value๋ฅผ ์‚ฌ์šฉ (๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”)
}
  • final : ์ƒ์† ๋ถˆ๊ฐ€!
  • private final value : ๋ฌธ์ž์—ด ๋‚ด์šฉ์„ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Œ.

๐Ÿ’ผ ๋ฌธ์ž์—ด ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ด์ •๋ฆฌ

// ๋ฆฌํ„ฐ๋Ÿด
String book = "Java";

// new ํ‚ค์›Œ๋“œ
String subject = new String("OOP");

// ๋ฌธ์ž ๋ฐฐ์—ด๋กœ ์ƒ์„ฑ
char[] letters = { 'C', 'o', 'd', 'e' };
String code = new String(letters);

๐ŸŒŸ ์™œ String์€ '๋ถˆ๋ณ€(Immutable)'ํ•˜๊ฒŒ ์„ค๊ณ„ํ–ˆ์„๊นŒ?

1. ๋ณด์•ˆ(Security)

โ–ถ๏ธ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ฃผ์†Œ(URL), ํŒŒ์ผ ๊ฒฝ๋กœ(Path) ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฌธ์ž์—ด์ด ๋ณ€์กฐ๋˜๋ฉด ์œ„ํ—˜ํ•˜๋‹ˆ๊นŒ!

2. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ์•ˆ์ „์„ฑ(Thread Safety)

โ–ถ๏ธ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ ‘๊ทผํ•ด๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

3. ์บ์‹ฑ ๋ฐ ์ตœ์ ํ™” ๊ฐ€๋Šฅ์„ฑ

โ–ถ๏ธ ๊ฐ™์€ ๋ฌธ์ž์—ด์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ์ด ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

4. Hash ๊ธฐ๋ฐ˜ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ์˜ ์‹ ๋ขฐ์„ฑ

โ–ถ๏ธHashMap, HashSet ๊ฐ™์€ ๊ณณ์—์„œ String์„ ํ‚ค(key)๋กœ ์‚ฌ์šฉํ•  ๋•Œ,
๊ฐ’์ด ๋ณ€ํ•˜๋ฉด ํ•ด์‹œ์ฝ”๋“œ๋„ ๋ณ€ํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ํ•ด์•ผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿก ๋ฌธ์ž์—ด ํ’€ (String Constant Pool)์ด๋ž€?

๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์šฉ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.
  • "Hello" ๊ฐ™์€ ๋ฆฌํ„ฐ๋Ÿด์„ ๋งŒ๋“ค๋ฉด, ๋ฌธ์ž์—ด ํ’€์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๊ธฐ์กด ๊ฐ์ฒด ์ฐธ์กฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
String cat1 = "meow";
String cat2 = "meow";

System.out.println(cat1 == cat2); // true (๊ฐ™์€ ๊ฐ์ฒด ์ฐธ์กฐ)

โœ… ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ๋ฐฉ์ง€!
โœ… ์†๋„ ์ตœ์ ํ™”!



๐Ÿ’ก new String() vs ๋ฆฌํ„ฐ๋Ÿด ์ƒ์„ฑ ์ฐจ์ด

๋ฐฉ์‹ ํŠน์ง•
"Hello" ๋ฌธ์ž์—ด ํ’€์— ์ €์žฅ. ๊ธฐ์กด์— ์žˆ์œผ๋ฉด ์žฌ์‚ฌ์šฉ.
new String("Hello") Heap ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ. ํ’€์— ์ €์žฅ ์•ˆ ํ•จ.
String a = "hi";
String b = new String("hi");

System.out.println(a == b); // false (๋‹ค๋ฅธ ๊ฐ์ฒด)

๐Ÿง  intern() ๋ฉ”์„œ๋“œ๋ž€?

ํž™(Heap)์— ์žˆ๋Š” String์„ ๋ฌธ์ž์—ด ํ’€(String Constant Pool)๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฉ”์„œ๋“œ.
String heapStr = new String("welcome");
String pooledStr = heapStr.intern();

System.out.println(pooledStr == "welcome"); // true
  • ์ด๋ฏธ ํ’€์— ์žˆ์œผ๋ฉด ๊ทธ ์ฐธ์กฐ ๋ฐ˜ํ™˜
  • ์—†์œผ๋ฉด ํ’€์— ์ƒˆ๋กœ ์ €์žฅ

๐Ÿ’ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ + == ๋น„๊ต ๊ฐ€๋Šฅ์„ฑ ์ฆ๊ฐ€


๐Ÿงฉ String ์ฃผ์š” ๋ฉ”์„œ๋“œ ์š”์•ฝ

๋ฉ”์„œ๋“œ ์„ค๋ช…
length() ๋ฌธ์ž์—ด ๊ธธ์ด ๋ฐ˜ํ™˜
charAt(int index) ํŠน์ • ์œ„์น˜ ๋ฌธ์ž ๋ฐ˜ํ™˜
substring(start, end) ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ
equals(Object obj) ๋ฌธ์ž์—ด ๋‚ด์šฉ ๋น„๊ต
equalsIgnoreCase(String other) ๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œํ•˜๊ณ  ๋น„๊ต
indexOf(String s) ํŠน์ • ๋ฌธ์ž์—ด ์œ„์น˜ ์ฐพ๊ธฐ
toUpperCase() / toLowerCase() ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜
trim() ์•ž๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐ
replace(old, new) ๋ฌธ์ž์—ด ์น˜ํ™˜

โš ๏ธ String์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

๋น„๊ตํ•  ๋•Œ๋Š” ==(์ฐธ์กฐ) ๋ง๊ณ  equals() ์‚ฌ์šฉ!

String a = "apple";
String b = new String("apple");

System.out.println(a == b);        // false (์ฐธ์กฐ ์ฃผ์†Œ ๋น„๊ต)
System.out.println(a.equals(b));   // true (๊ฐ’ ๋น„๊ต)
์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฌธ์ž์—ด์ด๋ผ๋ฉด String ๋Œ€์‹  StringBuilder๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”.

๐Ÿ“Š ์š”์•ฝ

String์€ ์•ˆ์ „ํ•˜๊ณ  ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๋ฌด์กฐ๊ฑด ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค!
ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ์•ˆ์ „์„ฑ ๋•๋ถ„์— ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ ๊ณณ๊ณณ์— ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ“š ์ถ”๊ฐ€๋กœ ๊ณต๋ถ€ํ•˜๋ฉด ์ข‹์€ ์ฃผ์ œ

  • String + StringBuilder ๋น„๊ต
  • String์˜ ํ•ด์‹œ์ฝ”๋“œ(HashCode)์™€ equals()์˜ ๊ด€๊ณ„
  • ๋ฌธ์ž์—ด ํฌ๋งทํŒ… (String.format())