โ ๋ฌธ์์ด ์ธ๋ฑ์ฑ / ์ฌ๋ผ์ด์ฑ
- charAt(i): i ๋ฒ์ ์ฒดํฌ ํ์ (IndexOutOfBoundsException ์์ธ ๋ฐ์ ๊ฐ๋ฅ)
- ๋ณต์ก๋:
- charAt == O(1)
- substring == O(k) (k=์๋ผ๋ธ ๊ธธ์ด; Java 9+๋ ์ ๋ฐฐ์ด ๋ณต์ฌ)
- substring์ด ์๋ผ๋ธ ๋ถ๋ถ์ ์ char ๋ฐฐ์ด๋ก ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ์๋ณธ๊ณผ๋ ๋ ๋ฆฝ์ ์ธ ๋ฌธ์์ด์ด ๋๋ ์๋ผ๋ผ ๋๋ง๋ค ์ ๋ฐฐ์ด์ด ๋ง๋ค์ด์ ธ ๋ณต์ฌ ๋น์ฉ O(k)์ด ํ์!
String s = "Hello";
char c = s.charAt(1); // 'e' (0-based)
String sub = s.substring(1, 4); // "ell" (start ์ธ๋ฑ์ค๋ ํฌํจ, end ์ธ๋ฑ์ค ์ ์ธ)
โ ํน์ ๋ฌธ์๊ฐ ์๋์ง ํ์ธ
- contains๋ ๋ถ๋ถ๋ฌธ์์ด ๊ฒ์, ๋ฌธ์ ๊ฒ์์ indexOf(char)๊ฐ ๊ฐ๋จ
- contains("str")๋ ๋ด๋ถ์ ์ผ๋ก ๊ฒฐ๊ตญ indexOf("str") >= 0 ๋ก์ง์ ํธ์ถ.
- ๋ถ๋ถ๋ฌธ์์ด: contains๊ฐ ๋ ์ฝ๊ธฐ์ ์ง๊ด์ .
- ๋จ์ผ ๋ฌธ์: indexOf(char)๊ฐ ๋งค๊ฐ๋ณ์ ๋ณํ ์์ด ๋ฐ๋ก ์ธ ์ ์์ด ๊ฐ๋จํ๋ค๋ ๋ป.
- ๋ณต์ก๋: ํ๊ท O(n) (๋ถ๋ถ๋ฌธ์์ด ๊ธธ์ด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง)
boolean has = s.contains("ell"); // true
// ํ ๋ฌธ์๋ฉด:
boolean hasChar = s.indexOf('e') >= 0;
โ ๋ฌธ์์ด์ด ๊ฐ์์ง ๋น๊ต
- ์ ๋ == ๋ก ๋น๊ตํ์ง ์๊ธฐ. ํญ์ equals ์ฌ์ฉ.
- **== ๋ ๋ ํผ๋ฐ์ค(์ฃผ์)๋ฅผ** ๋น๊ต.
- "ABC" ๋ฆฌํฐ๋ด์ ํ(pool)์ ์ฌ๋ผ๊ฐ์ ๋์ผํ ์ ์์ง๋ง, new String("ABC")๋ก ๋ง๋ค๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋จ
- equals: ๋ด์ฉ(๋ฌธ์์ด ๊ฐ) ๋น๊ต. ๋ฌธ์์ด์ด ๊ฐ์ผ๋ฉด true.
- ๋ณต์ก๋: ์ต์
์ธ ๊ฒฝ์ฐ O(n)
- equals๋ ๋ ๋ฌธ์์ด์ ์์์๋ถํฐ ์ฐจ๋ก๋ก ๋น๊ตํ๋ค๊ฐ ๋ค๋ฅด๋ฉด ๋ฐ๋ก ์ค๋จ.
- ๋ ๋ฌธ์์ด์ด ๋๊น์ง ๋๊ฐ๊ฑฐ๋ ๋ง์ง๋ง์๋ง ๋ค๋ฅผ ๊ฒฝ์ฐ ์ ๋ถ ๋น๊ตํด์ผ ํ๋ฏ๋ก ์ต์ O(n)์ด ๋จ.
String a = "ABC", b = new String("ABC");
boolean eq = a.equals(b); // true (๊ฐ ๋น๊ต)
boolean eqIgnore = a.equalsIgnoreCase("abc"); // true
โ ๋ฌธ์์ด ๊ธธ์ด ๋ฐํ
- UTF-16 ์ฝ๋ ์ ๋ ์๋ฅผ ๊ธธ์ด๋ก ๋ฐํ
- ์ด๋ชจ์ง ๋ฑ์ ์ฝ๋ํฌ์ธํธ ๊ธธ์ด๋ s.codePointCount(0, s.length())
- ๋ณต์ก๋: O(1)
int len = s.length();
โ ํน์ ๋ฌธ์์ ์ธ๋ฑ์ค ๊ฐ ์ฐพ๊ธฐ
- ๋ฌธ์๋ฅผ ์ฐพ์ง ๋ชปํ๋ฉด -1 ๋ฐํ.
- ๋ณต์ก๋: O(n)
int i1 = s.indexOf('l'); // ์ฒซ ๋ฒ์งธ 'l' → 2
int i2 = s.indexOf("lo"); // "lo" ์์ ์ธ๋ฑ์ค → 3
int i3 = s.lastIndexOf('l'); // ๋ง์ง๋ง 'l' → 3
โ ๋ฌธ์์ด์ ๊ตฌ๋ถ์ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ ํฉ์น๊ธฐ
- split์ ์ ๊ท์ ๊ธฐ๋ฐ์ผ๋ก ๋๋
- ๋ฉํ๋ฌธ์(์: . | ? *๋ฑ) ์ฐ๋ฉด ์ด์ค์ผ์ดํ ํ์: "\.", "\|"
- ๋จ์ ๊ตฌ๋ถ์ด๋ฉด StringTokenizer๋ ์๋ ํ์ฑ, ๋๋ Pattern ์ฌ์ฌ์ฉ์ผ๋ก ๋น์ฉ ์ ๊ฐ ๊ฐ๋ฅ
- StringTokenizer: "a,b,c" ๊ฐ์ ๋ฌธ์์ด์ ๊ตฌ๋ถ์ ๋จ์๋ก ์๋ผ ์์ฐจ์ ์ผ๋ก ๊บผ๋ด๋ ๊ธฐ๋ฅ ์ ๊ณต. (Java์ ์๋ ํด๋์ค)
- split(",") ๊ฐ์ ์ ๊ท์์ ํธ์ถ ๋๋ง๋ค ์ ๊ท์ ํจํด์ ์๋ก ์ปดํ์ผํด ๋น์ฉ์ด ๋ฐ์ํจ.
์์ฃผ ์ฐ๋ ํจํด์ ๋ฏธ๋ฆฌ Pattern.compile(",") ํด๋๊ณ ์ฌ์ฌ์ฉํ๋ฉด ๋ ํจ์จ์ .
- String.join(delimiter, parts)๋ NullPointerException์ ์ฃผ์ํด์ผ ํจ (๋ฐฐ์ด ์์๊ฐ null์ด๋ฉด ์์ธ).
- ๋ณต์ก๋: O(n)
String csv = "a,b,c";
String[] parts = csv.split(","); // ["a","b","c"] (์ ๊ท์!)
String joined = String.join("-", parts); // "a-b-c"
โ ๋ฌธ์์ด ๋์๋ฌธ์ ๋ณํ
- ์ง์ญํ ์ด์๊ฐ ์์ผ๋ฉด toUpperCase(Locale.ROOT) ๊ถ์ฅ.
- Locale.ROOT = ์ธ์ด/์ง์ญ์ ์ํฅ์ ๋ฐ์ง ์๋ ์ค๋ฆฝ์ ๋ก์ผ์ผ.
- ๋ณต์ก๋: O(n).
String up = s.toUpperCase(); // "HELLO"
String low = s.toLowerCase(); // "hello"
โ ๊ธฐ์กด ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์นํ
- ์ ๊ท์์ด ํ์ ์์ผ๋ฉด replace ์ฌ์ฉ(๋น ๋ฅด๊ณ ์์ ).
- replaceAll/First๋ ์ ๊ท์์ ์ธ์๋ก ๋ฐ์.
- ๋ณต์ก๋: O(n)~O(n*k) (ํจํด ๋ณต์ก๋์ ์ข์ฐ).
- ์ ๊ท์ ์์ง์ด ํจํด์ ํด์ํ๋ ๊ณผ์ ์ด ํ์ํจ.
- ๋จ์ ์นํ: "abc".replace("a","b") → ๋ฌธ์ ๊ทธ๋๋ก ์นํ์ด๋ผ ๋น ๋ฆ.
- ์ ๊ท์ ์นํ: "abc".replaceAll(".","b") → ์ ๊ท์ ํด์ + ๋งค์นญ ๊ณผ์ ์ด ์ถ๊ฐ๋ผ ๋ ๋๋ฆด ์ ์์
String r1 = s.replace('l', 'L'); // ๋ฌธ์ ์นํ (๋น์ ๊ท์)
String r2 = s.replace("ll", "LL"); // ๋ฌธ์์ด ์นํ (๋น์ ๊ท์)
String r3 = s.replaceFirst("\\d+", "#"); // ์ ๊ท์ ์ฒซ ๋งค์น๋ง
String r4 = s.replaceAll("\\s+", " "); // ์ ๊ท์ ์ ์ฒด ๋งค์น
โ ์์ชฝ ๋์์ ํน์ ๋ฌธ์(ํน์ ๊ณต๋ฐฑ) ์ ๊ฑฐ
- trim(): ์๋ ๋ฉ์๋. 0~32 ๋ฒ์์ ASCII ์ ์ด๋ฌธ์ + ๊ณต๋ฐฑ๋ง ์ ๊ฑฐ. (์: \u0020 ์คํ์ด์ค)
- strip(): Java 11 ๋์
. ๋ชจ๋ ์ ๋์ฝ๋ ๊ณต๋ฐฑ ์ ๊ฑฐ. (์: \u2003 EM SPACE ๊ฐ์ ๊ฒ๋ ์ ๊ฑฐ๋จ)
- EM SPACE (U+2003) = ์ ๋์ฝ๋์์ ์ ์๋ ํน์ ๊ณต๋ฐฑ ๋ฌธ์.
๋ณดํต ๋๋ฌธ์ "M"์ ํญ๋งํผ ๋์ ๋น์นธ์ ์๋ฏธ (์ผ๋ฐ ์คํ์ด์ค๋ณด๋ค ํจ์ฌ ํผ)
- EM SPACE (U+2003) = ์ ๋์ฝ๋์์ ์ ์๋ ํน์ ๊ณต๋ฐฑ ๋ฌธ์.
- ๐ ๊ตญ์ ํ ํ๊ฒฝ(ํ๊ธ, ์ผ๋ณธ์ด, ํน์ ๊ณต๋ฐฑ ํฌํจ)์์๋ strip์ ๊ถ์ฅ.
- ๋ณต์ก๋: O(n)
String t1 = " hi ".trim(); // ์๋ค ๊ณต๋ฐฑ ์ ๊ฑฐ (ASCII ๊ณต๋ฐฑ ์ค์ฌ)
String t2 = " hi ".strip(); // ์๋ค ์ ๋์ฝ๋ ๊ณต๋ฐฑ ์ ๊ฑฐ (Java 11+)
String t3 = "---hi---".replaceAll("^-+|-+$", ""); // ํน์ ๋ฌธ์('-') ์ ๊ฑฐ(์ ๊ท์)
โ ์์คํค์ฝ๋๋ก ๋ณํ ํน์ ๋์ ๋น๊ต
- ๋ฌธ์์ด ์ ๋ ฌ/์ฐ์ ์์๋ compareTo ๊ธฐ์ค(์ฌ์ ์).
- ๋ก์ผ์ผ ๋ฏผ๊ฐ๋ ํ์ํ๋ฉด Collator.
- ๋ณต์ก๋: ํ๊ท O(k) (k=๋น๊ต ์ค ์๋ถ๋ถ์ด ๊ฐ์ ๊ธธ์ด).
char ch = 'A';
int code = (int) ch; // 65 (UTF-16 ์ฝ๋ ์ ๋ ๊ฐ, ASCII ํธํ ๊ตฌ๊ฐ ๋์ผ)
int cmp1 = "Apple".compareTo("Banana"); // ์์(์ฌ์ ์ ์)
int cmp2 = "a".compareToIgnoreCase("A"); // 0
int cmp3 = Character.compare('a', 'b'); // -1
โ ๋ฌธ์์ด ์ฑ๋ฅ ์์ ๊ฐ์ด๋
1. ๋ฌธ์์ด ๋ฐ๋ณต ์ฐ๊ฒฐ์ StringBuilder ์ฌ์ฉ
StringBuilder sb = new StringBuilder();
for (String p : parts) sb.append(p);
String out = sb.toString();
2. ๋น๋ฒํ ์ ๊ท์์ Pattern์ ์บ์ฑ
- split, replaceAll, matches ๊ฐ์ ๋ฉ์๋๋ ๋ด๋ถ์ ์ผ๋ก ์ ๊ท์์ ๋ฌธ์์ด๋ก ๋ฐ์์ → Pattern.compile()์ ์คํ.
- Pattern์ ์ ๊ท์์ ๋ฏธ๋ฆฌ ์ปดํ์ผํด๋์ ๊ฐ์ฒด.
- ๋ฌธ์์ด๋ก split(","), replaceAll("\s+"," ")๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ ๊ท์์ด ๋งค๋ฒ ์ปดํ์ผ๋จ!
- Pattern.compile()์ ํ ๋ฒ ํด๋๊ณ ์ฌ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ์ต์ ํ์ ์ ๋ฆฌ.
// 1) Pattern ๊ฐ์ฒด ์์ฑ (์ ๊ท์ ์ปดํ์ผ)
Pattern pattern = Pattern.compile("\\s+"); // ํ๋ ์ด์์ ๊ณต๋ฐฑ์ ์ฐพ๋ ํจํด
// 2) Matcher ์์ฑ
Matcher matcher = pattern.matcher("Hello World Java");
// 3) replaceAll ์ฌ์ฉ
String result = matcher.replaceAll(" ");
System.out.println(result); // "Hello World Java"
// ์์ฃผ ์ฐ๋ ๋ฉ์๋
// Pattern.compile(String regex) : ์ ๊ท์ ํจํด์ ๊ฐ์ฒด๋ก ์ปดํ์ผ
// matcher(CharSequence input) : ์
๋ ฅ ๋ฌธ์์ด์ ๋ํด Matcher ์์ฑ
// split(CharSequence input) : ์
๋ ฅ ๋ฌธ์์ด์ ์ ๊ท์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ
// Pattern.matches(regex, input) : ์ ๊ท์์ด ์
๋ ฅ ์ ์ฒด์ ์ผ์นํ๋์ง ํ์ธ (์ ์ ๋ฉ์๋)
// "String.split()๊ณผ Pattern.split()์ ์ฐจ์ด๋?"
// → ์ ์๋ ๋งค๋ฒ ํจํด ์ปดํ์ผ, ํ์๋ ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ํจํด ์ฌ์ฌ์ฉ.
3. ๋ฌธ์์ด ๋ด์ฉ ๋น๊ต ์ ** == ์ฌ์ฉ ๊ธ์ง**, ํญ์ equals / equalsIgnoreCase ์ฌ์ฉ.
4. ์ ๋์ฝ๋ ์ด์(์ด๋ชจ์ง, ๊ฒฐํฉ ๋ฌธ์)์ codePoints()๋ Normalizer ๊ณ ๋ ค.
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์๋ฃ๊ตฌ์กฐ (Data Structures) - Collection 2. Set ๊ณ์ด (0) | 2025.09.05 |
---|---|
[Java] ์๋ฃ๊ตฌ์กฐ (Data Structures) - Collection 1. List ๊ณ์ด (0) | 2025.09.04 |
[๊ธฐ์ด ์ํ 1] GCD/LCM (์ต๋๊ณต์ฝ์, ์ต์๊ณต๋ฐฐ์) (0) | 2025.09.03 |
์๊ณ ๋ฆฌ์ฆ / ์๋ฃ๊ตฌ์กฐ / ๋ณต์ก๋ (5) | 2025.08.19 |
๋๊ธ