Java 에서 유니코드 문자 다루는 방법

JavaBeginner
지금 연습하기

소개

Java 는 유니코드 문자를 처리하는 강력한 지원을 제공하여 국제적인 애플리케이션 개발에 탁월한 선택입니다. 유니코드는 플랫폼, 프로그램 또는 언어에 관계없이 모든 문자에 고유한 숫자를 할당하는 범용 문자 인코딩 표준입니다.

이 튜토리얼에서는 실용적인 예제를 통해 Java 에서 유니코드를 사용하는 방법을 살펴보겠습니다. 코드에서 유니코드 문자를 표현하고, 프로그래밍 방식으로 조작하며, 유니코드 입출력 작업을 처리하는 방법을 배우게 됩니다. 이 랩을 마치면 Java 애플리케이션에서 국제 텍스트를 자신 있게 사용할 수 있게 됩니다.

첫 번째 유니코드 Java 프로그램 만들기

이 단계에서는 유니코드 문자를 사용하는 첫 번째 Java 프로그램을 만들 것입니다. Java 가 유니코드를 처리하는 방식을 살펴보고 코드에 다양한 언어의 문자를 통합하는 방법을 알아보겠습니다.

Java 에서 유니코드 이해하기

Java 는 내부적으로 UTF-16 인코딩을 사용합니다. 즉, Java 의 각 문자는 16 비트 유니코드 문자로 표현됩니다. 이를 통해 Java 는 광범위한 국제 문자를 기본적으로 지원할 수 있습니다.

각 유니코드 문자는 문자를 식별하는 숫자 값인 고유한 코드 포인트 (code point) 를 갖습니다. 예를 들어:

  • 영어 문자 'A'는 코드 포인트 U+0041 을 갖습니다.
  • 중국어 문자 '中'은 코드 포인트 U+4E2D 을 갖습니다.
  • 이모지 '😀'는 코드 포인트 U+1F600 을 갖습니다.

유니코드 문자의 사용을 보여주는 간단한 Java 프로그램을 만들어 보겠습니다.

프로그램 생성 및 실행

  1. WebIDE 를 열고 터미널로 이동합니다. /home/labex/project 디렉토리에 있는지 확인합니다.

  2. WebIDE 편집기를 사용하여 UnicodeDemo.java라는 새 Java 파일을 만듭니다. 왼쪽 사이드바에서 "Explorer" 아이콘을 클릭한 다음 "New File" 아이콘을 클릭하고 이름을 UnicodeDemo.java로 지정합니다.

  3. 다음 코드를 파일에 추가합니다.

public class UnicodeDemo {
    public static void main(String[] args) {
        // Unicode characters from different languages
        String english = "Hello";
        String spanish = "Hola";
        String french = "Bonjour";
        String chinese = "你好";
        String japanese = "こんにちは";
        String arabic = "مرحبا";
        String russian = "Привет";

        // Print all greetings
        System.out.println("English: " + english);
        System.out.println("Spanish: " + spanish);
        System.out.println("French: " + french);
        System.out.println("Chinese: " + chinese);
        System.out.println("Japanese: " + japanese);
        System.out.println("Arabic: " + arabic);
        System.out.println("Russian: " + russian);

        // Print information about a specific character
        char chineseChar = '中';
        System.out.println("\nInformation about the character '" + chineseChar + "':");
        System.out.println("Unicode code point: " + Integer.toHexString(chineseChar | 0x10000).substring(1).toUpperCase());
        System.out.println("Character type: " + Character.getType(chineseChar));
    }
}
  1. Ctrl+S를 누르거나 메뉴에서 File > Save 를 선택하여 파일을 저장합니다.

  2. 터미널에서 다음 명령을 실행하여 프로그램을 컴파일하고 실행합니다.

javac UnicodeDemo.java
java UnicodeDemo

다음과 유사한 출력을 볼 수 있습니다.

English: Hello
Spanish: Hola
French: Bonjour
Chinese: 你好
Japanese: こんにちは
Arabic: مرحبا
Russian: Привет

Information about the character '中':
Unicode code point: 4E2D
Character type: 5

출력 이해하기

이 프로그램은 다양한 언어로 인사를 성공적으로 표시하여 Java 의 유니코드 지원을 보여줍니다. 문자 유형 값 "5"는 Java 의 Character 클래스에서 Character.OTHER_LETTER에 해당하며, '中'이 대문자도 소문자도 아닌 문자로 분류됨을 나타냅니다.

