Random 종류
1. java.util.Random
- JDK 1.0부터 제공된 가장 기본적인 난수 생성기
- 특정한 규칙에 따라 가짜 난수 생성 - 완전한 진짜 랜덤은 아니고, 시드가 같으면 항상 같은 숫자 나옴
- 여러 스레드가 동시에 Random 객체를 사용할 경우, 내부에서 사용하는 값인 AtomicLong을 건드리면서 충돌 발생. 그로 인해 속도가 느려질 수 있고, 예상치 못한 문제가 생길 수 있다
Random rnd = new Random();
int r = rnd.nextInt(100); // 0~99
2. java.util.concurrent.ThreadLocalRandom
- JDK 7부터 도입 (thread-safe)
- 스레드마다 따로 작동하는 랜덤 인스턴스를 자동으로 사용 - 그러므로 여러 스레드가 동시에 사용해도 안전하다
- 내부적으로 공유 리소스를 쓰지 않아서 Random 보다 성능이 좋고, 병목이 없다
- 따로 new 해서 만들 필요 없이 static 방식으로 사용
int r = ThreadLocalRandom.current().nextInt(100);
3. java.util.SplittableRandom
- JDK 8부터 도입
- 이름 그대로, 랜덤 인스턴스를 쪼개서 병렬로 사용할 수 있는 구조
- 병렬 스트림(parallel stream), fork, join 같은 동시처리 작업에 최적화
- thread-safe 하지는 않는다 - 대신, split() 통해 각 스레드가 별도의 랜덤 인스턴스를 만들도록 하면 된다
SplittableRandom sr = new SplittableRandom();
int r = sr.nextInt(100);
4. java.security.SecureRandom
- JDK 1.1부터 도입
- 보안용 랜덤 클래스
- 이름 그대로, 보안(Secure)이 필요한 상황을 위해 만들어짐
- CSPRNG 라는 암호화적 알고리즘을 사용함
- 운영 체제에서 제공하는 엔트로피 소스를 활용하여 난수 생성
- 대신 생성 속도가 느리다
SecureRandom sr = new SecureRandom();
int r = sr.nextInt(100);
-
SecureRandom sr2 = SecureRandom.getInstanceStrong();
'Today I Learned > Java' 카테고리의 다른 글
[Java] Java Remote Debugging 자바 원격 디버깅 #2 (JDWP 디버깅 옵션) (2) | 2025.07.24 |
---|---|
[Java] Java Remote Debugging 자바 원격 디버깅 #1 (개념) (0) | 2025.07.17 |
[Java] META-INF 디렉토리와 MANIFEST.MF (0) | 2025.03.12 |
[Java] try-with-resources (자원 관리 최적화) (1) | 2025.03.11 |
[Java] normalize() 메서드 (1) | 2025.01.17 |