본문 바로가기
난 정말 JAVA를 공부한적이 없다구요

20. 자바의 다양한 기본 클래스

by moca7 2024. 6. 21.

 

ㅁ Wrapper 클래스

- 기본 자료형의 데이터를 감싼다.

- 때로는 int, double과 같은 기본 자료형 데이터들도 인스턴스로 표현 해야만 하는 경우가 있다.

 

public static void showData(Object obj) {            //   

이 메소드를 반드시 써야 하고 3과 7.15를 출력해야 한다 가정.

    System.out.println(obj);

}

- 이 문장은 기본 자료형 데이터(예: int, double 등)를 Java에서 사용할 때 발생할 수 있는 일반적인 상황을 설명하고 있습니다. Java에서는 기본 자료형 데이터는 객체가 아닌 값으로 취급되지만, 때로는 객체로 다루어야 하는 상황이 발생할 수 있습니다.

예를 들어, 메소드의 매개변수로 객체 타입을 요구하는 경우가 있습니다. 예를 들어, Object 타입을 매개변수로 받는 메소드가 있을 때, 이 메소드에 정수나 실수와 같은 기본 자료형 데이터를 전달하려면 이를 객체로 래핑해주어야 합니다. 이를 위해 Java는 기본 자료형에 대응하는 래퍼 클래스(Wrapper class)를 제공합니다. 예를 들어, int는 Integer 클래스로, double은 Double 클래스로 래핑할 수 있습니다.

따라서, 주어진 예제에서 showData 메소드는 Object 타입을 인자로 받으므로, 정수 3과 실수 7.15를 객체로 래핑하여 전달해야 합니다. 이렇게 하면 기본 자료형 데이터도 객체로 표현될 수 있으며, 이러한 상황에서 기본 자료형 데이터를 객체로 표현해야 한다는 것을 설명하고 있습니다.

 

※ 참고

- Object 클래스의 toString() 메서드의 기본 구현은 다음과 같습니다:

 
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
 

이 메서드는 객체를 문자열로 표현하는 역할을 합니다. 기본 구현에서는 클래스 이름과 객체의 해시 코드를 16진수로 반환합니다. 예를 들어, Object 클래스의 인스턴스를 출력할 때 기본적으로 다음과 같은 문자열이 반환됩니다:

 
java.lang.Object@1234567
 

여기서 java.lang.Object는 클래스의 이름이고, 1234567은 객체의 해시 코드입니다.

 

- 상속받은 클래스에서는 이 메서드를 필요에 따라 재정의하여 해당 객체의 상태를 더 유의미하게 표현할 수 있습니다. 예를 들어, String 클래스는 toString() 메서드를 오버라이드하여 문자열 자체를 반환합니다.

 
public String toString() {
     return this;
}
 

따라서, toString() 메서드는 객체의 문자열 표현을 반환하는데 사용되며, 자바에서는 이 메서드를 통해 객체의 내용을 쉽게 확인할 수 있습니다.

 
- 원하는 문자열을 반환하도록 toString 메소드를 오버라이딩 하는 것이 일반적이다.
- System.out.println 메소드인자로 전달된 인스턴스toString 메소드를 호출하여 반환되는 문자열을 출력한다.
 
 

ㅁ 기본 자료형 데이터를 인스턴스로 표현하기 위해서 여러분이 직접 클래스를 정의해도 된다. 

( int형 데이터의 표현을 위한 클래스 직접 정의 예제 )

 

- WrappingInterger.java

class IntWrapper {  

    private int num;

    public IntWrapper(int data) {

          num = data;

    }

    public String toString() {

          return ""+num;

    }

}

 

class WrappingInteger {

    public static void showData(Object obj) {

         System.out.println(obj);

    }

    public static void main(String[] args) {

         IntWrapper intInst = new IntWrapper(3);

         showData(intInst);

         showData( new IntWrapper(7) );

    }

}

- int형 데이터를 저장(표현)하기 위한 클래스가 정의되었다. 이러한 유형의 Wrapper 클래스라 한다.

- 위 예제에서는 정수를 인스턴스화 할 수 있도록 클래스를 별도로 정의하였다.

