Java의 수학 클래스(Math Class)

소개

Java Math 클래스는 min(), max(), avg(), sin(), cos(), tan(), round(), ceil(), floor(), abs()와 같은 수학 계산을 수행하는 여러 메서드를 제공합니다. 이 글에서는 Java Math 클래스와 그 기본 메서드, 그리고 Java 프로그래밍 언어에서 제공하는 생성자에 대해 알아보겠습니다.

Java의 Math 클래스

Math 클래스는 수학에서 자주 사용하는 상수들과 함수들을 미리 구현해 놓은 클래스입니다.

Math 클래스의 모든 메소드는 클래스 메소드(static method)이므로, 객체를 생성하지 않고도 바로 사용할 수 있습니다.

이러한 Math 클래스는 java.lang 패키지에 포함되어 제공됩니다.

int 또는 long 크기이고 결과가 값의 범위를 초과하는 경우 메서드 addExact(), subtractExact(), multiplyExact(), 및 toIntExact()는 ArithmeticException을 throw합니다.

증가, 감소, 나눗셈, 절대값 및 부정 등의 다른 산술 연산의 경우 오버플로우는 특정 최소값 또는 최대값에만 발생합니다. 적절한 최대값 및 최소값과 비교해야 합니다.

Math 클래스 선언

다음은 java.lang.Math 클래스의 선언입니다.

public final class Math
   extends Object

Math 클래스의 완전한 예제 프로그램

다음은 java.lang.Math 클래스의 완전한 예제 프로그램입니다.

public class MathClassExample1 {
    public static void main(String[] args) {
        double x = 28;
        double y = 4;
        System.out.println("x와 y의 최댓값은: " + Math.max(x, y));
        System.out.println("y의 제곱근은: " + Math.sqrt(y));
        System.out.println("x와 y의 거듭제곱은: " + Math.pow(x, y));
        System.out.println("x의 로그는: " + Math.log(x));
        System.out.println("y의 로그는: " + Math.log(y));
        System.out.println("x의 로그10 로그는: " + Math.log10(x));
    }
}

위의 프로그램은 다음 출력을 생성합니다.

x와 y의 거듭제곱은: 614656.0
x의 로그는: 3.332204510175204
y의 로그는: 1.3862943611198906
x의 로그10 로그는: 1.4471580313422192

Math 클래스에서 NaN 값이란 무엇인가요?

NaN은 숫자가 아님을 나타냅니다. NaN은 부동 소수점 연산이 정의되지 않은 결과를 생성하도록 하는 입력 매개 변수를 가지고 있을 때 발생합니다. 예를 들어, 0.0으로 나눈 경우는 산술적으로 정의되지 않습니다. 음수의 제곱근을 찾는 것도 정의되지 않습니다.

NaN 값의 완전한 프로그램은 다음과 같습니다.

public class NaNValueExample {
    public static void main(String[] args) {
        System.out.println(2.0 % 0);
        System.out.println(0.0 / 0);
        System.out.println(Math.sqrt(-1));
    }
}

위의 프로그램은 다음 출력을 생성합니다.

NaN
NaN
NaN

NaN 값 비교 방법은 어떻게 되나요?

NaN을 사용한 모든 숫자 연산은 결과로 NaN을 생성합니다. 이는 NaN이 정렬되지 않았기 때문에 NaN이 하나 이상의 NaN과 관련된 숫자 비교 연산에서 false를 반환하는 이유입니다.

숫자 비교 연산자 <, <=, > 및 >=는 NaN이 하나 이상의 피연산자인 경우 항상 false를 반환합니다.
등가 연산자 ==는 피연산자 중 하나가 NaN인 경우 false를 반환합니다.
부등호 연산자 !=는 피연산자 중 하나가 NaN인 경우 true를 반환합니다.

NaN 값 비교의 완전한 프로그램은 다음과 같습니다.

