λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Java

[Java]μžλ°” 문자 νƒ€μž… : λ¬Έμžμ—΄ 처리의 핡심과 String vs. char νƒ€μž… 비ꡐ

by YJ Dev 2024. 4. 22.
728x90
λ°˜μ‘ν˜•
SMALL

μžλ°” ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ¬Έμžμ—΄κ³Ό 문자 νƒ€μž…μ€ 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. 이 λ‘˜μ€ ν”„λ‘œκ·Έλž¨μ—μ„œ ν…μŠ€νŠΈ 데이터λ₯Ό λ‹€λ£¨λŠ” 데 ν•„μˆ˜μ μ΄λ©°, μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ 예기치 λͺ»ν•œ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” μžλ°”μ—μ„œ 문자 νƒ€μž…μ„ ν™œμš©ν•˜λŠ” 방법과 λ¬Έμžμ—΄ 처리의 핡심에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μžλ°” λ¬Έμžνƒ€μž…


1. λ¬Έμžμ—΄ νƒ€μž… : StringπŸ’¬

String ν΄λž˜μŠ€λŠ” μžλ°”μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” 클래슀 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. ν°λ”°μ˜΄ν‘œλ‘œ 감싼 λ¬Έμžμ—΄μ„ λ³€μˆ˜μ— μ €μž₯ν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€. λ¬Έμžμ—΄μ„ λ‹€λ£¨λŠ”λ° ν•„μš”ν•œ λ‹€μ–‘ν•œ λ©”μ„œλ“œμ™€ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

// 예제 μ½”λ“œ: String 클래슀 ν™œμš©
public class StringExample {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "World";

        // λ¬Έμžμ—΄ μ—°κ²°
        String result = str1 + " " + str2;
        System.out.println("κ²°κ³Ό: " + result);

        // λ¬Έμžμ—΄ 길이 κ΅¬ν•˜κΈ°
        int length = result.length();
        System.out.println("길이: " + length);

        // λ¬Έμžμ—΄ 비ꡐ
        boolean isEqual = str1.equals(str2);
        System.out.println("λ™μΌν•œ λ¬Έμžμ—΄μΈκ°€μš”? " + isEqual);
    }
}

2. μ΄μŠ€μΌ€μ΄ν”„ 문자🧷

μ΄μŠ€μΌ€μ΄ν”„ λ¬ΈμžλŠ” μ—­μŠ¬λž˜μ‹œ(\)와 νŠΉμ • λ¬Έμžκ°€ κ²°ν•©ν•˜μ—¬ μ‚¬μš©λ˜λŠ” νŠΉλ³„ν•œ λ¬Έμžμž…λ‹ˆλ‹€. μ΄μŠ€μΌ€μ΄ν”„ 문자λ₯Ό μ‚¬μš©ν•˜λ©΄ λ¬Έμžμ—΄ μ•ˆμ— νŠΉμˆ˜ν•œ 문자λ₯Ό μ‚½μž…ν•˜κ±°λ‚˜ νŠΉμˆ˜ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ‡ 가지 μ£Όμš”ν•œ μ΄μŠ€μΌ€μ΄ν”„ λ¬Έμžλ“€μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€:

  1. \n: μƒˆ 쀄(쀄 λ°”κΏˆ)
  2. \t: μˆ˜ν‰ νƒ­
  3. \\: μ—­μŠ¬λž˜μ‹œ 문자 자체
  4. \": ν°λ”°μ˜΄ν‘œ
  5. \': μž‘μ€λ”°μ˜΄ν‘œ
