본문 바로가기

자바

[JAVA] 문자열 처리와 관련된 클래스

728x90

자바에서 문자열을 처리할 일은 매우 많다.

예를 들자면 아래와 같은 경우들이 있다.

  • 사용자 입력 (Scanner.nextLine())
  • 데이터베이스 값 (VARCHAR 같은 문자열 컬럼)
  • 파일 읽기/쓰기 (BufferedReader.readLine())
  • 로그 기록 (System.out.println("Error: 파일을 찾을 수 없습니다."))
  • 웹 개발 (HTML, JSON, XML 등의 데이터 형식)

간단하게 생각했을때 이정도인데 세세하게 들어가면 더더욱 많다.

때문에, 문자열 처리는 필수적이게 되는데 그렇다면 이와 관련된 클래스가 무엇이 있는지 확인해보자.

문자열 처리와 관련된 클래스 String, StringBuilder, StringBuffer에 대해 알아보겠다.

String

  • String 객체는 불변 → 한 번 생성되면 수정 불가능하다.
  • 문자열 변경이 필요할 경우, 새로운 문자열 객체가 생성된다 (메모리 낭비 발생 가능).
  • 문자열 연산이 적을 때 사용하면 좋다.
    • 문자열이 자주 변경되지 않는 경우 사용하면 좋다.

사용 예시

public class StringExample {
    public static void main(String[] args) {
        String str1 = "Hello";  // 문자열 리터럴 생성
        str1 += " World";       // 기존 문자열 수정 → 새로운 객체 생성됨

        System.out.println(str1); // Hello World
    }
}

str1은 "Hello World"로 변경된 것처럼 보이지만, 사실은 새로운 객체가 생성된 것이다.

public class StringPerformance {
    public static void main(String[] args) {
        String str = "";
        for (int i = 0; i < 10000; i++) {
            str += i; // 문자열이 계속 변경될 때마다 새로운 객체 생성됨 → 메모리 낭비
        }
        System.out.println("완료");
    }

이처럼 String을 반복적으로 변경하는 작업이 많으면 비효율적이게 된다.

StringBuilder

  • StringBuilder는 가변 → 문자열 변경 가능.
  • 새로운 객체를 생성하지 않고 기존 객체 내에서 수정이 가능하다 → 메모리를 효율적으로 사용할 수 있다.
  • 싱글 스레드 환경에서 사용한다 (동기화 X, 성능 빠름).

사용 예시

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        sb.append(" World"); // 기존 객체 내에서 문자열 수정

        System.out.println(sb); // Hello World
    }
}

StringBuilder는 기존 객체를 변경하므로, 새로운 객체를 만들지 않아도 된다.

public class StringBuilderPerformance {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            sb.append(i); // 메모리 낭비 없이 문자열 추가 가능
        }
        System.out.println("완료");
    }
}

String을 사용할 때보다 StringBuilder가 훨씬 빠르고 효율적이다.

StringBuffer

  • StringBufferStringBuilder처럼 가변 객체다.
  • 멀티스레드 환경에서 안전하게 사용이 가능하다 (동기화 지원).
  • 성능은 StringBuilder보다 약간 느리다 (동기화 비용 발생).

사용 예시

public class StringBufferExample {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("Hello");
        sb.append(" World"); // 기존 객체 내에서 문자열 수정

        System.out.println(sb); // Hello World
    }
}

멀티스레드 환경에서 문자열 변경이 필요한 경우 StringBuffer를 사용하면 안전하다.

728x90

'자바' 카테고리의 다른 글

[JAVA] 제네릭(Generics)  (0) 2025.03.18
[JAVA] 어노테이션 (Annotation)  (0) 2025.03.17
[JAVA] 인터페이스(Interface)  (0) 2025.03.13
[JAVA] 다형성과 정적, 동적 바인딩  (0) 2025.03.13
[JAVA] 추상 클래스(abstract)  (0) 2025.03.13