ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문자열 관련 클래스
    JAVA 2023. 3. 14. 11:58

    String 클래스

    • 문자열을 저장하고 조작할 때 사용
    • String 객체가 생성된 다음부터는 메모리(heap)에 저장된 값을 직접 수정하지 못하기 때문에 값을 복제한 후 필요한 부분만 변경하여 새로운 메모리에 할당해준다. (해쉬 코드가 최초 생성 당시와 다른 것으로 확인 가능)

     


    주요 메소드

     

    메소드 설명
    byte[] getBytes() JVM에서 사용하는 기본 문자셋으로 String 문자열을 byte 배열로 변환.
    JVM(운영체제)에서 사용하는 기본 문자셋에 따라 byte 배열의 길이가 달라질 수 있다.
    (한글 '자'는 UTF-8 문자셋으로 3byte이고, EUC-KR 문자셋으로 2byte이다.)
    byte[] getBytes(String charsetName) 지정한 문자셋으로 String 문자열을 byte 배열로 변환.
    변환하려는 문자셋의 이름을 문자열로 입력
    byte[] getBytes(Charset charset) 지정한 문자셋으로 String 문자열을 byte 배열로 변환.
    변환하려는 문자셋을 Charset 객체로 입력
    String[] split(String regex) 주어진 정규표현식에 해당하는 문자열을 기준으로 기존 문자열을 분리하여 String 배열에 저장

     


    byte 배열 문자열 상호 변환(byte ↔ String)

    • 네트워크 통신 시 byte 배열로 들어오고 나가는 데이터에 대해 문자열로 변환할 때 사용

     

    • 디코딩(decoding) : byte 배열을 문자열로 변환하는 것.
      - byte 배열을 디코딩하여 String 객체를 생성하는 String 클래스 생성자 사용  

     

    //기본 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성
    String str = new String(byte[] bytes);

     

    //특정 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성
    String str = new String(byte[] bytes, String charsetName);

     

    • 인코딩(encoding) : 문자열을 byte 배열로 변환하는 것.
      - String 클래스의 getByte() 메소드를 사용

     

    //String 객체에 저장된 문자열을 기본 문자셋으로 인코딩하여 byte 배열에 저장
    byte[] arr = str.getBytes();

     

    //String 객체에 저장된 문자열을 특정 문자셋으로 인코딩하여 byte 배열에 저장
    byte[] arr = str.getBytes(String charsetName);

     

     

    • 문자열 디코딩 시 반드시 인코딩한 문자셋과 동일한 문자셋으로 디코딩해야 한다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
     
    public class ByteToStringExample {
        public static void main(String[] args) {
            
            String data = "a자바";
            
            try {
                //인코딩(encoding): String -> byte[]
                byte[] arr1 = data.getBytes("UTF-8");
                
                System.out.println("arr1 배열의 길이 : " + arr1.length); //UTF-8 문자셋은 알파벳 1byte, 한글 3byte로 저장
                System.out.println("arr1 : " + Arrays.toString(arr1));    //배열 안에 있는 항목을 문자열로 출력하는 Arrays 클래스의 메소드
                
                //디코딩(decoding): byte[] -> String
                String data1 = new String(arr1, "UTF-8");
                System.out.println("data1 : " + data1);
                
                String data2 = new String(arr1, "EUC-KR");    //UTF-8 문자셋으로 인코딩한 byte 배열을 EUC-KR 문자셋으로 디코딩 시 한글 깨짐 현상 발생
                System.out.println("data2 : " + data2);
                
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            
        }
    }

     

    ByteToStringExample 실행 결과

     

     

    이클립스 문자셋 설정
    Window > Preperences > General> Workspace > Text file encoding

     

     


    StringBuilder 클래스

    • 건물을 짓듯이 최종적인 문자열을 완성해나간다는 의미
    • 문자열을 복제(= String)하지 않고 바로 문자열 수정 가능
      - String 객체에 저장된 문자열을 조작하면 동일한 객체의 값을 수정하는게 아니라 새로운 객체를 생성하고 거기에 수정된 문자열을 저장한다.
      - StringBuilder는 데이터를 저장할 수 있는 버퍼가 내장되어 있기 때문에 버퍼 차원에서 문자열 추가, 수정, 삭제 작업이 이루어진다.
    • 효율적인 문자열 조작 기능이 필요할 때 사용
      - 특히 문자열 수정이 빈번하게 발생하는 경우에 String 보다 유용하다.
    • 처음에 주어진 저장 용량을 벗어나는 경우 자동으로 용량이 늘어난다.

     


    주요 메소드

    메소드 설명
    StringBuilder append(String str) StringBuilder 변수 뒤에 문자열 추가
    문자열의 + 연산과 동일한 효과
    StringBuilder insert(int offset, String str) 특정 인덱스에 문자열 삽입
    StringBuilder delete(int start, int end) 특정 인덱스 구간의 문자열 삭제
    StringBuilder replace(int start, int end, String str) 특정 인덱스 구간의 문자열을 특정 문자열로 치환
    StringBuilder reverse() 문자열 반전
    String toString() 완성된 문자열을 리턴

     


    메소드 체이닝 패턴(method chaning)

    • 연이어서 다른 메소드를 호출하는 것
    • Builder 클래스의 데이터 조작 관련 메소드는 자기 자신의 클래스를 리턴 타입으로 가지는 경우가 많으며, 이를 이용해 메소드를 연달아 호출하면서 코드 한 줄로 여러 번의 데이터 처리가 가능하다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class StringBuilderExample {
        public static void main(String[] args) {
            String str = new StringBuilder()
                    .append("DEF")        //메소드 체이닝 패턴
                    .insert(0"ABC")
                    .delete(3,  4)
                    .toString();
            
            System.out.println(str);
        }
    }

     

     


    StringTokenizer 클래스

    • 구분자(delimeter)로 연결된 문자열을 분리할 때 사용
    • java.util 에 포함된 클래스
    • 토큰(token): 구분자로 구분되어있는 실제 데이터.

     


    주요 메소드

     

    메소드 설명
    int countTokens() 분리할 수 있는 문자열(토큰)의 갯수
    boolean hasMoreTokens() 남아 있는 문자열(토큰)의 유무
    String nextToken() 다음 순서의 문자열(토큰)을 가져옴
    String nextToken(String delim) 지정한 구분자로 구분한 다음 순서의 문자열(토큰)을  가져옴

     


    String 클래스의 split()과 비교

    • splirt()은 정규표현식으로 입력된 문자열을 구분자로 하여 토큰을 구분한다.

     

     

     

    • StringTokenizer는 사용자가 지정한 문자를 구분자로 하여 토큰을 구분한다.
      - 구분자를 입력하지 않으면 공백(" ")을 기준으로 구분한다.

Designed by Tistory.