JAVA에서 배열은 고정된 크기의 데이터이다. 따라서 배열의 크기를 변경하거나 배열에 값을 추가하기 위해서는 새로운 배열을 할당하거나 List로 변환해주어야 한다.
* 아직 List는 배우지 않아 배열을 배운 선에서 쓸 수 있는 메서드를 써볼까 한다.
for문을 사용하지 않고 원래 있는 배열과 입력 받은 배열 값을 추가로 리턴하는 문제를 마주했다.
for문을 쓰지마라니... 새로운 메서드를 찾아보았다.
System.arraycopy
자바에서 배열을 복사하는 메서드이다. 이 메서드를 활용하면 쉽게 배열의 내용을 다른 배열로 복사할 수 있다.
- 메서드의 매개변수(parameter)로는 (Object src, int srcPos, Object dest, int destPos, int length) 다섯가지 요소가 들어간다.
1. Object src : 원본 배열
2. int srcPos : 복사 시작 위치
3. Object dest : 복사 해 올 새로운 배열
4. int destPos : 복사 해 올 새로운 배열
5. int length : 복사해 올 배열의 길이
예시를 통해 더욱 쉽게 알아보자!
✨ [1, 2, 3, 4, 5, 6] 이 들어있는 배열값을 포함하고 맨 뒤에 7이라는 값을 추가한 result 배열을 만들어보자.
import java.util.Arrays;
public class ArrayCopyEx {
public static void main(String[] args) {
// 원본 배열 arr
int[] arr = {1,2,3,4,5,6};
// 복사 해 올 새로운 배열 result 의 크기를 arr.length보다 1 크게 설정
int[] result = new int[arr.length+1];
// 원본 배열, 시작 위치, 새로운 배열, 새로운 배열의 시작 위치, 복사해올 배열의 길이
System.arraycopy(arr,0, result,0, arr.length);
// 새로 만들어 준 result 배열의 마지막 위치에 7 값 넣기
result[arr.length] = 7;
System.out.println(Arrays.toString(result));
}
}
// 결과값
// [1, 2, 3, 4, 5, 6, 7]
- int result[] = new int[arr.length+1];
하나의 값을 추가로 더 입력 받을 것이기 때문에 가지고 올 arr.length보다 하나 더 큰 배열을 만들어준다. - System.arraycopy(arr,0, result,0, arr.length);
원본 배열 arr 복사
arr[0] 부터 복사
새로 만들어준 result 배열에 붙여넣기
result[0] 부터 붙여넣기
arr.length = 6 → 배열 6개 가지고 온다. - result[arr.length] = 7;
index값은 0부터 시작하기 때문에 arr.length(6)가 result배열의 마지막 자리가 된다.
마지막 자리에 7값을 넣어준다.
result[6] = 7;
=> result 값을 출력하게 되면 결과 값은 [1, 2, 3, 4, 5, 6, 7] 이 나오게 된다.
✅ 다른 숫자값을 입력하면 입력하는대로 다른 값이 들어온다.
보통 찾아보니 다 0이 예시로 들어가 있어서 몇 개 더 넣어봤다.
# result 배열 크기는 arr.length+1 && 원본배열의 시작 위치3, 새로운 배열의 시작 위치1, 복사해올 배열의 길이 3 일 때
🚨 만약 위치 점이나 복사해 올 배열의 길이를 배열이 가진 크기보다 크게 설정하면? 에러가 발생한다.
ex) arr, 3, result, 1, 4 → java.lang.ArrayIndexOutOfBoundsException
import java.util.Arrays;
public class ArrayCopyEx {
public static void main(String[] args) {
// 원본 배열 arr
int[] arr = {1,2,3,4,5,6};
// 복사 해 올 새로운 배열 result 의 크기를 arr.length보다 1 크게 설정
int[] result = new int[arr.length+1];
// 원본 배열, 시작 위치, 새로운 배열, 새로운 배열의 시작 위치, 복사해올 배열의 길이
System.arraycopy(arr,3, result,1, 3);
// 새로 만들어 준 result 배열의 제일 앞에 7 값 넣기
result[0] = 7;
System.out.println(Arrays.toString(result));
}
}
// 결과값
// [7, 4, 5, 6, 0, 0, 0]
결과 값은 [7, 4, 5, 6, 0, 0, 0] 으로 아무 값이 들어가지 않은 곳에는 int 형 빈 배열 0이 들어있다.
# result 배열 크기는 arr.length-2 && 원본배열의 시작 위치3, 새로운 배열의 시작 위치1, 복사해올 배열의 길이 3 && result[1]=7 일 때
result[1]=7이 있기 전 배열의 시작 위치를 1로 잡아줬기에 값이 먼저 들어있다. 이럴 때 다시 초기화 시켜준다면 값이 어떻게 될지 궁금해서 넣어 보았다.
import java.util.Arrays;
public class ArrayCopyofEx {
public static void main(String[] args) {
// 원본 배열 arr
int[] arr = {1,2,3,4,5,6};
// 복사 해 올 새로운 배열 result 의 크기를 arr.length보다 1 크게 설정
int[] result = new int[arr.length-2];
// 원본 배열, 시작 위치, 새로운 배열, 새로운 배열의 시작 위치, 복사해올 배열의 길이
System.arraycopy(arr,3, result,1, 3);
// 새로 만들어 준 result 배열의 마지막 위치에 7 값 넣기
result[1] = 7;
System.out.println(Arrays.toString(result));
}
}
// 결과값
// [0, 7, 5, 6]
결과값은 [0, 7, 5, 6] 으로 배열이 아닌 형태에서 값을 초기화 시켜주는 것과 같이 result[1] 자리에 4라는 값이 7로 바뀌게 되었다.
System.arraycopy 메서드는 복사 붙여넣기 메서드로서, 배열을 복사하고 다른 배열의 지정된 위치에 붙여넣는 기능을 수행한다. 이를 통해 불필요한 반복문 작성을 피하고 성능을 향상시킬 수 있다.
까먹지 않으려고 쓰는 메서드 사용법! : )
'LANGUAGE > JAVA' 카테고리의 다른 글
[JAVA] 자바 객체 지향 프로그래밍 / 상속화(inheritance) (0) | 2023.04.25 |
---|---|
[JAVA] 기본 변수 와 참조 변수 / 하루 종일 걸려 이해한 참조 변수 쉽게 이해하기 위해 정리 (0) | 2023.04.25 |
[JAVA] JAVA 객체지향 프로그래밍 / 메서드 오버로딩(Method Overloading)이란? (0) | 2023.04.23 |
[JAVA] 필드(Field)와 메서드(Method) / 변수의 구분 (0) | 2023.04.22 |
[JAVA] 클래스(Class) 와 객체(Object) / 객체와 인스턴스의 차이 (0) | 2023.04.21 |