티스토리 뷰

반응형

먼저 일차원 배열을 복사해보자

 

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
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30