하지만 자바에서 제공하는 Wrapper 클래스를 활용하면 위 예제와 같이 별도의 클래스를 정의할 필요가 없다.

 

ㅁ 예제

- UseWrapperClass.java

class UseWrapperClass {

    public static void showData(Object obj) {

         System.out.prinln(obj);

    }

    public static void main(String[] args) {

        Integer intInst = new Integer(3);

        showData(intInst);

        showData( new Integer(7) );

    }

}

[실행 결과]

3

7

- 자바에서 제공하는 Wrapper 클래스 중 하나인 Integer 클래스를 이용해서 정수 3을 인스턴스화했다.

- 정수 7을 인스턴스화 함과 동시에 showData의 메소드에 인자로 전달하고 있다.

 

ㅁ 자바에서 제공하는 Wrapper 클래스들의 종류와 기능

- char형은 Character, int형은 Integer.

- 나머지 byte, short, long + float, double + boolean은 대문자.

 

- 그리고 Character 클래스를 제외한 모든 Wrapper 클래스에는 String의 참조값을 인자로 받는 생성자들이 정의되어 있어서, 다음과 같이 문자열로 표현된 데이터를 기반으로 하는 인스턴스의 생성도 가능하다.

    

    Integer num1 = new Integer("240");

    Double num2 = new Double("12.157");

 

 

ㅁ Boxing과 Unboxing

- Boxing : 기본 자료형 데이터를 인스턴스화 하는 작업.

인스턴스 생성에 의해 이루어진다.

- Unboxing : 인스턴스에 저장되어 있는 기본 자료형 데이터를 꺼내는 작업.

Wrapper 클래스에 정의된 메소드의 호출에 의해서 이루어진다.

 

- BoxingUnboxing.java

class BoxingUnboxing {

    public static void main(String[] args) {

       Integer iValue = new Integer(10);                       //     Boxing

       Double dValue = new Double(3.14);                   //     Boxing

 

       System.out.println(iValue);
       System.out.println(dValue);

 

       ivalue = new Integer(iValue().intValue() + 10);                   //     Unboxing & Boxing

       dvalue = new Integer(dValue.doubleValue() + 1.2);           //     Unboxing & Boxing


       System.out.println(iValue);
       System.out.println(dValue);

    }

}

- Integer형 인스턴스에 저장되어 있는 정수 값을 얻기 위해서 intValue 메소드를 호출하고 있다. 

이 과정을 Unboxing이라 한다. 

 

ㅁ Wrapper 클래스는 String 클래스와 마찬가지로, 인스턴스에 저장되어 있는 값의 변경이 불가능 하다.

증가된 값을 저장하는 새로운 인스턴스의 생성 및 참조만이 가능하다. 

- BigInteger 클래스와 BigDecimal 클래스도 인스턴스에 저장된 값의 변경이 불가능하다.

 

ㅁ Auto Boxing & Auto Unboxing

- AutoBoxingUnboxing.java

class BoxingUnboxing {

    public static void main(String[] args) {

       Integer iValue = 10;                  //  auto boxing        

       Double dValue = 3.14;              //  auto boxing      

 

       System.out.println(iValue);
       System.out.println(dValue);

 

       int num1 = iValue;                  //    auto unboxing            

       double num2 = dValue;         //    auto unboxing              


       System.out.println(num1);              //   System.out.println(iValue);
       System.out.println(num2);              //   System.out.println(dValue);

    }

}

- num1에 저장될 값으로 int형 데이터가 등장해야 하는데, Integer형 참조변수 iValue가 등장하였다. 
이 경우 iValue.intValue()가 자동으로 호출되어 그 반환 값이 변수 num1에 저장된다. 
이 과정을 auto unboxing이라 한다.
 
 
- Integer형 참조변수가 와야 할 위치에 int형 데이터가 오면 Auto Boxing이 진행된다.
Int형 데이터가 와야 할 위치에 Integer형 참조변수가 오면 Auto Unboxing이 진행된다. 
 
 
 
-
Integer num1 = 10;
 
