자바/자바 입문 공부일지

자바 기초 공부 일지 32. BigInteger 클래스, BigDecimal 클래스, Math 클래스

Tomitom 2022. 11. 1. 12:35
반응형

 

 

● BigInteger () 클래스 

 

바이트형 정수는 비트가 8개입니다. 그 중 맨 왼쪽은 부호 비트이므로 나머지 7개가 숫자를 결정합니다. 

그러므로 바이트로 표현할 수 있는 숫자는 127입니다. (최댓값)

 

https://blue-dot.tistory.com/39?category=975496 

 

자바 기초 공부 일지 3. 자바 변수 선언하기, 정수의 표현 방법(2진법 표현식)

● 자바는 변수를 선언할 때 변수의 이름과 용도를 같이 선언해야 합니다. ex) int num1; 최초로 변수를 만들 때 어떤 역할을 할지 적어주어야 합니다. (변수의 선언) int num1; // 변수 num1의 선언 num1 =

blue-dot.tistory.com

 

package day17;

import java.math.BigInteger;

public class BigBig {

	public static void main(String[] args) {
		System.out.println(Long.MAX_VALUE); //long의 최댓값 확인 
		System.out.println(Long.MIN_VALUE);// 스태틱 멤버는 휘어져 있음
		long num = 9223372036854775807L; // long 형 리터럴 상수 
		System.out.println(num);
				
		
	}

}

 

 

 

 

값이 1이라도 더 늘어나면 저렇게 오류가 뜹니다. 

이 경우 Big 인티저를 사용합니다. 

 

BigInteger big1 = new BigInteger("100000000000000000000");

 BigInteger big2 = new BigInteger("-99999999999999999999");

 

숫자를 문자열로 쓰면 그것을 숫자열로 변환해서 값을 가집니다. 

아까 상기에 오류를 발생한 것을 토대로 BigInteger를 씌워보겠습니다. 

 

		System.out.println(Long.MAX_VALUE); //long의 최댓값 확인 
		System.out.println(Long.MIN_VALUE);
		
		BigInteger num =new BigInteger ("922337203685477580123");
		System.out.println(num);

long 형을 넘는 큰 숫자도 출력이 가능하며, 사칙연산 또한 가능합니다. 

 

// BigInteger 기반 덧셈 연산
   BigInteger r1 = big1.add(big2);
   System.out.println("덧셈 결과: " + r1);

   // BigInteger 기반 곱셈 연산
   BigInteger r2 = big1.multiply(big2);
   System.out.println("곱셈 결과: " + r2);
   System.out.println();

   // 인스턴스에 저장된 값을 int형 정수로 반환
   int num = r1.intValueExact();
   System.out.println("From BigInteger: " + num);
}

상기에 기재했던 예시를 바탕으로 사칙연산가지 진행해볼게요. 

 

 

package day17;

import java.math.BigInteger;

public class BigBig {

	public static void main(String[] args) {
		System.out.println(Long.MAX_VALUE); //long의 최댓값 확인 
		System.out.println(Long.MIN_VALUE);// 스태틱 멤버는 휘어져 있음
		
		BigInteger num1 =new BigInteger ("922337203685477580123");
		BigInteger num2 =new BigInteger ("922337203685477580123");
		BigInteger result1 = num1.add(num2);// add는 빅 인티저를 반환합니다. 
		BigInteger result2 = num2.multiply(num2);
		System.out.println(result1);
		System.out.println(result2);
				
	}

}

 

사칙연산이 계산되는 것을 확인합니다. 

 큰 숫자를 정수형으로 변환을 하는 기능은 intValueExact() 입니다. 

만약 사칙연산으로 계산된 결과 값 (빅이테저 값) 을 인트형 변수로 반환을 한다면?

		int result3 = result2.intValueExact(); 
		System.out.println(result3);

큰 숫자이므로 범위를 초과하여 오류가 발생합니다. 

 

 

● BigDecimal () 클래스 

 

8 바이트는 64비트에서 앞의 1비트는 부호비트이므로 63비트로 숫자를 표현합니다. 

그런데 실수의 경우에는 정수처럼 값이 정확하지 않으므로 소숫점이하의 숫자가 무수하게 많이 있습니다. 

그러므로 정확하게 오차없이 실수를 표현하는 것을 불가능합니다. 

오차 없는 실수(처럼 보이는 수)를 표현하기 위한 클래스가 BigDecimal  클래스입니다. 

 

아래 예시를 보겠습니다. 

 

 

package day17;

import java.math.BigDecimal;

public class BigBig {
		public static void main(String[] args) {
			   BigDecimal d1 = new BigDecimal("1.6");
			   BigDecimal d2 = new BigDecimal("0.1");
			   System.out.println("덧셈 결과: " + d1.add(d2));
			   System.out.println("곱셈 결과: " + d1.multiply(d2));
			}

	}

 

● Math() 클래스 

수학의 기능을 담당하는 클래스 입니다. 

이것은 import 를 하지 않아도 사용할 수 있는 클래스입니다. 

즉 java.lang.* <- 의 표준 클래스는 컴파일에 의해 자동으로 추가되어 있는 클래스로 System.out 등의 클래스처럼 math() 또한 자동으로 사용할 수 있는 클래스 입니다. 

 

public static void main(String[] args) {
   System.out.println("원주율: " + Math.PI);
   System.out.println("2의 제곱근: " + Math.sqrt(2));
   System.out.println();
   System.out.println("파이에 대한 Degree: " + Math.toDegrees(Math.PI));
   System.out.println("2 파이에 대한 Degree: " + Math.toDegrees(2.0 * Math.PI));
   System.out.println();
   
   double radian45 = Math.toRadians(45); // 라디안으로의 변환!
   System.out.println("싸인 45: " + Math.sin(radian45));
   System.out.println("코싸인 45: " + Math.cos(radian45));
   System.out.println("탄젠트 45: " + Math.tan(radian45));
   System.out.println();
   System.out.println("로그 25: " + Math.log(25));
   System.out.println("2의 16승: "+ Math.pow(2, 16));
}

상기 예제를 보면 클래스 기반의 메소드인데 new 가 없습니다. 

즉, Math 클래스에 있는 멤버들은 모두 static 멤버입니다. 

기능 제공을 위해 제공이 된 클래스이고, 대부분의 멤버들은 static으로 되어 있습니다. 

 

 

 

반응형