Object, String, StringBuffer 클래스에 이어 이번엔 Math 클래스이다.
Math 클래스 메서드의 가장 큰 특징은 전부 static한 메서드이기 때문에 객체를 생성하지 않고 직접 호출한다는 것이다.
따라서 사용 시에는 Math.random()과 같이 전부 클래스명을 붙여야 한다.
package kr.s28.lang.math;
public class MathMain {
public static void main(String[] args) {
int a = Math.abs(-10);
System.out.println("절댓값: " + a);
double b = Math.ceil(3.3);
System.out.println("올림: " + b);
double c = Math.floor(3.7);
System.out.println("절삭: " + c);
int d = Math.round(3.7f);
System.out.println("반올림: " + d);
int e = Math.max(3, 5);
System.out.println("최댓값: " + e);
int f = Math.min(4, 7);
System.out.println("최솟값: " + f);
}
}
int a = Math.abs(-10);
System.out.println("절댓값: " + a);
출력 결과)
절댓값: 10
double b = Math.ceil(3.3);
System.out.println("올림: " + b);
출력 결과)
올림: 4.0
double c = Math.floor(3.7);
System.out.println("절삭: " + c);
출력 결과)
절삭: 3.0
int d = Math.round(3.7f);
System.out.println("반올림: " + d);
출력 결과)
반올림: 4
int e = Math.max(3, 5);
System.out.println("최대값: " + e);
출력 결과)
최댓값: 5
int f = Math.min(4, 7);
System.out.println("최솟값: " + f);
출력 결과)
최솟값: 4
Math 클래스의 static한 메서드들 중 가장 사용하기 까다로운 것은 아무래도 Math.random()일 것이다.
이는 난수를 추출해 주는 메서드로, 겹치지 않게 숫자를 추출하기 때문에 행운권 추첨이나 격언 랜덤 노출 등에 사용한다.
package kr.s28.lang.math;
import java.util.Random;
public class RandomMain {
public static void main(String[] args) {
//배열 선언 및 생성, 초기화
String[] gift = {"스마트폰", "TV", "냉장고", "꽝!"};
// 0 1 2 3
double ran = Math.random();
System.out.println("발생한 난수: " + ran);
int index = (int)(ran*4);
System.out.println("정수로 변환한 난수: " + index);
System.out.println("오늘의 선물: " + gift[index]);
System.out.println("==========================");
String[] luck = {"귀인을 만남", "해외여행 출발", "로또 당첨", "피곤한 하루"};
// 0 1 2 3
Random r1 = new Random();
index = r1.nextInt(4);
System.out.println("발생한 난수: " + index);
System.out.println("오늘의 운세: " + luck[index]);
}
}
인덱스를 행운권 번호 삼아 각 상품명이 담겨 있는 배열이 있다고 하자.
ex. String[] gift = {"스마트폰", "TV", "냉장고", "꽝!"};
이클립스를 동작할 때마다 랜덤으로 경품을 지급하고자 한다. 우리는 이때 Math.random()을 사용하게 된다.
문제는 난수의 범위가 0.0에서 1.0 미만이라는 점이다.
double ran = Math.random();
System.out.println("발생한 난수: " + ran);
출력 결과)
발생한 난수: 0.8321604426637598 <- 이 값은 동작 시마다 달라진다.
1) 먼저 0~3 범위의 값이 필요하니 발생한 난수에 4를 곱한다.
2) 그 다음 double 타입의 난수를 int로 강제 형변환 하여 소수점 자리를 절삭한다.
3) 1.0 '미만'이기 때문에, 4가 곱해진 0부터 3.99999999...까지의 값이 소수점 자리가 절삭되며 0~3의 범위로 한정되게 된다.
System.out.println("발생한 난수: " + ran);
-
System.out.println("정수로 변환한 난수: " + index);
System.out.println("오늘의 선물: " + gift[index]);
출력 결과)
발생한 난수: 0.016540903700394072
정수로 변환한 난수: 0
오늘의 선물: 스마트폰
nextInt()를 활용하는 것이다.