* 해당 글은 백엔드 자바 강의이후 회고 글입니다.
https://bootcamp.likelion.net/school/kdt-backendj-21th
백엔드 부트캠프 21기: Java : 멋사 부트캠프
실전 스킬 기반 백엔드 개발자 취업 완벽 대비 교육
bootcamp.likelion.net
자바 난수(Random) 생성 방법
1. Math.random();
double r = Math.random();
- 0.0 <= r < 1.0
- 가장 단순한 난수 생성 방식이다.
- 내부적으로 Random 클래스를 사용한다.
- 모든 메서드가 전부 다 static 메서드이다.
- 정수 범위 사용시 아래와 같이 직접적인 계산이 필요하다.
int n = (int)(Math.random() * 6) + 1; // 1~6
2. java.util.Random
Random r = new Random();
int n = r.nextInt(6) + 1; // 1~6
double d = r.nextDouble();
- 시드(seed) 숫자 사용이 가능하다.
- new 키워드를 통해 Random 객체를 생성해줄 필요가 있다.
- 멀티 스레드 환경에서는 성능 저하가 일어날 수 있다.
3. java.util.concurrent.ThreadLocalRandom
ThreadLocalRandom r = ThreadLocalRandom.current();
int n = r.nextInt(1, 7);
int dice = ThreadLocalRandom.current().nextInt(1, 7);
- min ~ max-1 과 같이 범위 지정이 가능하다.
- 멀티 스레드 환경에 최적화 되어있다.
- 객체 생성이 필요하지 않다.
- 현재 실무에서 가장 많이 사용한다.
4. (jdk 17~) java.util.random.RandomGenerator
RandomGenerator r = RandomGenerator.getDefault();
int n = r.nextInt(1, 7);
- java 17 이상에서부터 지원한다.
- 다양한 RNG 알고리즘을 선택할 수 있다.
- 가장 최신의 표준 인터페이스이다.
System.arraycopy()
System.arraycopy() 는 자바의 표준 라이브러리에 포함된 네이티브 메서드로 한 배열에서 다른 배열로 요소를 빠르게 복사하는 기능을 제공한다.
이 메서드는 jdk 1.0 부터 제공되어 왔으며 자바의 가장 기본적이면서도 강력한 배열 조작 도구 중 하나이다.
주요 특징
- 네이티브 메서드 : C/C++ 로 구현되어 JVM 의 최적화된 성능을 제공한다.
- 빠른 속도 : 자바의 다른 배열 복사 방법보다 일반적으로 더 빠르다.
- 메모리 효율성 : 새 배열을 생성하지 않고 기존 배열로 직접 복사 가능하다.
- 부분 복사 : 배열의 특정 부분만 선택적으로 복사 가능하다.
- 다양한 타입 지원 : 기본 데이터 타입과 객체 배열 모두 지원한다.
내부 동작 원리
System.arraycopy 는 Java Native Interface(JNI) 를 통해 구현된 네이티브 메서드이다.
내부적으로는 C/C++ 로 작성되어있어 JVM 이 직접 최적화된 메모리 복사 작업을 수행한다.
- 메모리 블록 복사
- 배열은 연속된 메모리 공간에 저장되므로 시스템 수준에서 효율적인 메모리 블록 복사 연산이 수행된다.
- 타입 검사
- JVM 은 복사 과정에서 배열 타입의 호환성을 검사한다. 호환되지 않는 타입의 배열 간 복사를 시도하면 ArrayStoreException 이 발생한다.
- 경계 검사
- 원본 및 대상 배열의 인덱스와 길이가 유효한지 검사한다. 배열 범위를 벗어나면 IndexOutOfBoundsException 이 발생한다.
매개 변수
System.arraycopy(src, srcPos, dest, destPos, length);
- src : 원본 배열(복사할 데이터가 있는 배열)
- srcPos : 원본 배열에서 복사를 시작할 인덱스
- dest : 대상 배열(데이터가 복사될 배열)
- destPos : 대상 배열에서 데이터를 저장할 시작 인덱스
- length : 복사할 요소의 개수
public class ArrayCopyTest1 {
public static void main(String[] args) {
int[] src = { 10, 20, 30, 40, 50 };
int[] dest = new int[5];
System.arraycopy(src, 0, dest, 0, src.length);
for (int i = 0; i < dest.length; i++) {
System.out.print(dest[i] + " "); // 10 20 30 40 50
}
}
}
* 만약 객체 배열을 복사할 때는 참조만 복사되는 얕은 복사(Shallow copy) 가 발생한다.
즉, 원본 배열과 대상 배열의 각 요소는 동일한 객체를 참조한다.
각종 배열 복사 방법들과 성능
방법
- System.arraycopy() : 네이티브 메서드로 가장 빠른 성능을 가지고있다.
- Arrays.copyOf() : 내부적으로 System.arraycopy 를 호출한다. 새 배열을 생성한다.
- Arrays.copyOfRange() : 부분 배열복사, 내부적으로 System.arraycopy 사용
- clone() : 배열의 복제본 생성 및 새 배열 반환
- 반복문을 통한 수동 복사 : 요소별로 직접 복사
성능
실행환경에 따라 결과가 다를 수 있으나 일반적으로 다음과 같은 성능 순서를 보인다.
- System.arraycopy() : 네이티브로 구현되어 있으므로 가장 빠르다.
- clone() : System.arraycopy 보다 약간 느리다.
- Arrays.copyOf() : System.arraycopy 를 내부적으로 사용하지만 새 배열 생성 시 오버헤드가 존재한다.
- Arrays.copyOfRange() : copyOf 와 유사하지만 범위 계산 오버헤드가 추가된다.
- 수동 반복문 : 가장 느리다.(JVM 최적화 부족)
배열의 크기가 클수록 System.arraycopy 의 성능 이점이 두드러진다.
참고 : https://eunplay.tistory.com/118
[Java] Java System.arraycopy 사용 방법 및 성능 비교
Java System.arraycopy 사용 방법 및 성능 비교개요안녕하세요. 이번 포스팅은 Java에서 배열을 효율적으로 복사하는 핵심 메서드인 System.arraycopy에 대해 상세히 알아보겠습니다. 대용량 데이터를 다루
eunplay.tistory.com
'부트캠프 > 후기 챌린지' 카테고리의 다른 글
| [멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.19) (0) | 2026.02.09 |
|---|---|
| [멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.16) (0) | 2026.02.08 |
| [멋쟁이사자처럼부트캠] 백엔드 자바 21기 (2026.01.14) (0) | 2026.01.22 |
| [멋쟁이사자처럼부트캠] 백엔드 자바 21기 (2026.01.13) (1) | 2026.01.22 |
| [멋쟁이사자처럼부트캠] 백엔드 자바 21기 (2026.01.09) (0) | 2026.01.09 |