본문 바로가기
Programming

JAVA 문자열 처리

by 나무수피아는 지식의 가지를 뻗어가는 공간입니다. 2025. 11. 20.
반응형

📘 문자열 처리 (String Handling)

문자열은 자바에서 가장 많이 사용되는 데이터 중 하나입니다. 이번 강의에서는 String, StringBuilder, StringBuffer의 차이와, 정규 표현식 PatternMatcher 사용법을 실습 예제로 배워봅니다. 문자열 처리는 단순한 텍스트 저장을 넘어서 다양한 응용 분야에 활용됩니다. 예를 들어, 사용자 입력 처리, 데이터 파싱, 로그 분석, 텍스트 변환, 웹 개발, 데이터 검증 등 거의 모든 자바 프로그램에서 중요한 역할을 합니다. 특히 자바는 문자열을 다룰 때 메모리 효율성과 성능을 고려하여 불변성가변 클래스를 적절히 나누어 제공하고 있습니다. 이 강의에서 자세히 알아볼 String은 불변 객체로 안전하지만, 많은 문자열 변경 작업에선 StringBuilderStringBuffer가 성능상 유리합니다.


📌 목차

  1. String 클래스의 불변성
  2. StringBuilder vs StringBuffer
  3. 정규 표현식 기본 개념
  4. Pattern과 Matcher 사용법

🔹 1. String 클래스의 불변성

String 객체는 한 번 생성되면 수정할 수 없습니다. 즉, 문자열 내용을 변경하는 모든 연산은 실제로는 새로운 String 객체를 생성합니다. 이러한 불변성은 멀티스레드 환경에서 동기화 문제를 줄이고, 문자열 상수 풀(String Constant Pool)을 통한 메모리 재활용에 유리합니다.

예를 들어, 아래 코드를 보면 문자열에 " World"를 덧붙이는 과정에서 원래 문자열이 변경되는 것이 아니라 새 문자열이 생성됩니다.

String s = "Hello";
s += " World";  // 새로운 객체 생성

System.out.println(s);  // Hello World

이처럼 문자열이 변경될 때마다 새로운 객체가 생성되므로, 많은 문자열 조작 작업에서는 메모리 낭비와 성능 저하가 발생할 수 있습니다.

이런 단점을 보완하기 위해 StringBuilderStringBuffer가 등장했으며, 이들은 내부 버퍼를 사용하여 문자열을 효율적으로 다룰 수 있습니다.


🔹 2. StringBuilder vs StringBuffer

StringBuilderStringBuffer는 모두 가변적인 문자열을 다룰 수 있도록 설계된 클래스입니다. 두 클래스 모두 내부에 문자 배열(char[])을 유지하며, 문자열이 추가될 때마다 새로운 객체를 생성하지 않고 내부 배열을 수정합니다.

  • StringBuilder: 단일 스레드 환경에서 빠르게 작동하며, 동기화가 없어서 성능이 우수합니다.
  • StringBuffer: 멀티 스레드 환경에서 안전하도록 모든 메서드에 동기화가 적용되어 있습니다. 따라서 스레드가 동시에 접근할 가능성이 있을 때 적합합니다.

실제로 대부분의 단일 스레드 상황에서는 StringBuilder를 사용하는 것이 권장됩니다. StringBuffer는 스레드 안정성이 필요할 때만 사용하세요.

// StringBuilder 예제
StringBuilder sb = new StringBuilder("Java");
sb.append(" Programming");
System.out.println(sb.toString());  // Java Programming

// StringBuffer 예제 (멀티스레드 환경 예시)
StringBuffer sbf = new StringBuffer("Thread-safe");
sbf.append(" String");
System.out.println(sbf.toString());  // Thread-safe String

이 두 클래스는 append, insert, delete, reverse 등 다양한 문자열 편집 메서드를 제공합니다. 따라서 복잡한 문자열 조작이 필요한 경우 이들을 사용하면 효율적이고 가독성 좋은 코드를 작성할 수 있습니다.


🔹 3. 정규 표현식 기본 개념

정규 표현식(Regular Expression, Regex)은 문자열 내에서 특정한 패턴을 찾거나 치환, 분할 등을 수행하기 위해 사용하는 강력한 도구입니다. 자바에서는 java.util.regex 패키지 내 PatternMatcher 클래스를 통해 정규 표현식을 지원합니다.

정규 표현식의 기본 기호는 다음과 같습니다:

기호 설명
\d 숫자 (0~9 한 자리) "123"에서 '1', '2', '3'
\w 단어 문자 (알파벳, 숫자, 밑줄) "abc123"
. 임의의 한 문자 "a.c" → "abc", "acc" 모두 매칭
* 0회 이상 반복 "a*b" → "b", "ab", "aaab"
+ 1회 이상 반복 "a+b" → "ab", "aab"

그 외에도 ? (0 또는 1회), {n,m} (n~m회 반복), ^ (문자열 시작), $ (문자열 끝), 그룹화와 선택자 등을 활용하여 매우 복잡한 패턴도 정의할 수 있습니다.


🔹 4. Pattern과 Matcher 사용법

자바에서 정규 표현식을 사용할 때는 Pattern 객체를 생성하여 컴파일하고, Matcher 객체를 이용해 특정 문자열에 대해 패턴을 적용합니다.

다음 예제는 문자열에서 이메일 형식(간단한 패턴)을 찾아 출력하는 코드입니다.

import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String text = "Email: example123@gmail.com";
        // 이메일 패턴 정의 (간단 버전)
        Pattern pattern = Pattern.compile("\\w+@\\w+\\.com");
        Matcher matcher = pattern.matcher(text);

        if (matcher.find()) {
            System.out.println("이메일 찾음: " + matcher.group());
        } else {
            System.out.println("이메일이 없습니다.");
        }
    }
}

출력: 이메일 찾음: example123@gmail.com

위 예제에서 Pattern.compile()은 정규 표현식을 컴파일해 Pattern 객체를 생성합니다. matcher() 메서드는 검사 대상 문자열에 대해 Matcher 객체를 반환하며, find() 메서드는 일치하는 부분이 있으면 true를 반환합니다.

group() 메서드는 매칭된 문자열을 반환합니다. 이외에도 matches(), replaceAll(), split() 같은 메서드를 활용해 다양한 문자열 처리를 할 수 있습니다.


🔹 추가 팁: 문자열 효율적으로 다루기

문자열을 다룰 때는 다음 사항을 고려하면 좋습니다:

  • 자주 변경하는 문자열은 StringBuilder 사용
  • 멀티스레드 환경에서는 StringBuffer 사용
  • 복잡한 패턴 검색은 정규 표현식 활용
  • 불변성을 이용한 안전한 코드 작성

또한 자바 11부터는 String 클래스에 다양한 편리한 메서드들이 추가되어 있습니다. 예를 들어 isBlank(), lines(), strip() 등이 있어 문자열 처리 작업이 한층 간편해졌습니다.

이처럼 문자열 처리 능력은 자바 프로그래밍에서 필수적인 역량이며, 다양한 클래스와 정규 표현식을 적절히 활용하면 강력하고 유연한 텍스트 처리가 가능합니다.

반응형

'Programming' 카테고리의 다른 글

JAVA 날짜와 시간 처리  (35) 2025.11.22
JAVA 파일 입출력 (File I/O)  (54) 2025.11.21
JAVA 컬렉션 프레임워크  (59) 2025.11.19
JAVA 예외 처리  (59) 2025.11.18
JAVA 객체지향 프로그래밍 (OOP)  (60) 2025.11.17