본문 바로가기
Back-End/Java

[Java] Util 패키지의 주요 클래스_Random, Math, Calendar , Array, ArrayList

by 찐코딩 2021. 8. 19.

  1. Random 클래스

   - 지정된 범위 내에서 임의의 난수를 발생시키는 클래스.

  - 생성자 Random()은 아래와 같이 종자값을 System.currentTimeMillis()로 하기 때문에 실행할 때마다 얻는 난수가 달라진다.

System.currentTimeMillis() : 현재 시간을 천분의 1초 단위로 변환해서 반환

 

public Random() {
	this(System.currentTimeMillis());	// Random(long seed)를 호출한다.
}

Random클래스의 메서드는 다양하지만, 그중 자주 쓰이는 주요 메서드는 아래와 같다.

 

○ 주요메서드

int nextInt() : 임의의 정수값을 반환

int nextInt(int n) : 0~n까지 범위 내에 있는 임의의 정수 값을 반환(★중요★ n은 포함하지 않고 반환한다.)

double nextDouble() : 0.0~1.0사이의 임의의 실수값을 반환

 

 - 활용 분야 : 게임, 확률 등에서 사용.

난수를 얻는 방법을 생각하면 Math.random()이 떠오를 것이다.
사실 Math.random()는 내부적으로 Random클래스의 인스턴스를 생성해서 사용하는 것이므로 둘 중에서 편한 것을 사용하면 됨
double randNum = Math.random();
double randNum = new Random().nextDouble(); 	//위 문장과 동일​

예제) Random 클래스를 이용하여 로또 번호 고르기

package Util;

import java.util.Random;

public class Ex01 {

	public static void main(String[] args) {
		
		// 로또 번호를 만들어 보자.
		Random random = new Random();
		
		int num = 0;
		
		// 중복이 있는 코드
		System.out.println("중복이 있는 코드");
		for(int i=1; i<=6; i++) {
			num = random.nextInt(45) + 1;	
			System.out.printf("%d\t", num);
		}
		
		System.out.println();
		
		//중복이 발생되지 않게 로또를 만들어보자
		System.out.println("중복이 없는 코드");
		int[] lotto = new int[6];		// 로또 배열 생성
		
		for(int i=0; i<lotto.length; i++) {
			lotto[i] = random.nextInt(45) + 1;
			
			if(i>0) {	// 두번째 시도부터 아래 반복문을 적용하겠다.
				for(int j=0; j<i; j++) {
					if(lotto[i] == lotto[j]) {		//중복인 경우
						lotto[i] = random.nextInt(45) + 1;
						j = -1;			// 이래야지만 계속 반복
					}
				}
			}	// if 문 종료
			
			System.out.printf("%d\t", lotto[i]);
		}
	}
}

결과

중복이 있는 코드
35	7	24	3	24	35	
중복이 없는 코드
35	27	3	13	23	34

로또 번호 생성 프로그램 코드는 코테에 자주 등장한다고 하니 잘 익혀두자

위 방법 말고도 풀 수 있는 코드가 많긴 하다

더보기

로또 번호 생성 방법 2)

package Util;

import java.util.Random;

public class LottoGenerator {

	public static void main(String[] args) {
		
		// 1 ~ 45사이의 숫자 6개를 무작위로 추출하여 출력(중복불가)
		Random random = new Random();
		
        // 배열 변수 선인 및 메모리 할당
		int[] arrLotto = new int[6];

		for (int i = 0; i < arrLotto.length ; i++){
			arrLotto[i] = random.nextInt(45) + 1;
			// 1~45사이의 정수를 랜덤하게 리턴
				for (int j = 0; j < i ; j++ ){
					if (arrLotto[j] == arrLotto[i]){
						// 기존의 숫자와 동일한 값이 있으면
						i--;
						break;	// 해당 반복문 탈출하여 다시 제일 바깥쪽 반복문으로 돌아감
				}
			}
		}
		// 출력
		for (int i = 0 ; i < arrLotto.length ; i++ ){
			System.out.print(arrLotto[i] + "\t");
		}
	}
}

결과

37	35	10	23	41	18

 

2. Math 클래스

     - 수학과 관련된 메서드를 제공해 주는 클래스.
     - 유일하게 java.lang 패키지에 있는 클래스임.

 

public class Ex02 {

