[Java] 기본 API 클래스 ④

kiteB·2022년 2월 5일
0

Java

목록 보기
32/35
post-thumbnail

[ StringTokenizer ]

문자열이 특정 구분자(delimiter)로 연결되어 있을 경우, 구분자를 기준으로 부분 문자열을 분리하기 위해서는

  • Stringsplit() 메소드를 이용하거나,
  • java.util 패키지의 StringTokenizer 클래스를 이용할 수 있다.

split()은 정규 표현식으로 구분하고, StringTokenizer는 문자로 구분하는 차이점이 있다.


1. split() 메소드

String 클래스의 split() 메소드는 정규 표현식을 구분자로 해서 문자열을 분리한 후, 배열에 저장하고 리턴한다.

String[] result = "문자열".split("정규표현식");

예를 들어, 다음과 같은 문자열이 있다고 가정해보자.

홍길동&이수홍,박연수,김자바-최명호

특수문자를 제외하고 사람 이름만 뽑아내고 싶을 경우, &, ,, -를 파이프 기호(|)로 연결한 정규 표현식을 매개값으로 제공하면 split() 메소드는 이 기호들을 구분자로 해서 부분 문자열을 추출한다.

String[] names = text.split("&|,|-");

예제 | 문자열 분리

public class StringSplitExample {
    public static void main(String[] args) {
        String text = "홍길동&이수홍,박연수,김자바-최명호"
        
        String[] names = text.split("&|,|-");
        
        for(String name : names) {
            System.out.println(name);
        }
    }
}

실행 결과

홍길동
이수홍
박연수
김자바
최명호

2. StringTokenizer 클래스

문자열이 한 종류의 구분자로 연결되어 있을 경우, StringTokenizer 클래스를 사용하면 손쉽게 문자열(토큰)을 분리해낼 수 있다.
StringTokenizer 객체를 생성할 때 첫 번째 매개값으로 전체 문자열을 주고, 두 번째 매개값으로 구분자를 주면 된다.

StringTokenizer st = new StringTokenizezr("문자열", "구분자");

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

예를 들어 문자열이 /로 구분되어 있을 경우, 다음과 같이 StringTokenizer 객체를 생성할 수 있다.

String text = "홍길동/이수홍/박연수";
StringTokenizer st = new StringTokenizer(text, "/");

StringTokenizer 객체가 생성되면 부분 문자열을 분리해낼 수 있는데, 다음 메소드들을 이용해서 전체 토큰 수, 남아 있는 토큰 여부를 확인한 다음, 토큰을 읽으면 된다.

nextToken() 메소드로 토큰을 하나 꺼내오면 StringTokenizer 객체에는 해당 토큰이 없어진다.

만약 StringTokenizer 객체에서 더 이상 가져올 토큰이 없다면 nextToken() 메소드는 java.util.NoSuchElementException 예외를 발생시킨다. 그래서 nextToken() 메소드를 사용하기 전에 hasMoreTokens() 메소드로 꺼내올 토큰이 조사한 후 nextToken() 메소드를 호출하는 것이 좋은 코딩 방법이다.

예제 | StringTokenizer로 토큰 분리하기

public class StringTokenizerExample {
    public static void main(String[] args) {
        String text = "홍길동/이수홍/박연수";

        //how1: 전체 토큰 수를 얻어 for문으로 루핑
        StringTokenizer st = new StringTokenizer(text, "/");
        int countTokens = st.countTokens();
        for (int i = 0; i < countTokens; i++) {
            String token = st.nextToken();
            System.out.println(token);
        }

        System.out.println();
        
        //how2: 남아 있는 토큰을 확인하고 while문으로 루핑
        st = new StringTokenizer(text, "/");
        while (st.hasMoreTokens()) {
            String token = st.nextToken();
            System.out.println(token);
        }
    }
}

실행 결과

홍길동
이수홍
박연수 

홍길동
이수홍
박연수 

[ StringBuffer, StringBuilder 클래스 ]

String 클래스의 인스턴스는 한번 생성되면 변경할 수 없다. 그래서 변경이 필요할 경우 기존의 문자열을 바꿔서 새로운 문자열을 리턴한다.

