-
[Camel][Java] Math 클래스 & Random 클래스Java/개념 정리 2020. 2. 28. 17:34
Math 클래스란?
Math 클래스는 수학관련 기능을 제공하는 클래스입니다. Math클래스는 Java 표준라이브러리의 java.lang 패키지에 정의되어 있습니다. 이 클래스는 모든 멤버가 static으로 선언되어 있습니다. 즉, 이것은 인스턴스의 생성의 목적이 아닌 수학관련 기능 제공을 목적으로 정의된 클래스라는 것입니다. Math 클래스에는 매우 다양한 메소드가 존재하지만, 이 메소드들의 이름과 사용방법이 매우 직관적이기 때문에 필요한 메소드를 찾거나 사용하기가 쉽습니다. Math 클래스의 메소드는 다음 링크에서 확인 할 수 있습니다. https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/Math.html
자주 사용하는 주요 메소드 몇가지를 표를 보여드리겠습니다.
Modifier and Type Method ( 함수 ) Description ( 설명 ) static int abs ( int a ) a 의 절대값을 반환합니다. static int max( int a, int b ) a 와 b 중 큰 값을 반환합니다. static int min( int a, int b ) a 와 b 중 작은 값을 반환합니다. static double random( ) 0.0 과 0.1 사이의 난수를 반환합니다. static double sqrt( double a ) a 의 제곱근을 반환합니다. static double toRadians( double a ) Degree 단위인 a를 Radian 단위로 바꿔 반환합니다. static double toDegrees( double a ) Radian 단위인 a를 Degree 단위로 바꿔 반환합니다. static double pow( double a, double b) a를 b번 곱한 값을 반환합니다. a의 b승을 반환. Random Number 생성
Randum Number란 예측 불가능한 수를 말합니다. Java에서는 이러한 난수 생성을 위한 클래스를 별도로 제공합니다. 난수 생성을 위해서는 java.util 패키지에 속해있는 Random 클래스의 인스턴스를 생성합니다. 그리고 우리는 아래의 Ramdom 클래스의 메소드를 사용해 상황에 맞게 반환형을 선택할 수 있습니다.
Type and Method Description ( 설명 ) boolean nextBoolean( ) boolean형 난수를 반환합니다. int nextInt( ) int형 난수를 반환합니다. long nextLong( ) long형 난수를 반환합니다. float nextFloat( ) 0.0이상 0.1미만의 float형 난수를 반환합니다. double nextDouble( ) 0.0이상 0.1미만의 double형 난수를 반환합니다. int nextInt( int a ) 0.0이상 a미만의 int형 난수를 반환합니다. 이러한 난수 생성은 컴퓨터에게도 생각보다 복잡한 일입니다. 컴퓨터는 예측 불가능한 수인 난수를 완벽하게 생성하지 못합니다. 아래의 코드를 통해 추가설명하도록 하겠습니다.
Random rand = new Random(12); for (int i =0; i<100; i++) { System.out.println(rand.nextInt(1000)); }
Random 클래스의 인스턴스 생성과정에서 인자에 정수를 전달하는 것을 확인할 수 있습니다. 이 정수를 우리는 난수 생성과정의 씨앗(Seed)라고 합니다. 컴퓨터는 난수를 생성함에 있어서 이 씨앗을 기반으로 합니다. 즉, 같은 씨앗으로 난수를 생성하면 동일한 난수가 생성된다는 것입니다. 그렇기 때문에 위의 코드는 동일한 난수를 생성하게됩니다. 이러한 문제를 해결하기 위해서 우리는 아래의 코드와 같이 setSeed 메소드를 사용합니다.
Random rand = new Random(12); rand.setSeed(System.currentTimeMillis()); for (int i =0; i<100; i++) { System.out.println(rand.nextInt(1000)); }
setSeed 메소드는 컴퓨터의 현재시간을 기준으로 1970년 1월 1일 이후 지나온 시간을 밀리초 단위로 계산해서 반환하는 메소드입니다. 이 메소드를 추가함으로써 매 실행마다 Seed의 값이 변하게되면서 전혜 예측불가능한 난수의 생성이 가능해지는 것입니다. 그렇다면 Random 클래스의 인스턴스 생성시 씨앗(인자)을 전달하지 않으면 어떻게 되는 걸까? 이 질문에 대한 해답은 Random 클래스의 인자가 없는 생성자를 확인해 보면 알 수 있습니다.
public Random () { this(System.currentTimeMillis()); }
위의 코드를 확인해보면, 전달 인자가 없는 생성자를 사용한 경우 생성자가 호출될 때마다 이전의 호출과 다른 씨앗값이 설정됨을 알 수 있습니다. 즉, 앞서 설명한 setSeed 메소드를 직접 사용하지 않더라도 생성자의 호출만으로 매번 다른 Seed값을 설정할 수 있는 것입니다. 여태까지 난수 생성과정에 대해 설명했습니다. 난수가 어떻게 생성되는지 알았다면 우리는 결과적으로 아래와 같이 코드를 작성하면 되겠습니다.
Random rand = new Random(); // 생성자에서 this(System.currentTimeMillis()); 를 통해 매번 다른 Seed 전달 for (int i =0; i<100; i++) { System.out.println(rand.nextInt(1000)); }
'Java > 개념 정리' 카테고리의 다른 글
[Camel][Java] Collection Framework (컬렉션 프레임워크) (0) 2020.03.01 [Camel][Java] Generics Class (제네릭 클래스) (0) 2020.02.29 [Camel][Java] BigInteger & BigDecimal 클래스 (0) 2020.02.28 [Camel][Java] Wrapper 클래스에 대해서 (0) 2020.02.28 [Camel][Java] JVM(가상머신)의 메모리 모델 (0) 2020.02.27