num1++;
 
 
여기서 num1++는, num1에 num1.intValue() + 1를 다시 넣은 것과 같다.
num1 = new Integer(num1.intValue() + 1);
 
 
 
ㅁ 기본 자료형 데이터를 이용한 Wrapper 클래스의 인스턴스 생성 방법(boxing)에는 두 가지가 있다.
(1) 키워드 new를 이용한 일반적인 인스턴스의 생성방법
(2) static 메소드를 이용한 인스턴스의 생성방법
 
class AboutStaticWrapping {
    public static void main(String[] args) {
 
        Integer iValue1 = new Integer(10);
        Integer iValue2 = new Integer(10);
 
 
        if(iValue1 == iValue2)
              System.out.println("동일 인스턴스 참조");
        else
              System.out.println("다른 인스턴스 참조");
    }
}
[실행 결과]
다른 인스턴스 참조
 
-
class AboutStaticWrapping {
    public static void main(String[] args) {
 
        Integer iValue1 = Integer.valueOf(10);
        Integer iValue2 = Integer.valueOf(10);
 
 
        if(iValue1 == iValue2)
              System.out.println("동일 인스턴스 참조");
        else
              System.out.println("다른 인스턴스 참조");
    }
}
[실행 결과]
동일 인스턴스 참조
 
 
- 다른 결과를 보이는 이유는, valueOf 메소드의 인스턴스 생성방식에 있다.
Wrapper 클래스는 String 클래스와 마찬가지로 인스턴스의 내용 변경이 불가능하다.
그래서 valueOf 메소드는 인스턴스의 생성 요청으로 전달되는 값에 해당하는 인스턴스가 이미 만들어진 상태라면,
새로운 인스턴스를 생성하지 않고 기존에 생성된 인스턴스의 참조값을 반환한다.
- 그러므로 valueOf 메소드를 이용한 인스턴스의 생성은 성능 향상으로 이어진다.
특별한 상황이 아니라면, static으로 선언된 valueOf 메소드를 이용해서 인스턴스를 생성하는 것이 좋다.
 
 
 
※ 참고 - String 클래스
-
public class StringComparisonExample {
     public static void main(String[] args) {
 
         // new 키워드로 각각 다른 객체 생성
         String str1 = new String("hello");
         String str2 = new String("hello");
 
         // 문자열 리터럴 사용
         String str3 = "hello";
         String str4 = "hello";
 
         // 참조값 비교
        System.out.println("new String(\"hello\") vs new String(\"hello\"): " + (str1 == str2)); // false
        System.out.println("new String(\"hello\") vs \"hello\": " + (str1 == str3)); // false
        System.out.println("\"hello\" vs \"hello\": " + (str3 == str4)); // true
     }
}
 
 
※ String 문자열을 char 배열로 만들기
 
String str = "kiwi";
char[] charArray = new char[str.length()];
 
for (int i = 0; i < str.length(); i++) {
             charArray[i] = str.charAt(i); }
 
// 변환된 char 배열을 출력해보겠습니다.
System.out.println("String \"kiwi\"를 char 배열로 변환한 결과:");
System.out.println(charArray);
 
[실행 결과]
String "kiwi"char 배열로 변환한 결과:
kiwi
 
 
 
 
 
ㅁ BigInteger 클래스와 BigDecimal 클래스
- short 그리고 int와 같은 정수 자료형의 문제점은 매우 큰 수의 표현이 불가능하나는데 있고, float 그리고 double과 같은 실수 자료형의 문제점은 정밀한 값의 표현이 불가능해 항상 오차가 존재하나는데 있다.
- 자바는 이러한 문제점의 해결을 위해서 BigInteger 클래스와 BigDecimal 클래스를 제공하고 있다.
 
 
ㅁ 매우 큰 정수의 표현을 위한 BigInteger 클래스
- 상황에 따라서 정수 자료형 중에서 가장 표현 범위가 넓은 long형으로도 표현 불가능한 수를 표현해야 할 때도 있다. 
 
- SoBigInteger.java
 
import java.math.*;
 
