티스토리 뷰

반응형

특정 구분자(경계기호:Delimter)를 기준으로 문자열을 분해 할 때 흔히 사용하는 방법이 java.util.StringTokenizer를 이용해서 분해를 하거나 jdk1.4대에 새로 추가 된 java.lang.String.split(String regex)을 사용하는 방법입니다.

이들 둘은 "문자열에서 특정 구분자를 기준으로 문자열을 분해 한다"는 기본 기능은 같지만 그 결과는 "분해 할 문자열이 어떻게 구성이 되어 있느냐"에 따라서 서로 다른 결과값을 도출합니다.

예를 살펴보기 위해서 다음과 같은 가정을 하겠습니다.

  • 분해 할 문자열은 "아이디, 이름, 전자우편주소,휴대전화"로 구성 된다.
  • "아이디, 이름" 이외의 항목은 있을 수도 있고 그렇지 않을 수도 있다.
  • 각 항목을 구분하는 구분자는 ","로 한다.

1. 먼저 각 항목이 모두 존재 하는 경우를 살펴 보겠습니다. 이 경우라면 다음과 같은 형태가 될 것입니다.

  • neoburi,inkuk,neoburi@neoburi.com,019-366-5815

이 경우는 다음과 같이 분해를 할 수 있을 것입니다.

    String str = "neoburi,inkuk,neoburi@neoburi.com,019-366-5815";

    String[] values = str.split(",");

    또는,

    StringTokenizer values = new StringTokenizer( str, "," );

이 때에는 String.split(String regex)이나 StringTokenizer의 결과 값은 같게 나옵니다.

그런데 문제는 이렇게 모든 항목이 존재하지 않는 경우가 있을 때입니다.

2. 일부 항목만으로 문자열이 구성 된 경우를 살펴 보겠습니다.

예를 든다면 다음과 같은 값을 가질 때겠지요.

  • "아이디,이름,,전화번호" 일 경우
  • "아이디,이름,전자우편," 일 경우
  • 또는 "아이디,이름,," 일 경우

1) "아이디,이름,,전화번호" 일 경우를 살펴 보겠습니다.

    문자열은 다음과 같이 구성이 될 것입니다.

    String str = "neoburi,inkuk,,019-366-5815";

    • String[] values = str.split(",");을 사용 할 경우 해보면 결과는 아래와 같습니다.

      for( int x = 0; x < values.length; x++ ){

      System.out.println( "문자(열) " + (x+1) + " : " + values[x] );

      }

      결과 :

        문자(열) 1 : neoburi

        문자(열) 2 : inkuk

        문자(열) 3 :

        문자(열) 4 : 019-366-5815

    • StringTokenizer tokens = new StringTokenizer( str, "," );를 사용 할 경우

      for( int x = 1; tokens.hasMoreElements(); x++ ){

      System.out.println( "문자(열) " + x + " : " + tokens.nextToken() );

      }

      결과 :

        문자(열) 1 : neoburi

        문자(열) 2 : inkuk

        문자(열) 3 : 019-366-5815

    결과와 같이 split(String regex)을 이용한 경우에는 비록 값이 존재하지 않더라고 해당 데이터가 없다는 것을 확실하게 판단을 할 수 있습니다. 즉 구분자를 기준으로 데이터가 없는 부분도 그 결과를 반환해준다는 얘기지요.

    그렇지만 StringTokenizer는 비록 구분자로 문자열간 구분이 되어 있더라도 구분자와 구분자 사이에 데이터가 존재하지 않으면 (",,"의 경우) 해당 데이터는 무시를 하고 실제 값이 존재하는 부분만 값을 반환합니다.

    두 결과 사이에는 많은 차이가 남을 볼 수 있습니다.