이 예제는 Java 가 특별한 구성 없이도 다양한 문자 체계의 문자를 처리할 수 있음을 보여줍니다. 유니코드 문자는 소스 코드에 직접 포함되며 Java 는 이를 올바르게 처리하고 표시합니다.

유니코드 이스케이프 시퀀스 사용하기

이 단계에서는 Java 에서 이스케이프 시퀀스를 사용하여 유니코드 문자를 표현하는 방법을 배우겠습니다. 이는 코드에 유니코드 문자를 포함해야 하지만 해당 문자의 직접 입력을 지원하지 않을 수 있는 텍스트 편집기 또는 환경과의 호환성을 보장하려는 경우에 유용합니다.

유니코드 이스케이프 시퀀스

Java 에서는 \u 이스케이프 시퀀스 뒤에 4 자리 16 진수 코드 포인트를 사용하여 모든 유니코드 문자를 표현할 수 있습니다. 예를 들어:

  • \u0041은 'A'를 나타냅니다.
  • \u4E2D는 '中'을 나타냅니다.

기본 다국어 평면 (BMP, Basic Multilingual Plane) 을 벗어나는 문자의 경우, 4 자리 16 진수 이상이 필요한 경우, Java 12 이상에서 서러게이트 쌍 (surrogate pairs) 또는 새로운 \u{...} 구문을 문자열 리터럴에서 사용할 수 있습니다.

유니코드 이스케이프 시퀀스를 보여주는 새 프로그램을 만들어 보겠습니다.

프로그램 만들기

  1. /home/labex/project 디렉토리에 UnicodeEscapeDemo.java라는 새 파일을 만듭니다.

  2. 다음 코드를 파일에 추가합니다.

public class UnicodeEscapeDemo {
    public static void main(String[] args) {
        // Unicode escape sequences
        char charA = '\u0041';         // Latin capital 'A'
        char charZ = '\u005A';         // Latin capital 'Z'
        char charCopyright = '\u00A9'; // Copyright symbol ©
        char charEuro = '\u20AC';      // Euro symbol €
        char charChinese = '\u4E2D';   // Chinese character '中'

        System.out.println("Using Unicode escape sequences:");
        System.out.println("\\u0041: " + charA);
        System.out.println("\\u005A: " + charZ);
        System.out.println("\\u00A9: " + charCopyright);
        System.out.println("\\u20AC: " + charEuro);
        System.out.println("\\u4E2D: " + charChinese);

        // Comparing direct characters and escape sequences
        System.out.println("\nComparing direct characters and escape sequences:");
        System.out.println("Direct 'A' == \\u0041: " + ('A' == '\u0041'));
        System.out.println("Direct '©' == \\u00A9: " + ('©' == '\u00A9'));
        System.out.println("Direct '中' == \\u4E2D: " + ('中' == '\u4E2D'));

        // Exploring character properties
        System.out.println("\nExploring properties of Unicode characters:");
        examineCharacter('A');
        examineCharacter('9');
        examineCharacter('©');
        examineCharacter('中');
    }

    private static void examineCharacter(char c) {
        System.out.println("\nCharacter: " + c);
        System.out.println("Unicode code point: \\u" +
            Integer.toHexString(c | 0x10000).substring(1).toUpperCase());
        System.out.println("Is letter? " + Character.isLetter(c));
        System.out.println("Is digit? " + Character.isDigit(c));
        System.out.println("Is whitespace? " + Character.isWhitespace(c));
        System.out.println("Is symbol? " + Character.isISOControl(c));
    }
}
  1. Ctrl+S를 누르거나 메뉴에서 File > Save 를 선택하여 파일을 저장합니다.

  2. 터미널에서 다음 명령을 실행하여 프로그램을 컴파일하고 실행합니다.

javac UnicodeEscapeDemo.java
java UnicodeEscapeDemo

다음과 유사한 출력을 볼 수 있습니다.

Using Unicode escape sequences:
\u0041: A
\u005A: Z
\u00A9: ©
\u20AC: €
\u4E2D: 中

Comparing direct characters and escape sequences:
Direct 'A' == \u0041: true
Direct '©' == \u00A9: true
Direct '中' == \u4E2D: true

Exploring properties of Unicode characters:

Character: A
Unicode code point: \u0041
Is letter? true
Is digit? false
Is whitespace? false
Is symbol? false

Character: 9
Unicode code point: \u0039
Is letter? false
Is digit? true
Is whitespace? false
Is symbol? false

Character: ©
Unicode code point: \u00A9
Is letter? false
Is digit? false
Is whitespace? false
Is symbol? false

Character: 中
Unicode code point: \u4E2D
Is letter? true
Is digit? false
Is whitespace? false
Is symbol? false