// μ΄μŠ€μΌ€μ΄ν”„ 문자 예제
public class EscapeCharactersExample {
    public static void main(String[] args) {
        // 쀄 λ°”κΏˆ 문자(\n)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄μ„ μ—¬λŸ¬ μ€„λ‘œ 좜λ ₯
        System.out.println("μ—¬λŸ¬ μ€„λ‘œ\nλ‚˜λˆ μ„œ\n좜λ ₯ν•˜κΈ°");

        // μˆ˜ν‰ νƒ­(\t)을 μ‚¬μš©ν•˜μ—¬ 간격을 μ‘°μ ˆν•˜μ—¬ 좜λ ₯
        System.out.println("νƒ­\t을\tμ‚¬μš©ν•œ\t좜λ ₯");

        // μ—­μŠ¬λž˜μ‹œ 자체λ₯Ό 좜λ ₯
        System.out.println("μ—­μŠ¬λž˜μ‹œ 좜λ ₯: \\");

        // ν°λ”°μ˜΄ν‘œλ₯Ό λ¬Έμžμ—΄ μ•ˆμ— 좜λ ₯
        System.out.println("이 λ¬Έμžμ—΄μ€ ν°λ”°μ˜΄ν‘œ(\")λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.");

        // μž‘μ€λ”°μ˜΄ν‘œλ₯Ό λ¬Έμžμ—΄ μ•ˆμ— 좜λ ₯
        System.out.println("이 λ¬Έμžμ—΄μ€ μž‘μ€λ”°μ˜΄ν‘œ(\')λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.");
    }
}

3. ν…μŠ€νŠΈ λΈ”λ‘πŸ’«

