코딩테스트 문제를 풀다가 부분 배열 반환에 대해 공부 중 정리하게 되었습니다.
1️⃣ Arrays.copyOf()
Arrays.copyOf(복사할 배열, 길이)
1
2
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
- 기능 : 배열을 지정한 길이만큼 복사
- 특징
- 원본보다 길이가 크면 남는 자리는 0으로 채워짐
- copy.length를 지정함
- 시간 복잡도 : O(n) (복사할 길이 n)
- 내부 구현 : System.arraycopy() 사용
2️⃣ Arrays.copyOfRange()
Arrays.copyOfRange(복사할 배열, from, to)
1
2
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOfRange(original, 1, 4); // [2, 3, 4]
- 기능 : from 인덱스부터 to-1 인덱스까지 복사
- 특징
- 원본보다 to 인덱스가 크면 남는 자리는 배열의 타입 기본값으로 채워짐
- 시간 복잡도 : O(to - from)
- 내부 구현 : System.arraycopy() 사용
3️⃣ System.arraycopy()
System.arraycopy(복사할 배열, 복사 시작 idx, 대상 배열, 대상 시작 idx, 복사할 길이)
1
2
3
int[] original = {1, 2, 3, 4, 5};
int[] dest = new int[3];
System.arraycopy(original, 1, dest, 0, 3); // [2, 3, 4]
- 기능 : 배열의 원하는 범위를 다른 배열에 직접 복사
- 특징
- 가장 빠름 (대용량 복사 시 유리)
- 대상 배열을 직접 만들어야 함
- 시간 복잡도 : O(n)
- 내부 구현 : JVM 내부 native 코드 사용
4️⃣ 전체 비교 정리
메서드 | 목적 | 복사 범위 | 대상 배열 자동 생성 | 남는 공간 처리 | 속도 |
---|---|---|---|---|---|
Arrays.copyOf() | 길이 기반 복사 | 0 ~ newLength | O | 0으로 채움 | 보통 |
Arrays.copyOfRange() | 범위 기반 복사 | [from, to) | O | 0으로 채움 | 보통 |
System.arraycopy() | 수동 복사 | 지정된 srcPos~srcPos+length | ✕ (new로 직접 생성) | N/A | 가장 빠름 |