Math 클래스
- 수학 관련 연산 기능을 제공하는 클래스이다.
- Math 클래스에 정의된 메소드는 모두 static으로 선언되어 있기 때문에, 인스턴스 생성 없이 사용할 수 있다.
- ex) Math.pow(10, 2) = 10 * 10
Math 클래스 메소드
메소드 종류 | 설명 |
Math.PI | 원주율 |
Math.sqrt() | 각도 |
Math.toRadians() | 라디안 |
Math.sin(), cos(), tan() | 매개변수가 라디안이어야 함 |
Math.log() | 자연로그 밑이 e |
Math.pow(밑,지수) | 밑^지수 |
class MathClass {
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));
}
}
// 실행 결과
원주율: 3.141592653589793
2의 제곱근: 1.4142135623730951
파이에 대한 Degree: 180.0
2 파이에 대한 Degree: 360.0
싸인 45: 0.7071067811865475
코싸인 45: 0.7071067811865476
탄젠트 45: 0.9999999999999999
로그 25: 3.2188758248682006
2의 16승: 65536.0
Random 클래스
- java.util.Random
- 난수를 생성하기 위한 클래스이다.
- Random 인스턴스를 생성하고, 목적에 따라 관련 메소드를 호출하면 난수가 반환된다.
Random 클래스 메소드
메소드 종류 | 설명 |
public int nextInt() | int형 난수 반환 |
public int nextInt(int bound) | 0이상 bound미만 범위의 int형 난수 반환 |
public long nextLong() | long형 난수 반환 |
public float nextFloat() | long형 난수 반환 |
public double nextDouble() | 0.0이상 1.0미만의 double형 난수 반환 |
public boolean nextBoolean() | boolean형 난수 반환 |
난수 생성 방법
- Random 클래스 사용
- Math.random() 사용 (이 방법도 내부적으로는 Random 클래스를 사용해 난수를 생성)
/* Random클래스 사용 */
Random rand = new Random()); // 객체 생성
int rand = random.nextInt(10); // 0 ~ 9 사이의 난수 반환
/* Math.random 사용 */
int rand = Math.random()*10; // 0 ~ 9 사이의 난수 반환
난수 생성 원리
❗️ 씨드 기반의 난수 생성
- 컴퓨터가 생성하는 난수를 가짜 난수(Pseudo-random number)라 한다.
- 컴퓨터는 알고리즘을 기반으로 난수를 생성하기 때문에 숨겨진 패턴이 존재할 수 밖에 없다.
- 난수 생성 알고리즘은 씨드 값을 기반으로 돌아간다.
- 씨드 값이 같다면 생성되는 난수의 패턴은 100% 일치한다.
- 씨드 값을 전달하지 않으면 계속해서 다른 패턴으로 난수가 만들어진다. (이유는 아래에서 설명)
public class PsuedoRandomNumber {
public static void main(String[] args) {
Random rand = new Random(12); // 생성자로 씨드 값 12 전달
for (int i=0; i<7; i++)
System.out.println(rand.nextInt(1000));
}
}
// 실행 결과 → 매 실행마다 동일한 결과가 출력됨
866
812
556
133
624
211
750
❓ 다른 패턴의 난수가 만들어지는 이유는?
- Random 인스턴스 생성 시 씨드 값을 전달하지 않으면, 내부적으로 현재 시간을 기준으로 씨드 값을 만들어 사용하기 때문에 실행마다 다른 패턴의 난수가 만들어진다.
- System.currentTimeMillis()
- 컴퓨터의 현재 시간을 기준으로 1970/01/01 자정 이후로 지나온 시간을 밀리 초(1/1000초) 단위로 계산하여 반환
- currentTimeMillis()가 반환하는 값이 씨드 값으로 사용되어, 실행 할 때 마다 Random 인스턴스에 심어지는 씨드값이 달라지므로 다른 패턴의 난수가 만들어진다.
// Random 생성자
public Random() {
this(System.currentTimeMillis());
}
class SeedSetRandomNumber {
public static void main(String[] args) {
Random rand = new Random(); // currentTimeMillis()가 씨드값으로 사용
for (int i=0; i<7; i++) {
System.out.println(rand.nextInt(1000));
}
}
}
// 실행 결과(1)
45
101
732
644
750
136
584
// 실행 결과(2) → 매 실행마다 다른 결과 출력
103
573
219
161
364
439
537
StringTokenizer 클래스
- 문자열에서 특정 구분자를 기준으로 토큰을 추출할 때 사용한다.
- 구분자(Delimiter)를 기준으로 나뉜 문자열의 조각을 토큰(Token)이라 한다.
- ex) 2022/01/12 → 구분자("/"), 토큰 3개(2022, 01, 12)
- 두 개 이상의 구분자 가능 (""으로 묶어줌)
- 공백 구분자 가능
/* StringTokenizer 클래스의 생성자 */
public StringTokenizer(String str, String delim)
/* StringTokenizer 인스턴스 생성 */
StringTokenizer st1 = new StringTokenizer("2022/01/12", "/")
StringTokenizer st2 = new StringTokenizer("30 - 15 = 15", "-= ")
StringTokenizer 클래스 메소드
메소드 종류 | 설명 |
public int countTokens() | 전체 토근의 수를 반환함 |
public int countTokens() | 토큰이 남아있는지 알려줌 |
public String nextToken() | 다음 토큰을 반환함 |
- 반환할 토큰이 없는 상태에서 nextToken()가 호출되면 예외가 발생한다.
- 따라서 hasMoreToken() 호출을 통해 토큰이 있는지 확인하고, 있는 경우에만 nextToken()을 호출하도록 코드를 작성하는 것이 좋다.
class StringTokenizerExam {
public static void main(String[] args) {
/* 구분자가 하나 */
StringTokenizer st1 = new StringTokenizer("2022/01/12", "/");
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();
}
}
// 실행 결과
2022 01 12
12 36 8 2 44
💡 구분자도 토큰으로 반환하고 싶다면 ?
- 구분자는 토큰으로 반환되지 않고 버려진다.
- 만약 구분자도 토큰으로 같이 반환하고 싶다면 StirngTokenizer 인스턴스 생성시 마지막 인자로 true를 넣어준다.
StringTokenizer st1 = new StringTokenizer("2022/21/12", "/"); // st1 = 20222112
StringTokenizer st2 = new StringTokenizer("2022/21/12", "/", true); // st2 = 2022/21/12
문자열을 구분자로 나누는 다양한 방법
// 1) StringTokenizer클래스 사용
StringTokenizer st = new StringTokenizer("100,200,300,400", ",");
// 2) split()메소드 사용
String[] arr = "100,200,300,400".split(",");
// 3) Scanner클래스 사용
Scanner sc = new Scanner("100,200,300,400").useDelimiter(",");
'☕ Java > 이론' 카테고리의 다른 글
[Java] Map 컬렉션 클래스 (0) | 2022.01.25 |
---|---|
[Java] 컬렉션 프레임워크 (0) | 2022.01.18 |
[Java] 제네릭3 (와일드 카드) (0) | 2022.01.17 |
[Java] 제네릭2 (상속, 제네릭 인터페이스) (0) | 2022.01.14 |
[Java] 제네릭1 (제네릭 클래스, 제네릭 메소드) (0) | 2022.01.13 |
[Java] Arrays 클래스 (0) | 2022.01.12 |
[Java] BigInteger, BigDecimal 클래스 (0) | 2022.01.11 |
[Java] Wrapper, Number 클래스 (0) | 2022.01.11 |