class SoBigInteger {
    public static void main(String[] args) {
        System.out.println("최대 정수 : " + Long.MAX_VALUE);
        System.out.println("최소 정수 : " + Long.MIN_VALUE);
 
        BigInteger bigValue1 = new BigInteger("100000000000000000000");
        BigInteger bigValue2 = new BigInteger("-99999999999999999999");
 
        BigInteger addResult = bigValue1.add(bigValue2);
        BigInteger mulResult = bigValue1.multiply(bigValue2);
 
        System.out.println("큰 수의 덧셈결과 : " + addResult);
        System.out.println("큰 수의 곱셈결과 : " + mulResult);
    }
}
[실행 결과]

최대 정수 : 9223372036854775807

최소 정수 : -9223372036854775808

큰 수의 덧셈결과 : 1

큰 수의 곱셈결과 : -9999999999999999999900000000000000000000

 
- BigInteger 클래스는 java.math 패키지에 묶여있다.
- 앞서 설명하지는 않았지만, Wrapper 클래스에는 각 자료형 별 최대값과 최소값의 크기 정보를 담고 있는 static 변수가 선언되어 있다. 
- BigInteger 클래스의 인스턴스 생성은 생성자를 통해서 표현하고픈 값을 전달하는데, 반드시 문자열로 정보를 담아서 전달해야 한다.
 
왜 반드시 문자열로 전달해야 할까?
 
정수를 전달받는 생성자가 정의되어 있지 않아서이기도 하지만, 
 
"저렇게 큰 수를 전달받을 수 있는 매개변수 선언이 불가능하기에, 당연히 생성자도 존재할 수 없기 때문이다."
 
 
 
ㅁ 오차 없는 실수의 표현을 위한 BigDecimal 클래스
- BigDecimal 클래스는 오차가 존재하지 않는 실수의 표현을 위해 정의된 클래스이다.
 
 
double e1 = 1.6;
double e2 = 0.1;
 
e1 + e2;       //         1.70000000000000002   
e1 * e2;        //         0.160000000000000003
 
 
-
import java.math.*;
 
class WowDoubleError {
    public static void main(String[] args) {
 
         BigDecimal e1 = new BigDecimal(1.6);
         BigDecimal e2 = new BigDecimal(0.1);
 
         System.out.println( e1.add(e2) );
         System.out.println( e1.multiply(e2) );
    }
}
[실행 결과]

1.7000000000000000943689570931383059360086917877197265625

0.1600000000000000177635683940025051398161724525855033823303533017413935457540219431393779814243316650390625

 
여전히 연산에 오차가 존재하는 이유는 인스턴스 생성을 위해서 1.6과 0.1을 인자로 전달하고 있기 때문이다ㅣ.
생성자는 전달받는 실수를 매개변수에 저장하는데 이 때 이미 오차가 발생한다. 
그래서 연산의 결과에도 당연히 오차가 존재하게 된다.
 
 
-
import java.math.*;
 
class NoErrorBigDecimal {
      public static void main(String[] args) {
 
             BigDecimal e1 = new BigDecimal("1.6");
             BigDecimal e2 = new BigDecimal("0.1");
 
             System.out.println( e1.add(e2) );
             System.out.println( e1.multiply(e2) );
 
      }
}

[실행 결과]

1.7

0.16

 

문자열로 전달해서 인스턴스를 생성하면 데이터 전달 과정에서 오차가 발생하지 않는다.

 

 

ㅁ 예제

- 프로그램 사용자로부터 두 개의 실수를 입력받은 후, 두 실수의 차에 대한 절대값을 계산하여 출력하는 프로그램을 작성하자. 단 오차가 존재하지 않아야 한다. (BigDecimal 클래스의 API 문서 참조)

 

Scanner sc = new Scanner(System.in);

 

    System.out.print("첫 번째 실수 : ");

    double num1 = sc.nextDouble();

    sc.nextLine();

    System.out.print("두 번째 실수 : ");

    double num2 = sc.nextDouble();

    sc.nextLine();

 

    System.out.println();

    BigDecimal b1 = new BigDecimal( String.valueOf(num1) );

    BigDecimal b2 = new BigDecimal( String.valueOf(num2) );

 

    BigDecimal result = b1.subtract(b2);

    System.out.println(result.abs());

 