	public static void main(String[] args) {

		// 1. max() : 최대값을 구해 주는 메소드 - 두 수를 비교
		//    min() : 최솟값을 구해주는 메소드 = 두 수를 비교
		int num1 =78, num2 = 91;
		
		System.out.println("최댓값 : " + Math.max(num1, num2));
		System.out.println("최솟값 : " + Math.min(num1,  num2));
		
		// 2. round() : 반올림이 적용되는 메소드
		System.out.println(123.566);
		System.out.println("Math.round : " + Math.round(123.566));
		
		// 3. abs() : 절대값을 구해주는 메소드
		System.out.println("abs : " + Math.abs(-125.34));
		
		
		// 4. ceil() : 무조건 올림을 해주는 메소드
		System.out.println("ceil() : " + Math.ceil(12.123));
		
	}

}

결과

최댓값 : 91
최솟값 : 78
123.566
Math.round : 124
abs : 125.34
ceil() : 13.0

 

  3. Calendar 클래스

- 날짜 / 시간 관련 정보를 제공해 주는 클래스.

- 날짜 / 시간과 관련된 정보를 제공해 주는 클래스.
- Calendar 클래스는 추상클래스임.

- 추상클래스로 작성된 이유 : 날짜와 시간을 계산하는 방법이 지역, 문화, 나라마다 다르기 때문임.
- Calendar 클래스에는 날짜와 시간을 계산하는데 꼭 필요한 메서드나 상수로 구성이 되어 있음.
- 추상클래스이지만 getInstance() 메서드를 이용하여 시스템의 날짜와 시간 정보를 표현할 수 있음.
- getInstance() : 싱글턴 방식. 하나의 인스턴스만을 가지고 공유해서 사용할 때 쓰는 방식.

package Util;

import java.util.Calendar;

// Calendar 클래스

public class Ex03 {

	public static void main(String[] args) {
		
		Calendar cal = Calendar.getInstance();
		
		// 날짜와 관련된 정보를 확인하는 방법
		int year = cal.get(Calendar.YEAR);		// 현재 년도
		int month = cal.get(Calendar.MONTH)+1;	// 현재 월 (1월을 0으로 표시했기 때문에)
		int day = cal.get(Calendar.DAY_OF_MONTH);
		int week = cal.get(Calendar.WEEK_OF_YEAR);// 현재 일자
		
		System.out.printf("현재 년도 : %d년\n", year);
		System.out.printf("현재 월 : %d월\n", month);
		System.out.printf("현재 일 : %d일\n", day);
		System.out.printf("현재 주는 52주 중에 %d 주 입니다.\n", week);
		
		// 시간과 관련된 정보를 확인하는 방법
		// 1. 12시간 제를 이용하는 방법_오전(0), 오후(1)
		//    형식) Calendar.AM_PM
		int am_pm = cal.get(Calendar.AM_PM);
		int hour = cal.get(Calendar.HOUR);      // 몇 시
		int minute = cal.get(Calendar.MINUTE);  // 몇 분
		int second = cal.get(Calendar.SECOND);  // 몇 초
		
		System.out.println("오전이면 0, 오후면 1 출력 : " + am_pm);
		
		if(am_pm == 0) {  // 오전인 경우
			System.out.println("현재 시간은 AM(오전) "+hour+"시 "+
					minute+"분 "+second+"초 입니다.");
		}else {
			System.out.println("현재 시간은 PM(오후) "+hour+"시 "+
					minute+"분 "+second+"초 입니다.");
		}
						
				
		// 2. 24시간제를 이용하는 방법
		//    형식) Calendar.HOUR_OF_DAY
		int hours = cal.get(Calendar.HOUR_OF_DAY);
		System.out.println("현재 시간은 "+hours+"시 "+minute+"분 "+
					second+"초 입니다.");
			}

	}

결과

현재 년도 : 2021년
현재 월 : 9월
현재 일 : 6일
현재 주는 52주 중에 37 주 입니다.
오전이면 0, 오후면 1 출력 : 1
현재 시간은 PM(오후) 5시 43분 59초 입니다.
현재 시간은 17시 43분 59초 입니다.

 

  4. Arrays 클래스

     - 배열 객체를 처리해주는 클래스.

     1) fill() : 배열의 요소를 특정한 값(데이터)으로 채우는 메서드.

     2) equals(객체, 객체) : 두 객체의 내용(데이터)이 같은지 틀린지 비교하는 메서드.  
        ==> return 값이 boolean형(true, false)
        ==> 객체의 방 마다 모든 데이터가 같아야만 true.

     3) sort() : 배열의 원소(데이터)를 정렬(오름차순)하는 메서드.

package Util;

import java.util.Arrays;
// Arrays 클래스
public class Ex04 {