public class CompareNaNValues {
    public static void main(String[] args) {
        System.out.print("동일한지 확인 :");
        System.out.println(Float.NaN == Float.NaN);
        System.out.print("동일하지 않은지 확인 : ");
        System.out.println(Float.NaN != Float.NaN);
        System.out.print("동일한지 확인 : ");
        System.out.println(Double.NaN == Double.NaN);
        System.out.print("동일하지 않은지 확인 : ");
        System.out.println(Double.NaN != Double.NaN);
        double NaN = 2.1 % 0;
        System.out.println((2.1 % 0) == NaN);
        System.out.println(NaN == NaN);
    }
}

위의 프로그램은 다음 출력을 생성합니다.

동일한지 확인 :false
동일하지 않은지 확인 : true
동일한지 확인 : false
동일하지 않은지 확인 : true
false
false

Java에서의 수학 클래스 메소드

Java의 Math 클래스는 로그, 세제곱근, 삼각함수 등과 같은 기본 수치 연산을 수행하기 위한 다양한 메소드를 포함하고 있습니다. Java의 Math 클래스에서 제공하는 다양한 메소드는 다음과 같습니다.

1) Java에서의 Math.abs() 메소드

java.lang.Math.abs() 메소드는 int, double, long 및 float와 같은 다양한 유형의 값의 절대값을 반환합니다. 이 메소드는 인수의 절대값을 반환하며, 인수는 int, double, long 및 float가 될 수 있습니다.

  • 인수가 양수 0 또는 음수 0인 경우 결과는 양수 0입니다.
  • 인수가 무한대인 경우 결과는 양의 무한대입니다.
  • 인수가 NaN인 경우 결과는 NaN입니다.

구문

public static int abs(int i) 
public static double abs(double d) 
public static float abs(float f) 
public static long abs(long lng) 

아래는 java.lang.Math.abs() 메소드 예제의 전체 프로그램입니다.

import java.lang.Math;
public class MathClassExample2 {
    public static void main(String[] args) {
        double x = 4876.1874d;
        double y = -0.0d;
        // 절대값을 얻고 출력
        System.out.println("x의 절대값 =" + Math.abs(x));
        System.out.println("y의 절대값 =" + Math.abs(y));
        System.out.println("(-9999.555d)의 절대값 =" + Math.abs(-9999.555d));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

x의 절대값 = 4876.1874
y의 절대값 = 0.0
(-9999.555d)의 절대값 = 9999.555

2) Java에서의 Math.acos() 메소드

java.lang.Math.acos(double a) 메소드는 0.0부터 pi까지의 범위에서 각도의 아크 코사인 값을 반환합니다. 인수가 NaN이거나 절대값이 1보다 크면 결과는 NaN입니다.

구문

public static double acos(double a)

아래는 java.lang.Math.acos(double a) 메소드 예제의 전체 프로그램입니다.

import java.lang.Math;
public class MathClassExample3 {
    public static void main(String[] args) {
        double x = Math.PI / 2;
        x = Math.toRadians(x);
        System.out.println("Math.acos() 예제" + Math.acos(x));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

Math.acos() 예제1.5707963267948966

3) Java에서의 Math.asin() 메소드

java.lang.Math.asin(double a) 메소드는 메소드 인수로 전달된 값의 아크 사인 값을 반환합니다. 반환된 각도는 -pi/2에서 pi/2 범위에 있습니다.