2) "아이디,이름,전자우편," 일 경우

    이 역시 문자열은 다음과 같이 구성이 될 것입니다.

    String str = "neoburi,inkuk,neoburi@neoburi.com,";

    • String[] values = str.split(",");

      for( int x = 0; x < values.length; x++ ){

      System.out.println( "문자(열) " + (x+1) + " : " + values[x] );

      }

      결과 :

        문자(열) 1 : neoburi

        문자(열) 2 : inkuk

        문자(열) 3 : neoburi@neoburi.com

    • StringTokenizer tokens = new StringTokenizer( str, "," );

      for( int x = 1; tokens.hasMoreElements(); x++ ){

      System.out.println( "문자(열) " + x + " : " + tokens.nextToken() );

      }

      결과 :

        문자(열) 1 : neoburi

        문자(열) 2 : inkuk

        문자(열) 3 : neoburi@neoburi.com

    위에서 보는 바와 같이 분해하고자 하는 문자열의 마지막 요소가 존재하지 않을 경우 String.split(String regex)과 StringTokenizer는 같은 결과를 보여줍니다.

    두 결과사이에는 차이가 없음에도 불구하고 잃어 버리는 데이터가 생겼습니다. 개발자는 분명히 사용자의 정보로부터 4개의 항목을 얻어 표현을 하고 싶지만 그렇게 할 수가 없습니다. 물론 어거지로 한다면 가능은 하겠지만요.^^

    그러면 String.split(String regex)과 StringTokenizer를 사용 하더라고 분해하고자 하는 마지막 항목이 없을 경우는 분해 할 방법이 없을까요? 그렇지 않습니다.

    API를 어느정도 보신 분들이라면 아마 "그것은 이렇게 하면 되지!"라고 속으로 생각 하실 겁니다.

    java.lang.String클래스에는 split()메소드가 2개가 있습니다.

    • 하나는 split( String regex )이고
    • 다는 하나는 split( String regex, int limit )입니다.

String.split( String regex, int limit )를 사용해서 분해를 해보겠습니다.

    • String[] values = str.split(",", 4);

      for( int x = 0; x < values.length; x++ ){

      System.out.println( "문자(열) " + (x+1) + " : " + values[x] );

      }

      결과 :

        문자(열) 1 : neoburi

        문자(열) 2 : inkuk

        문자(열) 3 : neoburi@neoburi.com

        문자(열) 4 :

    비록 마지막 분해 요소의 값이 존재하지 않더라고 split( String regex, int limit )를 이용하면 고스란히 원하는 형태의 데이터를 얻는 것을 볼 수 있습니다.

StringTokenizer의 경우는 구분자 사이에 분해할 요소의 값이 존재하지 않으면 무시하게 되어 있습니다. 완전하게 모든 요소의 값이 존재하는 경우라면 사용을 해도 되겠지만 예에서 본 바와 같이 가변적인 데이터라면 사용하기 불편한(?) 것이 사실입니다.

String.split()의 경우 limit를 저정 하지 않았을 경우에는 제일 마지막에 오는 요소의 값이 없을 경우 그 요소를 무시하도록 되어 있습니다. 이 역시 데이터가 정형화 되어 있는 경우라면 사용해도 무리 없겠지만 가변요소가 존재 한다면 StringTokenizer와 크게 다를 게 없습니다.

대신 limit를 지정 했을 경우 해당 숫자만큼만 분해를 합니다. limit는 분해를 한 후 얻고자 하는 String[]의 요소크기라고 보시면 됩니다.

limit가 분해하고자 하는 요소의 개수와 같거나 클 경우 요소의 개수만큼의 String[]을 되돌려 주지만, 요소의 개수보다 작을 경우 지정한 숫자만큼의 String[]으로 되돌려 줍니다.

좀 더 자세히 알고 싶으신 분들은 자바 원천 소스에서 java.lang.String과 java.util.StringTokenizer를 살펴보시기 바랍니다.

반응형

'Web Dev > JSP' 카테고리의 다른 글

[JSP] jsp:include 와 include 디렉티브의 차이  (0) 2013.06.04
[JSP] 코드 조각 자동 포함시키기  (0) 2013.06.04
[JSP] JSTL  (0) 2013.05.11
[FileReader] 파일 읽어 들여 출력하기  (0) 2013.04.18
[JSP] 기초  (0) 2013.04.17
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
29 30 31
글 보관함