- 사용자로부터 입력받은 값을 바로 문자열로 저장하면 더 간단함.

 

    System.out.print("첫 번째 실수 : ");

    String num1 = sc.nextLine();

    System.out.print("두 번째 실수 : ");

    String num2 = sc.nextLine();

 

    System.out.println();

    BigDecimal b1 = new BigDecimal( num1 );

    BigDecimal b2 = new BigDecimal( num2 );

 

 

 

 

ㅁ 수학관련 기능의 제공을 위한 Math 클래스

- Math 클래스는 모든 멤버가 static으로 선언되어 있다. 

- 인스턴스의 생성을 목적으로 정의된 클래스는 아니다.

 

- MathClass.java

 

class MathClass {

    public static void main(String[] args) {

   

        System.out.println("원주율 : " + Math.PI);

        System.out.println("2의 제곱근 : " + Math.sqrt(2) );

 

        System.out.println(

            "파이에 대한 Degree : " + Math.toDegrees( Math.PI) );      

        System.out.println(

            "2파이에 대한 Degree : " + Math.toDegrees( 2 * Math.PI) );

 

        System.out.println();

        double radian45 = Math.toRadians(45);          //      라디안으로의 변환

        System.out.println("싸인 45 : " + Math.sin(radian45) );

        System.out.println("코싸인 45 : " + Math.cos(radian45) );

        System.out.println("탄젠트 45 : " + Math.tan(radian45) );

 

        System.out.println("로그 25 : " + Math.log(25) );

        System.out.println("2의 4승 : " + Math.pow(2, 4) );

 

    }

}

[실행결과]

원주율 : 3.141592653589793

2의 제곱근 : 1.4142135623730951

파이에 대한 Degree : 180.0

2파이에 대한 Degree : 360.0

 

싸인 45 : 0.7071067811865475

코싸인 45 : 0.7071067811865476

탄젠트 45 : 0.9999999999999999

로그 25 : 3.2188758248682006

2의 4승 : 16.0

 

- toDegrees 메소드는 라디안 값을 육십분법인 디그리 단위로 변환한다.

- toRadians 메소드는 육십분법인 디그리 값을 라디안 값으로 변환한다.

(참고로 프로그래밍 언어에서는 라디안 단위가 주로 사용되기 때문에 이 두 메소드는 매우 유용하게 사용된다.)

 

- 싸인, 코싸인 그리고 탄젠트 값을 얻기 위해서 sin, cos, tan 메소드를 호출하고 있다.

중요한 것은 이 메소드들의 인자로 전달되는 값이 라디안 단위의 값이어야 한다는 사실이다.

 

 

- 제곱근(square root)란 '제곱한 수의 뿌리가 되는 수'라는 뜻으로서, 어떤 수 x를 제곱하여 a가 될 때, x를 a의 제곱근이라 고 한다.

 

- 원주는 원의 둘레를 말한다.

원주율이란 원주/지름을 말한다. (π)

모든 원의 원주율은 항상 일정하다.

 

- 각도의 표현.

각도를 표현하는 방법에는 각도법과 호도법이 있습니다.

각도법은 degree 호도법은 radian이라고 합니다.

 

각도법(60분법)은 원주를 360등분한 것의 하나를 1도로 정한 것.

 

호도법은 원의 기하학적인 특성을 활용한 각도의 표현 방법.

호도법은 호의 길이를 이용하여 각도를 재는 방법을 말한다.

 

 

라디안은 '호의 길이 / 반지름'으로 값을 나타낸다.

반지름이 1인 원의 호의 길이가 1인 중심각을 1 라디안이라고 한다.

 

반지름이 1, 호의 길이가 2 = 2 rad

반지름이 1, 호의 길이가 3 = 3 rad

 

- 호도법 (Radian)을 쓰는 이유

자동차가 달리고 있는데 오른쪽으로 10도 틀으라고 하면 감이 오지만 오른쪽으로 0.5 radian을 돌리라고 한다면 감이 오질 않습니다. 우리에게 친숙한 각은 degree입니다.
사람이 선호하는 신호체계는 degree인 반면, 컴퓨터나 수학에서 사용하는 각 체계는 radian입니다.

 