이렇게 문자열을 변경하는 작업이 많을 경우 String 클래스를 사용하는 것보다는 java.lang 패키지의 StringBuffer 또는 StringBuilder 클래스를 사용하는 것이 좋다!

이 두 클래스는 내부 버퍼에 문자열을 저장해두고, 그 안에서 추가/수정/삭제 작업을 할 수 있도록 설계되어 있다. 즉, String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있다.

StringBufferStringBuilder의 사용 방법은 동일한데,

  • StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하지만,
  • StringBuilder는 단일 스레드 환경에서만 사용하도록 설계되어 있다는 차이점이 있다.

이번에는 StringBuilder 클래스만 살펴보고, 이후에 스레드에 대해 제대로 학습한 뒤 StringBuffer도 정리해보려고 한다.


StringBuilder 클래스

StringBuilder 클래스는 몇 가지 생성자를 제공한다.

  • 기본 생성자인 StringBuilder()는 16개의 문자들을 저장할 수 있는 초기 버퍼를 만든다.
  • StringBuilder(int capacity) 생성자는 capacity로 주어진 개수만큼 문자들을 저장할 수 있는 초기 버퍼를 만든다.
  • StringBuilder(String str) 생성자는 str로 주어진 매개값을 버퍼의 초기값으로 저장한다.

StringBuilder는 버퍼가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에 초기 버퍼의 크기는 그다지 중요하지 않다.

StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder(16);
StringBuilder sb = new StringBuilder("Java");

StringBuilder 객체가 생성되었다면, 다음의 메소드를 이용하여 버퍼 내에서 문자 추가, 삽입, 삭제 등의 작업을 할 수 있다.

예제 | StringBuilder에서 문자열 조작

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(); //StringBuilder 객체 생성

        //문자열 끝에 추가
        sb.append("Java ");
        sb.append("Program Study");
        System.out.println(sb.toString());
        
        //index4 위치 뒤에 2를 삽입
        sb.insert(4, "2");
        System.out.println(sb.toString());
        
        //index4 위치의 문자를 6으로 변경
        sb.setCharAt(4, '6');
        System.out.println(sb.toString());
        
        //index6부터 index13 '전'까지를 "Book" 문자열로 대치
        sb.replace(6, 13, "Book");
        System.out.println(sb.toString());
        
        //index4부터 index5 '전'까지 삭제
        sb.delete(4, 5);
        System.out.println(sb.toString());

        //총 문자수 얻기
        int length = sb.length();
        System.out.println("총 문자 수: " + length);
        
        //버퍼에 있는 것을 String 타입으로 리턴
        String result = sb.toString();
        System.out.println(result);
    }
}

실행 결과

Java Program Study
Java2 Program Study
Java6 Program Study
Java6 Book Study
Java Book Study
총 문자 수: 15
Java Book Study

[ 정규 표현식와 Pattern 클래스 ]

이메일, 전화번호와 같이 문자열이 정해져 있는 형식(정규 표현식: Regular Expression)으로 구성되어 있는지 검증해야 하는 경우가 있다.

정규 표현식은 문자 또는 숫자 기호와 반복 기호가 결합된 문자열이다.


1. 정규 표현식 작성 방법

정규 표현식을 작성하는 방법은 API 도큐먼트에서 java.util.regex.Pattern 클래스를 찾아 Summary of regular-expression constructs를 참조하면 된다.

정규 표현식을 작성하는데 기본적으로 알아야 하는 기호는 다음과 같다.


2. Pattern 클래스

java.util.regex.Pattern 클래스의 정적 메소드인 matches() 메소드를 통해 문자열을 정규 표현식으로 검증할 수 있다.

boolean result = Pattern.matches("정규식", "검증할 문자열");

첫 번째 매개값은 정규 표현식이고, 두 번째 매개값은 검증할 문자열이다. 검증 후 결과가 boolean 타입으로 리턴된다.


[ 참고자료 ]

이것이 자바다
http://tcpschool.com/java/java_api_stringBuffer

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글