코드 이해하기

이 프로그램은 몇 가지 중요한 개념을 보여줍니다.

  1. 유니코드 이스케이프 시퀀스 (Unicode Escape Sequences): 유니코드 이스케이프 시퀀스 (\uXXXX) 를 사용하여 문자를 정의합니다.

  2. 문자 동일성: 프로그램은 직접 정의된 문자 ('A') 가 이스케이프 시퀀스 ('u0041') 를 사용하여 정의된 문자와 동일함을 보여줍니다.

  3. 문자 속성: examineCharacter 메서드는 Character 클래스를 사용하여 문자가 문자, 숫자 또는 공백인지 여부와 같은 다양한 유니코드 문자의 속성을 검사합니다.

유니코드 이스케이프 시퀀스를 사용하는 것은 특히 다음과 같은 경우에 유용합니다.

  • 코드가 유니코드를 제대로 처리하지 않는 도구로 처리되어야 하는 경우
  • 소스 코드에서 정확한 코드 포인트를 명시적으로 지정하려는 경우
  • 입력하기 어렵거나 다른 문자와 시각적으로 유사한 문자를 포함해야 하는 경우

파일로 유니코드 읽기 및 쓰기

이 단계에서는 유니코드 문자를 파일로 읽고 쓰는 방법을 배우겠습니다. 특히 국제 텍스트를 다룰 때 파일 작업 시 문자 인코딩을 적절하게 처리하는 것이 중요합니다.

문자 인코딩 이해하기

텍스트를 파일에 쓰거나 파일에서 읽을 때는 문자 인코딩을 지정해야 합니다. 유니코드 텍스트에 가장 일반적이고 권장되는 인코딩은 UTF-8 입니다.

  • UTF-8은 모든 유니코드 문자를 표현할 수 있는 가변 너비 인코딩입니다.
  • ASCII 와 하위 호환됩니다.
  • HTML, XML 및 많은 최신 시스템의 기본 인코딩입니다.

Java 는 UTF-8, UTF-16 및 ISO-8859-1 과 같은 표준 문자 집합에 대한 상수를 포함하는 java.nio.charset.StandardCharsets 클래스를 제공합니다.

유니코드 텍스트를 파일로 읽고 쓰는 것을 보여주는 프로그램을 만들어 보겠습니다.

유니코드 파일 작성기 만들기

  1. /home/labex/project 디렉토리에 UnicodeFileDemo.java라는 새 파일을 만듭니다.

  2. 다음 코드를 파일에 추가합니다.

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.*;

public class UnicodeFileDemo {
    private static final String FILE_PATH = "unicode_sample.txt";

