[기본 개념] 4 | (2.1) Java.util.Object 클래스, Java.util.Random 클래스

728x90

[기본 개념] 4 | (2.1) Java.util.Object 클래스, Java.util.Random 클래스

1> java.util.Objects클래스

2> java.util.Random클래스

3 정규식(Regular Expression) - java.util.regex패키지

4 java.util.Scanner클래스

5 java.util.StringTokenizer클래스

6 java.math.BigInteger클래스

7 java.math.BigDecimal클래스

1. java.util.Objects클래스

Object클래스의 보조 클래스로, 모든 메서드가 'static'이다. 객체의 비교나 널 체크(null check)에 유용하다.

 

 isNull( )은 해당 객체가 널(null)인지 확인해서 null이면 true를 반환하고 아니면 false를 반환한다. 정반대의 일을 하는 nonNull( )이 있다.

 

static boolean isNull(Object obj)

static boolean nonNull(Object obj)

 

 그리고 requireNonNull( )은 해당 객체가 널(null)이 아니어야 하는 경우에 사용한다. 만일 객체가 널이면 NullPointerException을 발생시킨다. 두번째 매개변수로 지정하는 문자열은 예외의 메시지가 된다.

 

void seetName(String name) {

        this.name = Objects.requireNonNull(name, "name must not be null.") ;

}


 Object클래스에는 equals( )만 있고, 대소 비교를 위한 compare( )가 없었다. 그래서 Objects클래스에 compare( )가 추가되었다. 비교대상이 같으면 0, 크면 양수, 작으면 음수를 반환한다.

 

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

 

이 메서드는 a와 b 두 객체를 비교하는데 Comparator이라는 비교 기준으로 비교한다.

 

Object클래스에 정의된 equals( )과 달리 Objects클래스에 있는 equals( )는 null검사를 하지 않아도 된다.

 

if (Objects.equals(a, b)) {      // if (a! = null && a.equals(b)) 

         . . .                                           // 따라서 매개변수 값이 null인지 확인할 필요가 없다.

}

 

deepEquals( )라는 메서드는 객체를 재귀적으로 비교하기 때문에 다차원 배열의 비교도 가능하다.

 

String[ ][ ] str2D = new String[ ][ ]{{"aaa", "bbb"}, {"AAA", "BBB"}} ;

String[ ][ ] str2D2 = new String[ ][ ]{{"aaa", "bbb"}, {"AAA", "BBB"}} ;

 

System.out.println(Objects.equals(str2D, str2D2)) ;              // false

System.out.println(Objects.deepEquals(str2D, str2D2)) ;    // true

 

toString( )도 널일 때, 대신 사용할 값을 지정할 수 있다.

 

static String toString(Object o, String nullDefault)

 

 밑에의 Comparator는 문자열을 대소문자 구분하지 않고 비교할 때 사용하기 위한 것이다. 결과가 0이면 같다는 뜻이다.

 

Comparator c = String.CASE_INSENSITIVE_ORDER ;          // 대소문자 구분 안 하는 비교

System,out,println("compare(\"ab\",\"AB\") = "+ compare("ab", "AB", c)) ;      // 0 (같다)

2. java.util.Random클래스

Math.random( )을 사용해서 난수를 얻을 수도 있고, Random클래스를 사용해서도 난수를 얻을 수 있다.

 

double randNum = Math.random( ) ;

double randNum = new Random( ).nextDouble( ) ;     // 위의 문장과 동일

 

 Math.random( )과 달리 Random클래스에서는 종자값(seed)을 설정할 수 있다. 종자값은 난수를 만드는 공식에 사용되는 값이다. 종자값이 같은 Random클래스의 인스턴스들은 항상 같은 순서대로 반환한다.

 

Random클래스의 생성자와 메서드

 생성자 Random( )은 종자값을 System.currentTimeMillis( ) (현재시간을 천분의 1초 단위로 변환)로 하기 때문에 실행할 때마다 얻는 난수가 달라진다.

 