ν…μŠ€νŠΈ 블둝은 μžλ°” 13λΆ€ν„° λ„μž…λœ κΈ°λŠ₯으둜, ν°λ”°μ˜΄ν‘œ 3개(""")둜 감싼 λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ„ λ§ν•©λ‹ˆλ‹€. 이λ₯Ό μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ 쀄에 걸친 λ¬Έμžμ—΄μ„ 보닀 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν…μŠ€νŠΈ 블둝은 λ¬Έμžμ—΄μ„ 보닀 직관적이고 κ°„νŽΈν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κΈ°λŠ₯으둜, μ½”λ“œμ˜ 가독성을 ν–₯μƒν•˜κ³  λ¬Έμžμ—΄ μž‘μ„±μ˜ λ²ˆκ±°λ‘œμ›€μ„ μ€„μ—¬μ€λ‹ˆλ‹€. 특히, JSONμ΄λ‚˜ HTMLκ³Ό 같은 κ΅¬μ‘°ν™”λœ λ¬Έμžμ—΄μ„ 생성할 λ•Œ μœ μš©ν•˜κ²Œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

public class TextBlockExample {
    public static void main(String[] args) {
        // κΈ°μ‘΄ λ¬Έμžμ—΄ μž‘μ„± 방식
        String regularString = "Hello,\n" +
                               "World!\n" +
                               "This is\n" +
                               "a regular string.";

        // ν…μŠ€νŠΈ 블둝을 μ‚¬μš©ν•œ λ¬Έμžμ—΄ μž‘μ„±
        String textBlockString = """
            Hello,
            World!
            This is
            a text block string.
        """;

        // λ¬Έμžμ—΄ 좜λ ₯
        System.out.println("Regular String:");
        System.out.println(regularString);

        System.out.println("\nText Block String:");
        System.out.println(textBlockString);
    }
}

3. 문자 νƒ€μž… : charπŸ…°

μž‘μ€λ”°μ˜΄ν‘œλ‘œ 감싼 문자λ₯Ό 문자 λ¦¬ν„°λŸ΄μ΄λΌκ³  ν•˜λ©°, μ΄λŠ” μœ λ‹ˆμ½”λ“œλ‘œ λ³€ν™˜λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€. μœ λ‹ˆμ½”λ“œλŠ” μ „ 세계 λͺ¨λ“  문자λ₯Ό λ‹€λ£° 수 μžˆλŠ” ν‘œμ€€ 인코딩 λ°©μ‹μž…λ‹ˆλ‹€. UTF-8은 μ΄λŸ¬ν•œ μœ λ‹ˆμ½”λ“œλ₯Ό κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” ν˜•μ‹ 쀑 ν•˜λ‚˜λ‘œ ν‘œν˜„ν•˜λŠ” 방식 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. μœ λ‹ˆμ½”λ“œλŠ” 세계 각ꡭ의 문자λ₯Ό 0λΆ€ν„° 65535κΉŒμ§€μ˜ 숫자둜 λ§€ν•‘ν•œ ꡭ제 ν‘œμ€€ κ·œμ•½μž…λ‹ˆλ‹€. μžλ°”λŠ” μ΄λŸ¬ν•œ μœ λ‹ˆμ½”λ“œλ₯Ό μ €μž₯ν•  수 μžˆλ„λ‘ char νƒ€μž…μ„ μ œκ³΅ν•©λ‹ˆλ‹€. μœ λ‹ˆμ½”λ“œλŠ” μ •μˆ˜λ‘œ ν‘œν˜„λ˜λ―€λ‘œ char νƒ€μž…μ€ μ •μˆ˜ νƒ€μž…μ— μ†ν•©λ‹ˆλ‹€. λ”°λΌμ„œ char λ³€μˆ˜μ—λŠ” μž‘μ€λ”°μ˜΄ν‘œλ‘œ 감싼 문자 λŒ€μ‹ μ— μœ λ‹ˆμ½”λ“œ 숫자λ₯Ό 직접 λŒ€μž…ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ char νƒ€μž…μ˜ λ³€μˆ˜μ— μ–΄λ–€ λ¬Έμžλ„ λŒ€μž…ν•˜μ§€ μ•Šκ³  λ‹¨μˆœνžˆ μ΄ˆκΈ°ν™”ν•˜λ €λŠ” 경우 μž‘μ€λ”°μ˜΄ν‘œλ₯Ό 두 개 연달아 λΆ™μ—¬ 빈 문자λ₯Ό λŒ€μž…ν•˜λ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€. 이 경우 곡백(μœ λ‹ˆμ½”λ“œ: 32) ν•˜λ‚˜λ₯Ό ν¬ν•¨ν•˜μ—¬ μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

단일 문자 μ €μž₯을 μœ„ν•΄μ„œ ν‘œμ€€ν™”λœ ASCII μ½”λ“œν‘œλ₯Ό μ°Έκ³ ν•˜λŠ”λ° 문자 λ˜λŠ” 숫자λ₯Ό λΉ„νŠΈμ—΄λ‘œ μ €μž₯ν•©λ‹ˆλ‹€. ASCII(λ―Έκ΅­ 정보 κ΅ν™˜ ν‘œμ€€ λΆ€ν˜Έ)λŠ” μ»΄ν“¨ν„°μ—μ„œ ν…μŠ€νŠΈλ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ ν‘œμ€€ 인코딩 방식 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. ASCII μ½”λ“œν‘œλŠ” 각 문자λ₯Ό 7λΉ„νŠΈ μ΄μ§„μˆ˜λ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€. μ΄μ§„μˆ˜λŠ” 0κ³Ό 1둜 이루어진 λΉ„νŠΈ(bit) μ—΄μž…λ‹ˆλ‹€. 각 λ¬Έμžμ— λŒ€ν•΄ κ³ μœ ν•œ 7λΉ„νŠΈ μ΄μ§„μˆ˜ μ½”λ“œκ°€ ν• λ‹Ήλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λŒ€λ¬Έμž 'A'의 ASCII μ½”λ“œλŠ” 65이며, μ΄λŠ” μ΄μ§„μˆ˜λ‘œλŠ” 01000001둜 ν‘œν˜„λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ»΄ν“¨ν„°λŠ” 문자 'A'λ₯Ό μ΄μ§„μˆ˜ 01000001둜 μ €μž₯ν•©λ‹ˆλ‹€. 이와 같은 λ°©μ‹μœΌλ‘œ ASCII μ½”λ“œν‘œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈμ˜ 각 문자λ₯Ό μ»΄ν“¨ν„°μ—μ„œ μ €μž₯ν•˜κ³  μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// 예제 μ½”λ“œ: char νƒ€μž… ν™œμš©
public class CharExample {
    public static void main(String[] args) {
        char ch = 'A'; // char λ³€μˆ˜ chλ₯Ό μ„ μ–Έν•˜κ³  'A'λ₯Ό ν• λ‹Ή
        System.out.println("문자: " + ch); // ch에 μ €μž₯된 문자 좜λ ₯

        // μœ λ‹ˆμ½”λ“œ κ°’ 확인
        int unicodeValue = (int) ch; // ch의 μœ λ‹ˆμ½”λ“œ 값을 int둜 λ³€ν™˜ν•˜μ—¬ unicodeValue에 μ €μž₯
        System.out.println("μœ λ‹ˆμ½”λ“œ κ°’: " + unicodeValue); // μœ λ‹ˆμ½”λ“œ κ°’ 좜λ ₯
    }
}

4. String vs. char νƒ€μž… λΉ„κ΅πŸ™‰

  1. String (λ¬Έμžμ—΄):
    • μž₯점:
      • μ—¬λŸ¬ 문자λ₯Ό ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 μžˆμ–΄ λ¬Έμžμ—΄μ„ λ‹€λ£¨λŠ” 데 νŽΈλ¦¬ν•©λ‹ˆλ‹€.
      • λ¬Έμžμ—΄ κ²°ν•©, λΆ„ν• , 검색 λ“± λ‹€μ–‘ν•œ λ¬Έμžμ—΄ μ‘°μž‘ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • 단점:
      • λΆˆλ³€(immutable)ν•˜λ―€λ‘œ λ¬Έμžμ—΄μ„ μˆ˜μ •ν•  λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜κ³  κΈ°μ‘΄ κ°μ²΄λŠ” 가비지 μ»¬λ ‰μ…˜μ˜ λŒ€μƒμ΄ λ©λ‹ˆλ‹€.
      • λ¬Έμžμ—΄ μ²˜λ¦¬μ— ν•„μš”ν•œ μΆ”κ°€ λ©”λͺ¨λ¦¬ 및 μ—°μ‚° λΉ„μš©μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. char (문자):
    • μž₯점:
      • 단일 문자λ₯Ό μ €μž₯ν•˜λŠ” 데 νš¨μœ¨μ μž…λ‹ˆλ‹€.
      • λΆˆλ³€ νƒ€μž…μ΄ μ•„λ‹ˆλ―€λ‘œ ν•„μš”ν•œ 경우 문자λ₯Ό 직접 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 단점:
      • 단일 문자만 μ²˜λ¦¬ν•  수 μžˆμœΌλ―€λ‘œ μ—¬λŸ¬ 문자λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” 반볡문 등을 μ‚¬μš©ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
      • λ¬Έμžμ—΄ μ‘°μž‘ κΈ°λŠ₯이 μ œν•œμ μ΄λ©°, λ³΅μž‘ν•œ λ¬Έμžμ—΄ μ²˜λ¦¬μ—λŠ” μ ν•©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  3. μ‚¬μš© 사둀와 예제 μ½”λ“œ
    • String μ‚¬μš© 사둀 :
      • λ¬Έμžμ—΄μ„ μ €μž₯ν•˜κ³  μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ
      • λ¬Έμžμ—΄μ˜ μ‘°μž‘ 및 검색이 ν•„μš”ν•œ 경우
    • char μ‚¬μš© 사둀:
      • 단일 문자λ₯Ό μ €μž₯ν•˜κ³  μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ
      • λ¬Έμžμ—΄λ³΄λ‹€ κ°„λ‹¨ν•œ 문자 μ²˜λ¦¬κ°€ ν•„μš”ν•œ 경우
// String μ‚¬μš© 예제
String str = "Hello, World!";
System.out.println("λ¬Έμžμ—΄ 길이: " + str.length()); // λ¬Έμžμ—΄ 길이 좜λ ₯
System.out.println("첫 번째 문자: " + str.charAt(0)); // 첫 번째 문자 좜λ ₯

// char μ‚¬μš© 예제
char ch = 'A';
System.out.println("문자: " + ch); // 문자 좜λ ₯
System.out.println("문자 μœ λ‹ˆμ½”λ“œ κ°’: " + (int) ch); // 문자의 μœ λ‹ˆμ½”λ“œ κ°’ 좜λ ₯

5. 핡심 λ‚΄μš©πŸ‘€

string, char 비ꡐ
μ΄μŠ€μΌ€μ΄ν”„ 문자
charνƒ€μž…

728x90
λ°˜μ‘ν˜•