2010년 11월 5일 금요일

[JAVA] 스트링(String) 클래스의 length, substring, compareTo 와 StringTokenizer() 클래스

 

 

자바기반인 안드로이드의 문자열을 다룰때 사용할 스트링 클래스들 입니다.

 

스트링 클래스에는 문자열을 분석하거나 조작하기 위한 몇가지 기본 메서드를 지원한다.

<length() 메서드>

String a = "ABC";
int len = a.length();

이것은, 문자열의 길이를 구해준다.

재미있는 점은, 한글이나 영문,숫자등을 모두 한글자를 1 로 계산한다는 것이다.

    String a = "ab";
    String b = "가나";
    System.out.println(a.length());
    System.out.println(b.length());

위와같이 영어 두글자와 한글 두글자의 길이를 출력시키면, 모두 2 라는 똑같은 값이 나온다.
즉, 바이트 기준이 아니라, 문자 기준이라는 것이다.

일부, 프로그램에서 한글의 경우 2배수가 나오는 것에 비하면 꽤나 편리한 편이다.


<substring() 메서드>
substring() 메서드는 자바스크립트나 php 에서와 동일하게 문자열의 일부를 가져오는 것이다.

String a = "ABCDEF";
String b = a.substring(2, 5);  //2번 이후부터 5번 전까지 가져옴 (CDE 를 가져옴)

역시, 주의할점은, 처음 시작이 0 번 부터라는 것이다.
즉, A=0, B=1, C=2, D=3, E=4, F=5
가 되고, 2번부터라면, C 부터 시작함을 의미하고, 5번 전까지이기 때문에 E 까지 가져온다.

    String a = "abcdef";
    String b = "가나";
   
    String c = new String();
    c = a.substring(2,5);
    System.out.println(c);  // 'cde' 출력
   
    String d = new String();
    d = b.substring(1,2);  //'나' 출력
    System.out.println(d);

위의 출력 예를 보면 이해가 쉽다.

자바나, php 등을 오래 한사람은 substring 가 익숙하겠지만,
ASP 의 Mid 나 substr 같은 용법에 익숙한 사람은 아무래도 헷갈리는데,
아쉽게도 자바에는 기본적으로 substr 메서드가 없다.


<compareTo() 메서드>

메서드 이름에서 알 수 있듯이, 이는 두 문자열을 비교하는 메서드이다.

public class a
{
  public static void main(String [] args){
    String a = "ABC";
    String b = "ABC";
    String c = "BCD";
    String x = "B";
   
    int d = a.compareTo(b);
    int e = a.compareTo(c);
   
    System.out.println(d);  //0 출력
    System.out.println(e);  //-1 출력
   
    int y = a.compareTo(x);
    System.out.println(y);  //-1 출력
   
    int w = x.compareTo(a);
    System.out.println(w);  //1 출력
  }
}

즉, a 와 b 를 비교했을때, 완전히 일치하기 때문에 0 을 반환하였고,
a 와 c 를 비교했을때, 부분적으로는 비슷한 문자가 들어있지만, 문자열 전체를 봤을때는 일치하지 않으므로, -1 을 반환한다.
(-1 은 전혀 다르다는 것을 의미)

그런데, 특이한 점은(주의) 어느것을 기준으로 비교하느냐에 따라 값이 차이가 난다는 것이다.
a.compareTo(b)
라는 문법은, b 에다가 a 문자열을 대조해보는 것으로, 기준이 되는 것이 괄호안에 들어 있는 b 문자열이다.
따라서,
x="B" 에다가 a="ABC" 를 비교하면, 어느곳에도 일치하지 못하기 때문에 -1 이 반환되지만,
a="ABC" 에다가 x="B" 를 비교하면, 문자 B 가 두번째에 위치하고 있기 때문에(0부터 시작해서 1위치),
결과값이 1 이 반환되는 것이다.

테스트를 통해서도 보았지만, 어느것을 기준으로 비교하는지 헷갈리지 않도록 주의해야 하며,
대체로는 지정한 문자열이 대상 문자열에 들어 있는지 또는 두 문자열이 똑같은지 정도로만 체크하는 용도로 주로 사용된다.


<StringTokenizer() 클래스>

StringTokenizer 클래스는 문자열을 분할하는 클래스이다.(분할한 문자열을 토큰이라고 부른다)
이것은 자바스크립트, PHP 의 split 와 비슷한 기능을 하는 클래스이다.

사용 방법은 아래와 같다.

StringTokenizer a = new StringTokenizer("i,love,cat", ",");

이것은 'i,love,cat' 라는 문자열을 콤마(,) 를 기준으로 분할한다는 의미이다.
이렇게 분할해서, 만약 분할이 되면(토큰이 있으면) true 를 반환한다.
그러면, nextToken() 메서드를 이용해 하나씩 불러올 수 있다.

사용예시)
<a.java 의 내용>------------------------------

import java.util.*;

public class a
{
  public static void main(String [] args){
    StringTokenizer msg = new StringTokenizer("i,love,you", ",");
    //만약, 토큰의 분할 방법을 기술하지 않으면 공백을 기본으로 하여 구분한다.
    // StringTokenizer("i love you"); 와 같이 사용 가능.
   
    String a="",b="",c="";
   
    //System.out.println(msg);
    /* 아래와 같이 직접 지정할 수 있다.
      a = msg.nextToken();
      b = msg.nextToken();
      c = msg.nextToken();
     
      String x = a + b + c;  //iloveyou 출력
      System.out.println(x);
    */
   
    String x = new String();
   
    //x = msg.nextToken();  //이 부분은 써도되고, 안써도 상관없다.
    while(msg.hasMoreTokens()){  //토큰이 없을때까지 반복한다.
      x = x + msg.nextToken();
    }
    System.out.println(x);  //iloveyou 출력
  }
}
--------------------------------------------

주의할점은, StringTokenizer 클래스를 사용하기 위해서는 java.util 을 임포트 해야 한다는 것이다.


 

댓글 없음:

댓글 쓰기