[Java] #25 Math 클래스

febCho·2023년 12월 23일

Java

목록 보기
48/53

Object, String, StringBuffer 클래스에 이어 이번엔 Math 클래스이다.

Math

1. abs() ~ min()

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);
	}
}
  1. abs() : 절댓값을 구한다. 이 메서드를 배웠으니, 이제 조건(삼항) 연산자를 통해 절댓값을 구할 필요가 없어진 것이다.
    참고) 5. 조건(삼항) 연산자
int a = Math.abs(-10);
System.out.println("절댓값: " + a);
출력 결과)
절댓값: 10
  1. ceil() : 올림한다.
double b = Math.ceil(3.3);
System.out.println("올림: " + b);
출력 결과)
올림: 4.0
  1. floor() : 내림한다.
double c = Math.floor(3.7);
System.out.println("절삭: " + c);
출력 결과)
절삭: 3.0
  1. round() : 반올림한다.
int d = Math.round(3.7f);
System.out.println("반올림: " + d);
출력 결과)
반올림: 4
  1. max() : 인자로 주어진 두 숫자 중 최댓값을 반환한다.
int e = Math.max(3, 5);
System.out.println("최대값: " + e);
출력 결과)
최댓값: 5
  1. min() : 인자로 주어진 두 숫자 중 최솟값을 반환한다.
int f = Math.min(4, 7);
System.out.println("최솟값: " + f);
출력 결과)
최솟값: 4

2. random()

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]);
		
	}
}
  1. 인덱스를 행운권 번호 삼아 각 상품명이 담겨 있는 배열이 있다고 하자.
    ex. String[] gift = {"스마트폰", "TV", "냉장고", "꽝!"};

  2. 이클립스를 동작할 때마다 랜덤으로 경품을 지급하고자 한다. 우리는 이때 Math.random()을 사용하게 된다.
    문제는 난수의 범위0.0에서 1.0 미만이라는 점이다.

double ran = Math.random();
System.out.println("발생한 난수: " + ran);
출력 결과)
발생한 난수: 0.8321604426637598 <- 이 값은 동작 시마다 달라진다.
  1. 따라서 우리는 원하는 범위의 값을 얻기 위해 기존의 난수를 가공해야 한다.

1) 먼저 0~3 범위의 값이 필요하니 발생한 난수에 4를 곱한다.
2) 그 다음 double 타입의 난수를 int로 강제 형변환 하여 소수점 자리를 절삭한다.
3) 1.0 '미만'이기 때문에, 4가 곱해진 0부터 3.99999999...까지의 값이 소수점 자리가 절삭되며 0~3의 범위로 한정되게 된다.

  1. 그렇게 구한 랜덤한 범위의 값을 인덱스로 활용해 선물 배열의 값을 출력 결과는 다음과 같다.
System.out.println("발생한 난수: " + ran);
-
System.out.println("정수로 변환한 난수: " + index);
System.out.println("오늘의 선물: " + gift[index]);
출력 결과)
발생한 난수: 0.016540903700394072
정수로 변환한 난수: 0
오늘의 선물: 스마트폰
  1. 독자적인 랜덤 클래스를 활용하는 방법도 있다. 바로 랜덤 클래스가 가지고 있는 메서드 중 정수를 반환하는 메서드 nextInt()를 활용하는 것이다.
    nextInt()는 0부터 인자로 전달된 값 전까지의 범위로 난수를 발생시킨다.
profile
Done is better than perfect.

0개의 댓글