- degree와 radian의 변환 관계
180도는 (파이)* radian입니다.
이 관계를 이용하면 다음과 같이 degree와 radian의 단위를 변경 할 수 있습니다.

 

180 degree = π radian
1 degree = π / 180 radian
x degree = x * π / 180 radian
 
π radian = 180 degree
1 radian = 180 / π degree
x radian = x * 180 / π degree
 

 

 

ㅁ 난수(Random Number)의 생성

- 난수는 예측이 불가능한 수를 의미한다. 그리고 자바에서는 이러한 난수의 생성을 위한 클래스를 별도로 제공하고 있다.

- 참고로 난수의 생성은 매우 다양하게, 그리고 유용하게 사용된다.

- 자바에서 난수를 생성하는 방법은 의외로 쉽다.

먼저 다음과 같이 java.util 패키지로 묶여있는 Random 클래스의 인스턴스를 생성한다. 

 

Random rand = new Random();

 

그리고 목적에 따라 다음의 메소드 중에서 선택하여 호출한다. 그러면 난수가 반환된다.

 

boolean nextBoolean()             boolean형 난수 반환

int nextInt()                               int형 난수 반환

long nextLong()                        long형 난수 반환

 

int nextInt(int n)                       0이상 n미만의 범위 내에 있는 int형 난수 반환

float nextFloat()                       0.0이상 1.0미만의 float형 난수 반환

double nextDouble()                0.0이상 1.0미만의 double형 난수 반환      //      Math.random()과 동일

 

 

ㅁ 씨드(Seed) 기반의 난수 생성

- 난수의 생성은 생각보다 어려운 일이다. 

난수는 전혀 예측이 불가능한 수이어야 하는데, 컴퓨터는 완벽한 난수를 생성하지 못한다.

그래서 컴퓨터가 생성하는 난수를 가리켜 'Pseudo-random number(가짜 난수)'라고 한다.

 

-

Random rand = new Random(12);

 

for(int i=0; i<100; i++)

    System.out.println(rand.nextInt(1000) );

 

이 코드를 여러번 실행해보면   

이 값은 난수를 생성하는 과정에 있어서 씨앗으로 사용된다. 

컴퓨터에서 생성하는 난수는 근거, 또는 재료가 되는 하나의 숫자를 기반으로 만들어지도록 알고리즘이 설계되어 있다.

따라서 이 숫자를 씨앗 값, 씨드 값, seed number라고 한다.

씨앗이 같으면 생성되는 난수는 100% 동일하다.

 

Random rand = new Random(12);

rand.setSeed( System.currentTimeMillis() );

 

for(int i=0; i<100; i++)

    System.out.println( rand.nextInt(1000) );

 

이 코드에서는 숫자 12를 씨앗으로 삼지만, 곧바로 다음 행에서 다시 씨앗을 변경하고 있다.

씨앗을 얻기 위한 메소드는 System.currentTimeMillis()인데, 

이는 컴퓨터의 현재시간을 기준으로 1970년 1월 1일 자정 이후로 지나온 시간을 밀리초(1/1000초) 단위로 계산해서 반환하는 메소드이다. 

따라서 위 코드가 실행될 때마다 이 메소드가 반환하는 값은 달라지기에 setSeed 메소드에 매번 다른 값이 전달된다. 

 

Random 클래스의 매개값 없는 생성자는 this( System.currentTimeMillis() );로 또 다른 씨드 값을 받는 생성자를 호출하는 구조이다. 

그래서 Random 클래스를 매개값 없이 생성하는 경우 매번 다른 씨드값이 설정된다. 

 

 

ㅁ 예제

- 프로그램 사용자로부터 최대 정수 A와 최소 정수 B를 입력 받는다. 그리고 A와 B사이에 존재하는(A와 B도 포함) 난수 10개를 생성해서 출력하는 프로그램을 작성해보자.

-

Scanner sc = new Scanner(System.in);

 

System.out.print("최대 정수 입력 : ");

int max = sc.nextInt();