  • 인수가 NaN이거나 절대값이 1보다 크면 결과는 NaN입니다.
  • 인수가 0인 경우 결과는 인수와 동일한 부호의 0입니다.

구문

public static double asin(double a)

아래는 java.lang.Math.asin(double a) 메소드 예제의 전체 프로그램입니다.

public class MathClassExample4 {
    public static void main(String[] args) {
        double x = Math.PI / 2;
        System.out.println("Math.asin() 예제 =" + Math.asin(x));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

Math.asin() 예제 =1.5707963267948966

4) Java에서의 Math.toRadians() 메소드

java.lang.Math.toRadians(double deg) 메소드는 도 단위로 측정된 각도를 거의 동일한 각도로 측정된 라디안으로 변환합니다. 일반적으로 각도는 실제 응용 프로그램에서는 다르기 때문에 Math 클래스는 라디안을 입력으로 취합니다.

구문

public static double toRadians(double deg)

아래는 java.lang.Math.toRadians(double deg) 메소드 예제의 전체 프로그램입니다.

import java.lang.Math;
public class MathClassExample5 {
    public static void main(String[] args) {
        double x = 45;
        double y = -180;
        x = Math.toRadians(x);
        y = Math.toRadians(y);
        System.out.println("x의 Math.toRadians() = " + Math.toRadians(x));
        System.out.println("y의 Math.toRadians() = " + Math.toRadians(y));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

x의 Math.toRadians() = 0.7853981633974483
y의 Math.toRadians() = -3.141592653589793

5) Java에서의 Math.max() 메소드

java.lang.Math.max()는 Java에서 두 인수 중 더 큰 값을 반환하는 내장 메소드입니다. 이 메소드는 int, float, double 및 long으로 취한 두 인수 중에서 최대 값을 반환합니다.

  • 두 양수 값을 인수로 제공하면 이 메소드는 더 큰 인수를 반환합니다.
  • 두 음수 값을 인수로 제공하면 더 작은 절대값을 가진 인수를 반환합니다.
  • 인수가 숫자가 아닌 경우 (NaN) 이 메소드는 NaN을 반환합니다.

구문

public static int max(int a, int b)
public static double max(double a, double b)
public static long max(long a, long b)
public static float max(float a, float b)

아래는 java.lang.Math.max() 메소드 예제의 전체 프로그램입니다.

public class MathClassExample6 {
    public static void main(String args[]) {
        // 두 숫자 중 최대값 출력
        // 두 정수 값을 비교
        int x = 20;
        int y = 50;
        System.out.println(Math.max(x, y));
        // 두 실수 값을 비교
        double a = 25.67;
        double b = -38.67;
        System.out.println(Math.max(a, b));
        // 두 실수 값을 비교
        float p = -25.74f;
        float q = -20.38f;
        System.out.println(Math.max(p, q));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

50
25.67
-20.38

6) Java에서의 Math.min() 메소드

java.lang.Math.min()은 Java에서 두 인수 중 더 작은 값을 반환하는 내장 메소드입니다. 이 메소드는 int, float, double 및 long으로 취한 두 인수 중에서 최소 값을 반환합니다.

  • 두 양수 값을 인수로 제공하면 이 메소드는 더 작은 인수를 반환합니다.
  • 두 음수 값을 인수로 제공하면 더 큰 절대값을 가진 인수를 반환합니다.
  • 인수가 숫자가 아닌 경우 (NaN) 이 메소드는 NaN을 반환합니다.

구문

public static int min(int a, int b)
public static double min(double a, double b)
public static long min(long a, long b)
public static float min(float a, float b)

아래는 java.lang.Math.min() 메소드 예제의 전체 프로그램입니다.

public class MathClassExample7 {
    public static void main(String args[]) {
        // 두 숫자 중 최소값 출력
        int x = 20;
        int y = 50;
        System.out.println(Math.min(x, y));
        double a = 25.67;
        double b = -38.67;
        System.out.println(Math.min(a, b));
        float p = -55.73f;
        float q = -30.95f;
        System.out.println(Math.min(p, q));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

20
-38.67
-55.73

7) Java에서의 Math.nextAfter() 메소드

java.lang.Math.nextAfter() 메소드는 첫 번째 인수의 방향으로 두 번째 인수와 인접한 부동 소수점 숫자를 반환합니다. 첫 번째 및 두 번째 인수가 동일한 경우 이 메소드는 두 번째 인수를 반환합니다.

