Dico

[Java] package java.util 01

package java.util

java.util.Objects

Object 클래스의 보조 클래스

객체의 비교나 널 체크(null check)에 유용하다.

static boolean isNull(Object obj)

해당 객체가 null인지 확인하여 맞으면 true, 아니면 false 반환.

static boolean nonNull(Object obj)

!Object.isNull(obj)과 동일.

requireNonNull()

static <T> requireNonNull(T obj)
static <T> requireNonNull(T obj, String message)
static <T> requireNonNull(T obj, Supplier<String> messageSupplier)

해당 객체가 null이 아니어야 하는 경우에 사용.

객체가 null이면 NullPointerException을 발생시킨다.

두 번째 매개변수로 지정하는 문자열은 예외의 메시지가 된다.

static int compare(Object a, Object b, Comparator c)

두 객체를 대소 비교하는 메서드.

두 비교대상이 같으면 0, 크면 양수, 작으면 음수를 반환한다.

static boolean equals(Object a, Object b)

매개변수의 값이 null인지 확인하는 코드가 포함되어 있다.

a와 b가 모두 null인 경우, 참을 반환한다.

static boolean deepEquals(Object a, Object b)

객체를 재귀적으로 비교하기 때문에 다차원 배열의 비교도 가능하다.

static String toString(Object o)

static String toString(Object o, String nullDefault)

내부적으로 null을 검사한다.

두 번째 메서드는 o가 null일 때, 대신 사용할 값을 지정할 수 있다.

static int hashCode(Object o)

static int hash(Object... values)

내부적으로 null을 검사한다.

null이면 0을 반환한다.

두 번째 메서드는 클래스에 선언된 인스턴스의 변수들의 hashCode()를 조합해서 반환하도록 

hashCode()를 오버라이딩할 때 대신 사용하면 편리하다.

java.util.Random

난수를 얻을 수 있다.

종자값이 같은 Random 인스턴스들은 항상 같은 난수를 같은 순서대로 반환한다.

Random()

Random 인스턴스 생성.

종자값(seed)이 System.currentTimeMillis()로 되어 있어 실행할 때마다 얻는 난수가 달라진다.

  • System.currentTimeMillis() :  현재 시간을 천분의 1초 단위로 변환해서 반환한다.
public Random(){
    this(System.currentTimeMillis());       // Random(long seed)
}

Random(long seed)

매개변수 seed를 종자값으로 이용하는 Random 인스턴스를 생성한다.

boolean nextBoolean()

boolean타입의 난수를 반환.

void nextBytes(byte[] bytes)

bytes 배열에 byte 타입의 난수를 채워서 반환.

double nextDouble()

double 타입의 난수를 반환.

0.0 <= x < 1.0

float nextFloat()

float 타입의 난수를 반환.

0.0 <= x < 1.0

double nextGaussin()

평균은 0.0, 표준편차는 1.0인 가우시안 분포에 따른 double형의 난수를 반환.

int nextInt()

int타입의 난수를 반환.

int의 범위.

int nextInt(int n)

0 ~ n의 범위에 있는 int값을 반환.

n은 범위에 포함되지 않음.

long nextLong()

long타입의 난수를 반환.

long의 범위.

void setSeed(long seed)

종자값을 주어진 값으로 변경.

java.util.Scanner

화면, 파일, 문자열과 같은 입력소스로부터 문자 데이터를 읽어오는 데 도움을 줄 목적으로 JDK1.5부터 추가.

정규식 표현을 이용한 라인 단위의 검색 지원.

복잡한 형태의 구분자로 처리 가능.

JDK1.6부터 화면 입출력만 전문적으로 담당하는 java.io.Console 추가.

두 클래스는 사용법이나 성능측면에서 거의 같다.

실제 입력된 데이터 형식에 맞는 메서드를 사용해야 한다.

boolean nextBoolean()
byte nextByte()
short nextShort()
int nextInt()
long nextLong()
double nextDouble()
float nextFloat()
String nextLine()
// * EditPlus example
Scanner scan = new Scanner(System.in);
String input1 = scan.nextLine();

Console console = System.console();
String input2 = console.readLine();

System.out.println(input1 +" / " + input2);

java.util.StringTokenizer

긴 문자열을 지정된 구분자(Delimiter)를 기준으로 토큰(Token)이라는 여러 개의 문자열로 잘라내는 데 사용된다.

간단하고 명확한 결과를 얻을 수 있어 정규식 표현에 익숙하지 않은 경우 사용한다.

단, 구분자로 단 하나의 문자 밖에 사용하지 못한다.

String source = "10x=2*(1+y)-4";
String delim = "+-*/()=";
StringTokenizer st = new StringTokenizer(source, delim);

while (st.hasMoreTokens()) {
    Log.d("TAG_", st.nextToken());           // 10x  2  1  y  4
}

여러 문자들을 구분자로 지정했을 때 각각의 문자가 구분자로 사용된다.

StringTokenizer(String str, String delim)

문자열을 지정된 구분자로 나누는 StringTokenizer를 생성한다.

구분자는 토큰으로 간주되지 않는다.

StringTokenizer(String str, String delim, boolean returnDelims)

문자열을 지정된 구분자로 나누는 StringTokenizer를 생성한다.

returnDelims의 값을 true로 하면 구분자도 토큰으로 간주된다.

String source = "10x=2*(1+y)-4";
String delim = "+-*/()=";
StringTokenizer st = new StringTokenizer(source, delim, true);

while (st.hasMoreTokens()) {
    Log.d("TAG_", st.nextToken());           // 10x  =  2  *  (  1  +  y  )  -  4
}

int countTokens()

전체 토큰의 수를 반환한다.

boolean hasMoreTokens()

토큰이 남아있는지 알려준다.

String nextToken()

다음 토큰을 반환한다.

split() vs. StringTokenizer

String source = "1,2, ,,5,6";
String delim = ",";

String[] sp = source.split(delim);
StringTokenizer st = new StringTokenizer(source, delim);

for (int i = 0; i < sp.length; i++) {
    Log.d("TAG_", sp[i] + "-");

}

int i = 0;
for (; st.hasMoreTokens(); i++) {
    Log.d("TAG_", st.nextToken() + "-");
}

Log.d("TAG_", sp.length + "");               // 6
Log.d("TAG_", i + "");                       // 5
- sqlit -
D/TAG_: 1-
D/TAG_: 2-
D/TAG_:  -
D/TAG_: -
D/TAG_: 5-
D/TAG_: 6-

- StringTokenizer -
D/TAG_: 1-
D/TAG_: 2-
D/TAG_:  -
D/TAG_: 5-
D/TAG_: 6-

StringTokenizer는 빈 문자열을 토큰으로 인식하지 않는다.

split()은 데이터를 토큰으로 잘라낸 결과를 배열에 담아서 반환하기 때문에 많은 양의 데이터를 다룰 경우,

데이터를 토큰으로 바로바로 잘라서 반환하는 StringTokenizer보다 성능이 떨어진다.

참고 서적: 자바의 정석 3판