자바 문자열 클래스 String, StringBuilder, StringTokenizer

용씨·2023년 2월 4일
0

자바 개념 시리즈

목록 보기
4/9

String 클래스

String 클래스는 문자열을 저장하고 조작할 때 사용한다.

  • 문자열 리터럴은 자동으로 String 객체로 생성
    • String str = "message";
  • byte 배열을 디코딩해서 String 객체로 생성
    • String str = new String(byte[] bytes);
  • 특정 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성
    • String str = new String(byte[] bytes, String charestName);

사용 예시

public class BytesToString {

    public static void main(String[] args) throws Exception {
        String data = "자바";

        // String -> byte 배열 (default: UTF-8 인코딩)
        byte[] byteArray1 = data.getBytes();
        System.out.println("byteArray = " + Arrays.toString(byteArray1));

        // byte 배열 -> String (default: UTF-8 디코딩)
        String str1 = new String(byteArray1);
        System.out.println("str1 = " + str1);

        // String -> byte 배열 (EUC-KR 인코딩)
        byte[] byteArray2 = data.getBytes("EUC-KR");
        System.out.println("byteArray2 = " + Arrays.toString(byteArray2));

        // byte 배열 -> String (EUC-KR 디코딩)
        String str2 = new String(byteArray2, "EUC-KR");
        System.out.println("str2 = " + str2);

    }
}
// 실행결과
byteArray = [-20, -98, -112, -21, -80, -108]
str1 = 자바
byteArray2 = [-64, -38, -71, -39]
str2 = 자바

한글 1자를 UTF-8로 인코딩하면 3바이트가 되고, EUC-KR로 인코딩하면 2바이트가 된다. 따라서 인코딩할 때 사용한 문자셋으로 디코딩을 해야만 한글이 올바르게 복원될 수 있다.

StringBuilder 클래스

사용 예시

String은 내부 문자열을 수정할 수 없다.

String data = "ABC";
System.out.println(data.hashCode());
data += "DEF";
System.out.println(data.hashCode());
// 실행결과
64578
1923910755

data 변수에 "DEF"를 추가하면, "ABCDEF"라는 새로운 String 객체를 생성한다. 그리고 data 변수는 새로 생성된 String 객체를 참조하게 된다. 따라서 data += "DEF"; 명령문 전후로 data 변수의 해시코드를 출력해보면 다르다.

문자열의 + 연산은 새로운 String 객체가 생성되고 이전의 객체는 버려지기 때문에 효율성이 좋다고 볼 수 없다. 잦은 문자열 변경 작업을 해야 한다면 StringBuilder를 사용하는 것이 좋다.

StringBuilder는 내부 버퍼(데이터를 저장하는 메모리)에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 하도록 설계되어 있다.

StringBuilder의 특징

StringBuilder의 Java docs를 보면 다음과 같이 설명되어 있다.

A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.

StringBuilder의 특징을 알 수 있다.

  • mutable : 가변성
  • no guarantee of synchronization : 동기화를 보장하지 않음
  • single thread : StringBuffer의 싱글 스레드 버전
  • faster: StringBuffer보다 더 빠르다.

StringTokenizer 클래스

문자열이 구분자로 연결되어 있을 경우, 구분자를 기준으로 문자열을 분리하려면 String의 split() 메소드를 이용하거나 java.util 패키지의 StringTokenizer 클래스를 이용할 수 있다.

다음과 같은 차이점이 있다.

  • split() : 정규 표현식으로 구분
  • StringTokenizer: 문자로 구분

사용 예시

StringTokenizer 객체 생성자

  • StringTokenizer(String str)
  • StringTokenizer(String str, String delim)

만약 구분자(delim)을 생략하면 공백이 기본 구분자가 된다.

StringTokenizer st = new StringTokenizer("this is a test");
     while (st.hasMoreTokens()) {
         System.out.println(st.nextToken());
     }
// 실행결과
this
is
a
test
  • hasMoreTokens() : 남아 있는 문자열이 있는 여부
  • nextToken() : 문자열을 하나씩 가져옴
profile
아침형 인간이 목표

0개의 댓글