  • 어느 하나의 인수가 NaN이면 이 메소드는 NaN을 반환합니다.
  • 두 인수가 부호 있는 0인 경우 방향은 변경되지 않습니다.
  • 시작 인수(a)가 양수 또는 음수 Double.MIN_VALUE 또는 Float.MIN_VALUE와 같고 방향 인수(b)가 결과가 더 작은 크기를 가져야 하는 값이라면 이 메소드는 시작 인수와 동일한 부호를 가진 0을 반환합니다.
  • 시작 인수(a)가 양수 또는 음수 Double.MAX_VALUE 또는 Float.MAX_VALUE와 같고 방향 인수(b)가 결과가 더 큰 크기를 가져야 하는 값이라면 이 메소드는 시작 인수와 동일한 부호를 가진 무한대를 반환합니다.

전체 프로그램의 예제

public class MathClassExample8 {
    public static void main(String[] args) {
        double x = 98759.765;
        double y = 154.28764;
        float a = 787.843f;
        double b = 345.56;

        System.out.println(Math.nextAfter(a, b));
        System.out.println(Math.nextAfter(a, b));

        System.out.println("Math.nextAfter(" + x + "," + y + ")=" + Math.nextAfter(x, y));
        System.out.println("Math.nextAfter(" + y + "," + x + ")=" + Math.nextAfter(y, x));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

787.84296
787.84296
Math.nextAfter(98759.765,154.28764)=787.84296
Math.nextAfter(154.28764,98759.765)=787.84296

8) Java에서의 Math.nextUp() 메소드

java.lang.Math.nextUp(double d) 메소드는 d의 양의 무한대 방향에 가까운 부동 소수점 값을 반환합니다. 이 메소드는 nextAfter(d, Double.POSITIVE_INFINITY)와 의미적으로 동일하지만 nextAfter 호출에 비해 더 빠를 수 있습니다.

  • 인수가 NaN이면 결과는 NaN입니다.
  • 인수가 양의 무한대이면 결과는 양의 무한대입니다.
  • 인수가 0이면 결과는 Double.MIN_VALUE입니다.

전체 프로그램의 예제

public class MathClassExample9 {
    public static void main(String[] args) {
        double x = 98759.765
        double y = 154.28764;
        float d = 0.0f / 0;

        // 양의 무한대 방향으로 가까운 다음 부동 소수점 값을 출력합니다
        System.out.println("Math.nextUp = " + Math.nextUp(x));
        System.out.println("Math.nextUp = " + Math.nextUp(y));

        // NaN을 입력하면 NaN을 출력합니다
        System.out.println(Math.nextUp(d));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

Math.nextUp = 98759.76500000001
Math.nextUp = 154.28764
NaN

9) Java에서의 Math.nextDown() 메소드

java.lang.Math.nextDown() 메소드는 음의 무한대 방향에 가까운 부동 소수점 값을 반환합니다. 이 메소드는 nextAfter(d, Double.NEGATIVE_INFINITY) 메소드와 동일합니다.

  • 인수가 NaN이면 이 메소드는 NaN을 반환합니다.
  • 인수가 0이면 이 메소드는 Double.MIN_VALUE를 반환합니다.

전체 프로그램의 예제

public class MathClassExample10 {
    public static void main(String[] args) {
        float x = 0.0f / 0;
        double d = 744.93;
        float f = 328.7f;

        System.out.println(Math.nextDown(f));
        System.out.println(Math.nextDown(x));
        System.out.println(Math.nextDown(d));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

3.4028235E38
-0.0
3.4028234663852886E38

10) Java에서의 Math.pow() 메소드

java.lang.Math.pow() 메소드는 첫 번째 인수를 두 번째 인수의 거듭제곱으로 반환합니다. 이 메소드의 반환 유형은 double입니다.