	public static void main(String[] args) {
		
		// 배열 생성
		String[] str = {"홍길동", "이순신", "유관순"};
		
		for(String k : str) {
			System.out.println("str 배열 요소 : " + k);
		}
		
		System.out.println();
		
		// 1. fill() : 배열의 요소를 특정한 값(데이터)으로 채우는 메소드
		System.out.println("fill 메소드");
		Arrays.fill(str, "김유신");
		
		for(String k : str) {
			System.out.println("str 배열 요소 : " + k );
		}
		
		System.out.println();
				
		// 2. equals(객체, 객체)
		// 두 객체의 내용(데이터)이 같은지 다른지 비교하는 메소드
		String[] str2 = {"김유신", "김유신", "김유신"};
		
		System.out.println("equals 메소드");
		if(Arrays.equals(str, str)) {
			System.out.println("두 객체의 내용(데이터)은 같습니다.");
		}else {
			System.out.println("두 객체의 내용(데이터)은 다릅니다.");
		}
				
		System.out.println();
		
		// 3. sort() : 배열의 원소(데이터)를 정렬(오름차순)하는 메소드
		System.out.println("sort 메소드");
		int[] arr = {54, 67, 13, 97, 41};
		
		for(int k : arr) {
			System.out.printf("%d\t", k);
		}
		
		System.out.println();
		
		Arrays.sort(arr); 		// 오름차순 정렬
		
		for(int k : arr) {
			System.out.printf("%d\t", k);
		}
	}

}

결과

str 배열 요소 : 홍길동
str 배열 요소 : 이순신
str 배열 요소 : 유관순

fill 메소드
str 배열 요소 : 김유신
str 배열 요소 : 김유신
str 배열 요소 : 김유신

equals 메소드
두 객체의 내용(데이터)은 같습니다.

sort 메소드
54	67	13	97	41			// 오름차순 하지 않은 상태
13	41	54	67	97			// 오름차순 한 상태=>sort 메서드 적용

 

5. ArrayList 클래스

set(int index, E element) 메서드는 ArrayList에 담긴 객체를 변경

 

package Util;

// 1. ArrayList 클래스를 사용하기 위해 import
import java.util.ArrayList;

public class arrayList {

	public static void main(String[] args) {
		
		// 2. String을 담을 수 있는 ArrayList 객체 생성
		ArrayList<String> names = new ArrayList<String>();
		
		// 3. 리스트에 이름을 추가하시오.
		names.add("김");
		names.add("이");
		names.add("박");
		names.add("최");
		
		// 4. 반복문을 통해 모든 이름 출력하시오
		// ArrayList는 size로 배열의 크기를 반환 받을 수 있다.
		for(int i=0; i<names.size(); i++) {
			System.out.printf("names.get(%d) : %s\n", i, names.get(i));
		}
	}

}

결과

names.get(0) : 김
names.get(1) : 이
names.get(2) : 박
names.get(3) : 최

 

그렇다면 arrayList는 파라미터로 String이나 int타입만 받을수 있는가? 

객체도 담을 수 있다.

package Util;

//1. ArrayList 클래스를 사용하기 위해 import
import java.util.ArrayList;

public class ArrayList2 {

	public static void main(String[] args) {
		
		// 2. Book을 담을 수 있는 ArrayList 객체 생성
		ArrayList<Book> bookList = new ArrayList<Book>();
		
		// 3. 새로운 Book 객체 생성
		Book book1 = new Book("자바의 정석", 23000);
		Book book2 = new Book("수학의 정석", 21000);
		Book book3 = new Book("영어의 정석", 19000);
		
		
		// 4. ArrayList 객체에 Book 객체들을 담으시오
		bookList.add(book1);
		bookList.add(book2);
		bookList.add(book3);
		
		// 5. 반복문을 통해 모든 이름 출력하시오
		// ArrayList는 size로 배열의 크기를 반환 받을 수 있다.
		for(int i=0; i<bookList.size(); i++) {
				System.out.printf("bookList.get(%d) : %s\n", i, bookList.get(i));
		}	
	}	
}


class Book {
	
	// 필드
	private String title;
	private int price;
	
	// 생성자
	public Book(String title, int price) { 
		this.title = title;
		this.price = price;
	}
	
	// 메서드
	public String toString() {
		return String.format("Book [ name %s, price : %,d원]", title, price);
	}
}

결과

bookList.get(0) : Book [ name 자바의 정석, price : 23,000원]
bookList.get(1) : Book [ name 수학의 정석, price : 21,000원]
bookList.get(2) : Book [ name 영어의 정석, price : 19,000원]

 

댓글