티스토리 뷰
먼저 일차원 배열을 복사해보자
boolean[] bool1 = new boolean[1];
boolean[] bool2 = bool1;
bool2[0] = true;
위와 같이 작성했을 때 boo1[0]은 false가 아닌 true를 return 한다. 왜냐하면, 배열 또한 객체이기 때문이다. 즉 bool2에 bool1의 값을 넘겨주는 게 아닌 주솟값을 넘겨준다. 그렇다면 어떻게 복사해야 같은 주솟값을 가지지 않을까? 세 가지 방법이 있다 (boolean 배열은 초기화하지 않아도 false를 담고 있다).
1. 새로운 배열을 만들어 해당 배열에 값을 넣어준다.
boolean[] bool1 = { true };
boolean[] bool2 = new boolean[1];
for(int i = 0; i < bool1.length; i++){
bool2[i] = bool1[i];
}
2. clone() 메소드를 사용한다.
boolean[] bool1 = { true };
boolean[] bool2 = bool1.clone();
3. System.arraycopy(원본 배열, 원본 배열의 시작 위치, 복사할 배열, 복사할 배열의 시작 위치, 복사할 개수) 메소드를 사용한다.
boolean[] bool1 = { true };
boolean[] bool2 = new boolean[1];
System.arraycopy(bool1, 0, bool2, 0, bool1.length);
세 가지 방법을 알아봤는데 2번은 가장 간단하고 3번은 원하는 만큼의 값을 복사해올 수 있고 native 메소드로 성능이 가장 좋다. 1번은 가장 성능이 안 좋아 보이지만 이번에 글을 쓰게 된 이유가 포함되어 있어 아래쪽의 글을 좀 더 읽어보자.
이제 이차원 배열을 복사해보자
boolean[][] bool1 = { { false } };
boolean[][] bool2 = bool1.clone();
자 위와 같은 코드가 있다. 위 코드는 내가 원하는 데로 복사가 되었을까?
만약 그렇다고 생각을 하면 과거의 나와 같은 실수를 경험할 수 있을 것이다. 간단하게 확인하고자 하면 bool2[0][0] = true; 를 추가한 후 bool1[0][0] 의 값을 확인해보자 true를 return 할 것이다. 왜냐하면, 이차원 배열은 1차원 배열에 다시 1차원 배열을 넣는 것과 똑같은 것이기 때문이다.
boolean[][] bool1 = new boolean[1][1];
boolean[][] bool2 = { new boolean[1] };
위 bool1과 bool2는 같다. 하면 어떻게 해야 할까? 일차원 배열에서 사용한 1번 방법을 사용하면 된다.
boolean[][] bool1 = { { true } };
boolean[][] bool2 = new boolean[1][1];
for(int i = 0; i < bool1.length; i++){
bool2[i] = bool1[0].clone();
}
즉 배열에 객체가 담기는데 담긴 객체도 같은 주소를 보지 않게 하려면 아래와 같이 해야 한다. (예제는 String으로 작성)
String[] arr1 = { "1" };
String[] arr2 = new String[1];
for(int i = 0; i < arr1.length; i++){
arr2[i] = String.valueOf(arr1[0]);
}
'java&spring' 카테고리의 다른 글
hibernate-validator를 이용한 유효성 체크 (0) | 2017.04.08 |
---|---|
[자바] ArrayList와 LinkedList의 차이 (0) | 2017.03.17 |
[Java] 예약어 final 정리 (0) | 2017.03.07 |
[Java] 제네릭(generic) 정리 (0) | 2017.02.22 |
[Java] 형변환 (Casting) (0) | 2017.02.07 |