공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

 

 

Math 클래스

   Math 클래스는 기본적인 수학계산에 유용한 메서드로 구성되어있다.  Math 클래스는 클래스 내에 인스턴스 변수가 하나도 없어서 인스턴스를 생성할 필요가 없기 때문에 생성자가  private 이다. 그래서 다른 클래스에서  Math 인스턴스를 생성할 수 없다. 

 

 

 

Math클래스의 메서드

메서드 설  명
static double abs(double d)
static float abs(float f)
static int abs(int i)

static long abs(long l)

주어진 값의 절대값을 반환

static double ceil(double d) 값 올림한 값을 반환
static double floor(double d) 값 내림(버림)한 값을 반환
static double max(double a, double b)
static float max(float a, float b)
static int max(int a, int b)
static long max(long a, long b)
두 값을 비교하여 큰 수를 반환
static double min(double a, double b)
static float min(float a, float b)
static int min(int a, int b)
static long min(long a, long b)
두 값을 비교하여 작은 수를 반환
static double exp(double p) 상수  e 값(약  2.71828 )을 p만큼 거듭제곱하는 함수
static double pow(double a, double b)  a 를  b 만큼 누승한 값을 반환 ( a^b )
static double sqrt(double a)  a 의 제곱근을 반환
( a 는 양수여야 한다.)
static cbrt(double a)  a 의 세제곱근을 반환
static double random( )  0.0 <= random < 1 범위의 임의의 double값 반환
( 1 은 포함되지 않는다) 
static double rint(double d) 주어진  double 값과 가장 가까운 정수값을  double 형으로 반환

double d1 = Math.rint(5.5); → 6반환
double d2 = Math.rint(-5.5); → 6반환
static long round(double d)
static long round(float f)
소수점 첫째자리에서 반올림한 정수값( long )을 반환

double log(double a) 자연로그  a ( ln a )
double log10(double a) 상용로그  a ( log a )
double sin(double a)
double cos(double a)
ouble tan(double a)
( a 는 라디안(radian)값이어야 한다.)
sin a
cos a
tan a
double asin(double a)
double acos(double a)
double atan(double a)
arc sin a
arc cos a
arc tan a
double toRadians(double angdeg) digree(도)를 radian(라디안)으로 변환
double toDegrees(double angrad) radian(라디안)을 degree(도)로 변환

 

 

  ■ 올림, 버림, 반올림


 90.7552을 소수점 3번째 자리에서 반올림한 후 소수점 2번째 자리까지의 값을 얻고 싶은 경우 

1.  90.7552 에  10^2 (==100)을 곱한다.
90.7552 x 1000 = 9075.52 

2.  round( ) 함수를 써서 반올림해준다.
round(9075.52) = 9076

3. 다시 곱해준 수( 10^2 )로 나눠준다. 
( double 형인  100.0 으로 나눠야 소수점이 나온다.  int 형인  100 으로 나누면 정수끼리 연산이 되어 소수점이 버려지니 주의!)

9076 / 100 = 90
9076 / 100.0 = 90.76

   round( ) 는 소수점 첫 번째 자리에서 반올림한 결과를 정수형( long )으로 반환하기 때문에 소수점  n + 1 번째 자리에서 반올림한  n 번째 자리까지의 결과를 얻기 위해서는  10^n 으로 곱해서  round( ) 메서드를 사용한 다음에, 다시 곱한 수로 나눠주면 된다.(나눠줄 때 정수형으로 나눠버리면 정수형 끼리 연산이 되어서 소수점이 버려지니 주의한다.)

 

 

 

  ■ rint( )와 round( )

  •  공통점  : 소수점 첫 째자리에서 반올림
  •  차이점  
    1.  rint( ) 는  round( ) 와 달리 반환 값이 double ( round( ) 는  int )
    2.  rint( ) 는  round( ) 와 달리 가장 가까운 짝수 값이 된다.(음수일 경우 결과가 다름)
package Example;

import static java.lang.Math.*;