메서드 설명
Random( ) System.현재시간을 종자값으로 이용하는 Random인스턴스를 생성한다.
Random(long seed) 매개변수 seed를 종자값으로 하는 Random인스턴스를 생성한다.
boolean nextBoolean( ) boolean타입의 난수를 반환한다.
void nextBytes(byte[ ] bytes) bytes배열에 byte타입의 난수를 채워서 반환한다.
double nextDouble( ) double타입의 난수를 반환한다.
float nextFloat( ) float타입의 난수를 반환한다.
double nextGaussian( ) 평균은 0.0이고 표준편차는 1.0인 가우시안(Gaussian)분포에 따른 double형의 난수를 반환한다.
int nextInt( ) int타입의 난수를 반환한다.
int nextInt(int n) 0 ~ n의 범위에 있는 int값을 반환한다.
long nextLong( ) long타입의 난수를 반환한다.
void setSeed(long seed) 종자값을 주어진 값으로 변경한다.

 

자주 사용되는 코드는 메서드로 만들어 놓으면 도움이 된다.

 

int[ ] fillRand(int[ ] arr, int from, int to)

    : 배열 arr을 from과 to범위의 값들로 채워서 반환한다.

int[ ] fillRand(int[ ] arr, int[ ] data)

    : 배열 arr을 배열 data에 있는 값들로 채워서 반환한다.

int getRand(int from, int to)

    : from과 to범위의 정수(int)값을 반환한다. from과 to모두 범위에 속한다.

 

예제/RandomEx4.java

import java.util.*;

public class RandomEx4 {
    final static int RECORD_NUM = 10;   // 생성할 레코드의 수를 정한다.
    final static String TABLE_NAME = "TEST_TABLE";
    final static String[] CODE1 = {"010", "011", "017", "018", "019"};
    final static String[] CODE2 = {"남자", "여자"};
    final static String[] CODE3 = {"10대", "20대", "30대", "40대", "50대"};

    public static void main(String[] args) {
        for (int i = 0; i < RECORD_NUM; i++) {
            System.out.println("INSERT INTO " + TABLE_NAME + "VALUES ("
                    + " '" + getRandArr(CODE1) + "'"
                    + ", '" + getRandArr(CODE2) + "'"
                    + ", '" + getRandArr(CODE3) + "'"
                    + ", " + getRand(100, 200) + "); ");
        }
    }

    public static String getRandArr(String[] arr) {
        return arr[getRand(arr.length-1)];      // 배열에 저장된 값중 하나를 반환한다.
    }

    public static int getRand(int n) { return getRand(0, n); }
    public static int getRand(int from, int to) {
        return (int)(Math.random()*(Math.abs(to - from) + 1)) + Math.min(from, to);
    }
}
실행결과

INSERT INTO TEST_TABLEVALUES ( '010', '여자', '10대', 152); 
INSERT INTO TEST_TABLEVALUES ( '011', '여자', '20대', 183); 
INSERT INTO TEST_TABLEVALUES ( '017', '남자', '30대', 109); 
INSERT INTO TEST_TABLEVALUES ( '017', '남자', '50대', 131); 
INSERT INTO TEST_TABLEVALUES ( '011', '남자', '30대', 176); 
INSERT INTO TEST_TABLEVALUES ( '017', '남자', '50대', 118); 
INSERT INTO TEST_TABLEVALUES ( '019', '여자', '30대', 163); 
INSERT INTO TEST_TABLEVALUES ( '018', '여자', '50대', 133); 
INSERT INTO TEST_TABLEVALUES ( '019', '남자', '30대', 195); 
INSERT INTO TEST_TABLEVALUES ( '010', '여자', '50대', 117);

 

 위의 예제는 지금까지 했던 연속적인 범위 내에 값을 얻어오는 것이 아닌 불연속적인 범위에 있는 값을 임의로 얻어왔다.

 

 이런 경우 불연속적인 값을 배열에 저장한 후, 배열의 index를 임의로 얻어서 저장된 값을 읽어오도록 하면 된다.

 

 

 

 

출처 | Java의 정석 (남궁 성)

728x90