Java
[Java] Random 4 종류
by dbs_
2025. 7. 5.
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();