public class Example {
	public static void main(String[] args) {
		
		System.out.println("--- 양수일 경우 ---");
		System.out.printf("round(%3.1f) = %d\n", 1.5, round(1.5) );
		System.out.printf("rint(%3.1f) = %.1f", 1.5, rint(1.5));
		
		System.out.println();
		
		System.out.println("\n--- 음수일 경우 ---");
		System.out.printf("round(%3.1f) = %d\n", -1.5, round(-1.5) );
		System.out.printf("rint(%3.1f) = %.1f", -1.5, rint(-1.5));
	}
}

 

실행결과

 

위의 설명을 확인하는 예제이다. 양수이면 둘 다  2 로 결과값이 같지만(타입은 다름)음수일 경우에는 다르다.  round( ) 는 더 큰 값으로 반올림하니까  -1 이 되지만,  rint( ) 는  -1.5 와 같이 홀수( -1.0 )와 짝수( -2.0 )의 정중앙에 있는 경우 짝수( -0.2 )을 반환한다. 그리고 음수에서는 양수와 달리  -1.5 를 버림(floor)하면  -2.0 이 된다.

 

 

 

 

예외를 발생시키는 메서드

메서드 설  명
int addExact(int x, int y) x + y
int subtractExact(int x, int y) x - y
int multiplyExact(int x, int y) x * y
int incrementExact(int a) a++
int decrementExact(int a) a--
int negateExact(int a)
int negateExact(long a)
-a
int toIntExact(long value) (int)value - int 로의 형변환

정수형 간의 연산에서 발생할 수 있는 오버플로우(overflow)를 감지하기 위해 JDK1.8부터 메서드 이름에  Exact 가 포함된 메서드들이 추가되었다. 이 메서드들은 오버플로우가 발생하면, 예외( ArithmeticException )을 발생시킨다.

 

 

package Example;

import static java.lang.Math.*;

public class Example {
	public static void main(String[] args) {
		
		int i = Integer.MIN_VALUE; //int형의 최소값
		
		System.out.println("i = " + i);
		System.out.println("-i = " + -i);
		
		try {
			System.out.printf("negateExact(%d) = %d%n", 10, negateExact(10));
			System.out.printf("negateExact(%d) = %d%n", -10, negateExact(-10));
			System.out.printf("negateExact(%d) = %d%n", i, negateExact(i));	//예외가 발생한다.
		}catch(ArithmeticException e) {
			// i를 long타입으로 형변환 해서 negateExact(long a)를 호출한다.
			System.out.printf("negateExact(%d) = %d%n", (long)i, negateExact((long)i));
		}
	}
}

 

실행결과

 

 

 negateExact(int a) 는 매개변수의 부호를 바꿀 때  ~a + 1 의 식을 사용하는데,  ~a 한 결과(0과 1을 반대로 바꾼 값)  int 의 최대값이면  +1 했을 때 오버플로우가 발생한다. 위의 코드에서도  i 가  int 형의 최소값이여서 부호를 변환한 뒤  +1 을 한 값이 자기 자신이 되어버린다. 그래서 프로그램을 실행했을 때 오버플로우로 인한 예외가 발생해야 하지만  try - catch 문으로  i 를  long 으로 형변환하도록 예외처리를 해서 프로그램이 정상적으로 실행된다.

 

 

 

 

StricMath클래스

   Math 클래스는 최대한의 성능을 얻기 위해 JVM이 설치된 OS의 메서드를 호출해서 사용한다. (OS에 의존적인 계산을 한다.) 이렇게 되면 처리방법이 OS마다 다를 수 있기 때문에 자바로 작성된 프로그램임에도 컴퓨터마다 결과가 다를 수 있다. 이러한 차이를 없애기 위해 성능은 다소 포기하는 대신, 어떤 OS에서 실행되어도 항상 같은 결과를 얻도록  Math 클래스를 새로 작성한 것이  StricMath 클래스이다.

 

 

 

+ Recent posts