    public static void main(String[] args) {
        try {
            // Create a list of greetings in different languages
            List<String> greetings = Arrays.asList(
                "English: Hello, World!",
                "Spanish: ¡Hola, Mundo!",
                "French: Bonjour, le Monde!",
                "German: Hallo, Welt!",
                "Chinese: 你好,世界!",
                "Japanese: こんにちは、世界!",
                "Arabic: مرحبا بالعالم!",
                "Russian: Привет, мир!",
                "Greek: Γειά σου, Κόσμε!",
                "Hindi: नमस्ते, दुनिया!",
                "Emoji: 👋🌍!"
            );

            // Write greetings to file
            writeToFile(greetings);
            System.out.println("Successfully wrote Unicode text to " + FILE_PATH);

            // Read and display file contents
            List<String> readLines = readFromFile();
            System.out.println("\nFile contents:");
            for (String line : readLines) {
                System.out.println(line);
            }

            // Display encoding information
            System.out.println("\nEncoding information:");
            System.out.println("Default charset: " + System.getProperty("file.encoding"));
            System.out.println("Is UTF-8 supported? " + StandardCharsets.UTF_8.canEncode());

        } catch (IOException e) {
            System.err.println("Error processing the file: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private static void writeToFile(List<String> lines) throws IOException {
        // Write using Files class with UTF-8 encoding
        Files.write(Paths.get(FILE_PATH), lines, StandardCharsets.UTF_8);
    }

    private static List<String> readFromFile() throws IOException {
        // Read using Files class with UTF-8 encoding
        return Files.readAllLines(Paths.get(FILE_PATH), StandardCharsets.UTF_8);
    }
}
  1. Ctrl+S를 누르거나 메뉴에서 File > Save 를 선택하여 파일을 저장합니다.

  2. 터미널에서 다음 명령을 실행하여 프로그램을 컴파일하고 실행합니다.

javac UnicodeFileDemo.java
java UnicodeFileDemo

다음과 유사한 출력을 볼 수 있습니다.

Successfully wrote Unicode text to unicode_sample.txt

File contents:
English: Hello, World!
Spanish: ¡Hola, Mundo!
French: Bonjour, le Monde!
German: Hallo, Welt!
Chinese: 你好,世界!
Japanese: こんにちは、世界!
Arabic: مرحبا بالعالم!
Russian: Привет, мир!
Greek: Γειά σου, Κόσμε!
Hindi: नमस्ते, दुनिया!
Emoji: 👋🌍!

Encoding information:
Default charset: UTF-8
Is UTF-8 supported? true

출력 파일 검토

만든 파일을 살펴보겠습니다.

  1. WebIDE 파일 탐색기를 사용하여 /home/labex/project 디렉토리에 생성된 unicode_sample.txt 파일을 엽니다.

  2. 다양한 언어로 된 모든 인사가 유니코드 문자와 함께 제대로 표시되는 것을 볼 수 있습니다.

코드 이해하기

이 프로그램은 파일에서 유니코드 작업을 수행하는 방법에 대한 몇 가지 주요 사항을 보여줍니다.

  1. 명시적 인코딩 지정: StandardCharsets.UTF_8을 사용하여 파일에 쓰고 읽을 때 UTF-8 인코딩을 명시적으로 지정합니다. 이렇게 하면 유니코드 문자가 올바르게 보존됩니다.

  2. 최신 파일 I/O: 특정 문자 인코딩으로 파일을 읽고 쓰는 데 편리한 메서드를 제공하는 java.nio.file.Files 클래스를 사용합니다.

  3. 기본 인코딩: 이 프로그램은 운영 체제 및 로캘 설정에 따라 달라질 수 있는 시스템의 기본 문자 인코딩을 표시합니다.

  4. 이모지 지원: 이 프로그램에는 Java 와 UTF-8 이 유니코드의 보조 평면 (supplementary planes) 의 문자를 처리할 수 있음을 보여주는 이모지 예제 (👋🌍) 가 포함되어 있습니다.

파일에서 유니코드로 작업할 때는 항상 다음 사항을 기억하십시오.

  • 인코딩을 명시적으로 지정합니다 (가급적 UTF-8).
  • 읽기 및 쓰기에 동일한 인코딩을 사용합니다.
  • 파일 작업 중에 발생할 수 있는 잠재적인 IOException을 처리합니다.
  • 시스템의 기본 인코딩을 알고 있지만, 이에 의존하지 마십시오.

요약

이 튜토리얼에서는 Java 에서 유니코드 문자를 사용하는 데 필요한 필수적인 측면을 배웠습니다. 다음은 지금까지 배운 내용에 대한 요약입니다.

  1. 유니코드 기본 사항: Java 의 내장 유니코드 지원을 보여주는 여러 언어로 텍스트를 표시하는 기본적인 Java 프로그램을 만들었습니다.

  2. 유니코드 이스케이프 시퀀스: 문자를 표현하기 위해 유니코드 이스케이프 시퀀스 (\uXXXX) 를 사용하는 방법을 배우고 다양한 유형의 유니코드 문자의 속성을 탐구했습니다.

  3. 유니코드 파일 I/O: UTF-8 을 사용하여 적절한 문자 인코딩을 보장하면서 유니코드 텍스트를 파일로 읽고 쓰는 프로그램을 구현했습니다.

이러한 개념을 마스터함으로써 이제 국제 텍스트를 올바르게 처리할 수 있는 Java 애플리케이션을 개발할 수 있습니다. 이는 글로벌 사용자를 위한 소프트웨어를 만드는 데 필수적인 기술입니다.

이 튜토리얼에서 얻은 몇 가지 주요 사항은 다음과 같습니다.

  • Java 는 내부적으로 char 타입에 UTF-16 인코딩을 사용합니다.
  • 유니코드 문자는 직접 또는 이스케이프 시퀀스를 사용하여 표현할 수 있습니다.
  • 파일에서 읽거나 쓸 때는 항상 인코딩 (가급적 UTF-8) 을 지정합니다.
  • Character 클래스는 유니코드 문자의 속성을 검사하는 메서드를 제공합니다.
  • 최신 Java 의 NIO 패키지 (java.nio) 는 파일에서 유니코드 작업을 위한 강력한 지원을 제공합니다.

이러한 지식을 갖추면 모든 언어로 텍스트를 원활하게 처리하는 Java 애플리케이션을 자신 있게 만들 수 있습니다.