2018-3-24 TIL JAVA Basic Class(2)
BigInteger
package yoon;
import java.math.BigInteger;
public class SoBigInteger {
public static void main(String [] args) {
// long형으로 표현 가능한 값의 크기 출력
System.out.println("최대 정수 : " + Long.MAX_VALUE);
System.out.println("최소 정수 : " + Long.MIN_VALUE);
System.out.println();
// 매우 큰 수를 BigInteger인스턴스로 표현
BigInteger big1 = new BigInteger("100000000000");
BigInteger big2 = new BigInteger("999999999999");
//BigInteger기반 덧셈
BigInteger r1 = big1.add(big2);
System.out.println("덧셈 결과 : " + r1);
//BigInteger곱셈
BigInteger r2 = big1.multiply(big1);
System.out.println("곱셈 결과 : " + r2);
System.out.println();
// 인스턴스에 저장된 값을 int형 정수로 변환
int num = r1.intValueExact();
System.out.println("From BigInteger : " + num);
}
}
//result
최대 정수 : 9223372036854775807
최소 정수 : -9223372036854775808
덧셈 결과 : 1099999999999
곱셈 결과 : 10000000000000000000000
-
BigInteger를 통해 큰수를 표현한다
- 덧셈 : public BigInteger add(BigInteger val)
- 뺄샘 : public BigInteger subtract(BigInteger val)
- 곱셈 : public BigInteger multiply(BigInteger val)
- 나눗셈의 몫 : public BigInteger divide(BigInteger val)
- 나눗셈의 나머지 : public BigInteger remainder(BigInteger val)
BigDecimal
package yoon;
public class DoubleError {
public static void main(String [] args) {
double d1 = 1.5;
double d2 = 0.1;
System.out.println("덧셈 결과 : " + (d1 + d2));
System.out.println("곱셈 결과 : " + (d1 * d2));
}
}
//result
덧셈 결과 : 1.6
곱셈 결과 : 0.15000000000000002
Process finished with exit code 0
- 실수 표현에는 오차가 존재한다. BigDecimal을 통해서 오차를 제거한다.
package yoon;
public class WowBigDecimal {
public static void main(String [] args) {
WowBigDecimal d1 = new WowBigDecimal("1.6");
WowBigDecimal d2 = new WowBigDecimal("0.1");
System.out.println("덧셈 결과 : " + d1.add(d2));
}
}
//result
덧셈 결과 : 1.7
곱셈 결과 : 0.16
Math클래스와 난수의 생성
- Math클래스에 정의된 모든 메소드는 다 static으로 되어있다. 그러므로 Math클래스는 인스턴스의 생성이 목적으로 정의된 클래스가 아니다.
기본적인 수학연산
package yoon;
public class SimpleMathUse {
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("sin 45 : " + Math.sin(radian45));
System.out.println("cos 45 : " + Math.cos(radian45));
System.out.println("tan 45 : " + Math.tan(radian45));
System.out.println();
System.out.println("log 24 : " + Math.log(25));
System.out.println("2의 16승 : " + Math.pow(2,16));
}
}
//reuslt
원주율 : 3.141592653589793
2의 제곱근 : 1.4142135623730951
파이에 대한 Degree : 180.0
2 파이에 대한 Degree : 360.0
sin 45 : 0.7071067811865475
cos 45 : 0.7071067811865476
tan 45 : 0.9999999999999999
log 24 : 3.2188758248682006
2의 16승 : 65536.0
RandomNumber의 생성
-
java.util.Random클래스를 통해 난수를 제공하고있다.
- public boolean nextBoolean() : boolean형 난수 발생
- public int nextInt() : int형 난수
- public long nextLoing() : long형 난수
- public int nextInt(int bount) : 0 이상 bound 미만 범위의 int형 반환
- public float nextFloat() : 0.0이상 1.0미만의 float형 난수 반환
- public double nextDouble() : 0.0이상 1.0미만의 double형 난수 반환
package yoon;
import java.util.Random;
public class RandomNumberGenerator {
public static void main(String [] args) {
Random rnd = new Random();
for(int i = 0; i < 7; i++)
System.out.println(rnd.nextInt(1000)); //0이상 1000미만의 난수생성
}
}
//result
486
68
437
652
364
956
855
seed기반의 난수 생성
- 컴퓨터는 알고리즘을 기반으로 동작하기때문에 난수를 생성할때도 패턴이 존재를 한다. 그래서 컴퓨터가 생성하는 난수를 ‘Pseudo-random number(가짜난수)’라고한다. ``` package yoon;
import java.util.Random;
public class PseudoRandom { public static void main(String [] args) { Random rnd = new Random(12);
for(int i = 0; i < 7; i++)
System.out.println(rnd.nextInt(1000));
} } //result 866 812 556 133 624 211 750 ``` - Random rnd = new Random(12)에서 12는 난수의 생성과정에서 씨앗으로 사용이된다. 이를 씨드값이라고 한다. 난수생성알고리즘이 씨드값을 기반으로 돌아가기때문에 이 값이 같다면 생성되는 난수의 패턴은 100%일치를 한다.
package yoon;
import java.util.Random;
public class SeedSetRandom {
public static void main(String [] args) {
Random rnd = new Random(System.currentTimeMillis());
for(int i = 0; i < 7; i++)
System.out.println(rnd.nextInt(1000));
}
}
//result
498
936
322
265
340
186
420
-
Random rnd = new Random(System.currentTimeMillis()); 여기의 메소드 호출문은, 컴퓨터의 현재 시간을 기준으로 1970년 1월 1일 자정이후로 지나온 시간을 계산하여 반환을 한다. 따라서 예제를 실행할때마다 seed값이 달라지므로 실행을 할때마다 random값이 달라진다.
-
Random rand = new Random()의 경우 seed값을 전달하지 않는다. 하지만 내부적으로는 밑의 코드와 같다.
public Random() {
this(System.currentTimeMillis()); // Random(long seed)생성자 호출
}
문자열 토큰의 구분
- “PM:08:45” => “PM,08,45”
- 오른쪽의 3가지 정보는 :(콜론)을 기준으로 나누어져 있다. 콜론을 ‘구분자(Delimiter)’라고 한다. 구분자를 기준으로 나뉜 문자열 조각은 ‘토큰(Token)’이라고한다.
- public StringTokenizer(String str, String delim)을 통해서 문자열을 쉽게 나눌 수 있다.
package yoon;
import java.util.StringTokenizer;
public class TokenizeString {
public static void main(String [] args) {
StringTokenizer st1 = new StringTokenizer("PM:08:45", ":");
while (st1.hasMoreTokens())
System.out.print(st1.nextToken() + " ");
System.out.println();
StringTokenizer st2 = new StringTokenizer("12 + 36 - 8 / 2 = 44", "+-/= ");
while (st2.hasMoreTokens())
System.out.print(st2.nextToken() + " ");
System.out.println();
}
}
//result
PM 08 45
12 36 8 2 44
- 토큰을 반환하는 메소드는 nextToken()이다. 하지만 토큰이 없으면 예외가 발생하므로 hasMoreTokens메소드 호출을 통해서 토큰이 있는지 확인을 먼저 해야한다.
Written on March 24, 2018