  • 두 번째 인수가 양수 또는 음수 제로인 경우 이 메소드는 1.0을 반환합니다.
  • 두 번째 인수가 숫자가 아닌 경우 (NaN) 이 메소드는 NaN을 반환합니다.
  • 두 번째 인수가 1인 경우 이 메소드는 결과를 첫 번째 인수와 동일한 값으로 반환합니다.

전체 프로그램의 예제

public class MathClassExample11 {
    public static void main(String[] args) {
        // double 값의 거듭제곱
        double x = 2.0;
        double y = 5.4;

        System.out.println("Math.pow(" + x + "," + y + ")= " + Math.pow(x, y));

        // 정수 값의 거듭제곱
        double a = 5;
        double b = 4;
        System.out.println("Math.pow(" + a + "," + b + ")= " + Math.pow(a, b));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

Math.pow(2.0,5.4)= 45.254833995939045
Math.pow(5.0,4.0)= 625.0

11) Java에서의 Math.random() 메소드

java.lang.Math.random() 메소드는 0.0 이상 1.0 미만인 의사 난수 double 형태의 숫자를 반환합니다. 이 메소드는 항상 0과 1 사이의 범위에서 난수를 생성합니다. 이 메소드는 처음 호출될 때 항상 새로운 의사 난수 생성기를 생성하며 이 생성기는 new java.util.Random 표현식에 의해 생성된 것처럼 정확하게 하나의 새로운 의사 난수 생성기를 생성합니다.

참고: 특정 범위의 값을 원한다면 반환된 값에 범위의 크기를 곱해야 합니다. 예를 들어 0에서 20 사이의 무작위 숫자를 얻으려면 반환된 값에 20을 곱해야 원하는 결과를 얻을 수 있습니다.

전체 프로그램의 예제

public class MathClassExample12 {
    public static void main(String[] args) {
        double x = Math.random();
        double y = Math.random();
        double a = Math.random() * 20;

        // 이 코드를 실행할 때마다 출력이 다릅니다.
        System.out.println("무작위 숫자 1 : " + x);
        System.out.println("무작위 숫자 2 : " + y);
        System.println("무작위 숫자 3 : " + a);
    }
}

위 프로그램은 매번 다른 출력을 생성합니다.

출력

무작위 숫자 1 : 0.123456789
무작위 숫자 2 : 0.987654321
무작위 숫자 3 : 15.432100000000001

12) Java에서의 Math.round() 메소드

java.lang.Math.round() 메소드는 소수점을 가장 가까운 값으로 반올림합니다. 이 메소드는 인수와 가장 가까운 long을 반환합니다. 동점이 발생하면 양의 무한대로 반올림합니다.

  • 인수가 NaN이면 결과는 0입니다.
  • 인수가 음의 무한대이거나 Long.MIN_VALUE보다 작거나 같으면 결과는 Long.MIN_VALUE와 같습니다.
  • 인수가 양의 무한대이거나 Long.MAX_VALUE보다 크거나 같으면 결과는 Long.MAX_VALUE와 같습니다.

전체 프로그램의 예제

public class MathClassExample13 {
    public static void main(String[] args) {

        double x = 1654.9874;
        double y = -9765.134;

        System.out.println("Math.round(" + x + ") = " + Math.round(x));
        System.out.println("Math.round(" + y + ") = " + Math.round(y));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

Math.round(1654.9874) = 1655
Math.round(-9765.134) = -9765

13) Java에서의 Math.sqrt() 메소드

java.lang.Math.sqrt() 메소드는 인수의 양의 제곱근을 반환합니다. 이 메소드의 반환 유형은 double입니다.

  • 인수가 음수이면 결과는 NaN입니다.
  • 인수가 양의 무한대이면 결과는 양의 무한대입니다.
  • 인수가 0이면 결과는 0.0입니다.

전체 프로그램의 예제

public class MathClassExample14 {
    public static void main(String[] args) {
        double x = 16.0;
        double y = 121.0;

        System.out.println("Math.sqrt(" + x + ") = " + Math.sqrt(x));
        System.out.println("Math.sqrt(" + y + ") = " + Math.sqrt(y));
    }
}

위 프로그램은 다음 출력을 생성합니다.

출력

Math.sqrt(16.0) = 4.0
Math.sqrt(121.0) = 11.0

결론

여러 가지 유용한 Math 클래스의 메소드를 다루었습니다. 이러한 메소드를 사용하여 숫자 연산 및 계산을 수행할 수 있습니다. 이러한 Math Class 는 계산이나 과학적 애플리케이션에서 자주 사용되며 Java에서 수학적 작업을 보다 쉽게 수행할 수 있도록 도와줍니다.

Leave a Comment