sc.nextLine();

System.out.print("최소 정수 입력 : ");

int min = sc.nextInt();

sc.nextLine();

 

System.out.println();

Random rand = new Random();

 

for(int i=0; i<10; i++) {

int random = rand.nextInt(max-min+1) +min;

System.out.println(random );

 

}

 

 

 

ㅁ 문자열 토큰(Token)의 구분 ( 문자열을 조건에 따라 나누는 방법 ) 

- "08:45"

 

이 문자열은 시 정보와 분 정보가 콜론을 기준으로 나눠져 있다. 위의 문자열에서는 콜론이 구분자(delimiter)이다.

구분자를 기준으로 나뉘어지는 문자열 정보를 가리켜 토큰(token)이라 한다.

- 컴퓨터 프로그램상에서 문자열 데이터의 분석이 필요한 상황이 흔하게 발생하는데, 이러한 경우에 유용하게 사용할 수 있는 것이 StringTokenizer 클래스이다.

- StringTokenizer 클래스를 이용하여 콜론을 기준으로 토큰을 추출하는 방법.
첫번째 전달인자로는 문자열 데이터를, 두번째 전달인자로는 구분자 정보를 문자열의 형태로 전달한다.

 

public StringTokenizer(String str, String delim)         //        생성자

 

- "08:45"를 콜론을 기준으로 구분하고 싶다면 아래와 같이 인스턴스를 생성한다.

StringTokenizer str = new StringTokenizer("08:45", ":");

 

그리고 

System.out.println(str.nextToken( ));          //         08

System.out.println(str.nextToken( ));          //         45

 

- 그런데 토큰의 수를 정확히 판단하기 어렵다면 아래의 메소드를 조건으로하여 반복문을 사용한다.

 

public boolean hasMoreTokens()               

 

hasMoreTokens() 메소드는 nextToken() 메소드를 호출해서 반환 받을 토큰이 남아있으면 true, 없으면 false를 반환한다.

 

-

StringTokenizer str = new StringTokenizer("08:45:07", ":");

 

while(str.hasMoreTokens()) {

       System.out.println(str.nextToken( ));

}

 

StringTokenizer은 다양한 생성자를 가지고, 토큰의 구분자가 둘 이상이 될 수 있다.

- TokenizeString2.java

import java.util.StringTokenizer;

 

class TokenizeString2 {

    public static void main(String[] args) {

        String str1 = "TEL 82-08-997-2059";           //         국제 전화번호

        String str2 = "num += 1";

 

        System.out.println("First Result...........");

        StringTokenizer st1 = new StringTokenizer(str1);

        while(st1.hasMoreTokens() ) {

            System.out.println(st1.nextToken() );

        }


        System.out.println("\nSecond Result...........");

        StringTokenizer st2 = new StringTokenizer(str1, " -");

        while(st2.hasMoreTokens() ) {

            System.out.println(st2.nextToken() );

        }

 

        System.out.println("\nThird Result...........");

        StringTokenizer st3 = new StringTokenizer(str2, "+=");

        while(st3.hasMoreTokens() ) {

            System.out.println(st3.nextToken() );

        }

    

        System.out.println("\nFourth Result...........");

        StringTokenizer st4 = new StringTokenizer(str2, "+=", true);

        while(st4.hasMoreTokens() ) {

            System.out.println(st4.nextToken() );

        }

 

    }

}

[실행 결과]

First Result...........

TEL

82-08-997-2059

 

Second Result...........

TEL

82

08

997

2059

 

Third Result...........

num

  1              <- 공백

 

Fourth Result...........

num

+

=

  1             <- 공백

 

- 문자열 정보만 전달하고 구분자 정보를 전달하지 않는 경우,

공백(스페이스바, \n, \t)을 기준으로 토큰이 나뉜다.

- StringTokenizer 생성자의 두번째 인자로 전달된 문자열(구분자)은 둘 이상이 될 수 있다.

" -"    //     공백문자(스페이스바)와 -문자로 이루어짐.

- StringTokenizer 생성자의 세번째 인자는 구분자를 토큰으로 간주하느냐 마느냐를 결정한다.