3 minute read

1. 얕은 복사

  • 배열의 주소만 복사
  • 객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조
  • copy본의 값을 수정하면 origin의 값도 같이 수정되어 문제가 발생할 수 있음
public void method1() {
int[] origin = {1, 2, 3, 4, 5};
int[] copy = origin; // 배열 copy에 origin 복사

System.out.println("원본 배열");
for ( int i = 0; i < origin.length; i++ ) {
    System.out.print(origin[i] + " ");
}
// 향상된 for문으로
/* for ( int value : origin ) {
    System.out.print(value + " ");
} */
// 출력 결과 : 1 2 3 4 5

System.out.println("\n복사 배열");
for ( int i = 0; i < origin.length; i++ ) {
    System.out.print(origin[i] + " ");
}
// 향상된 for문으로
/* for ( int value : copy ) {
    System.out.print(value + " ");
} */
// 출력 결과 : 1 2 3 4 5
}

배열 복사 하면서 향상된 for문도 배웠다.
이건 따로 정리할 예정이다.

int[] copy = origin;
배열 변수 copy에 origin을 그대로 대입한 모습니다.

stack에 저장된 origin의 주소값만 복사하고,
heap에 저장된 origin의 배열을 참조한다.

int[] origin = {1, 2, 3, 4, 5};
int[] copy = origin;
copy[3] = 44; // 복사 완료된 copy 배열 4번째 값을 4에서 44로 변경

System.out.println("\n원본 배열");
for ( int value : origin ) {
    System.out.print(value + " ");
}
// 출력 결과 : 1 2 3 4 5

System.out.println("\n복사 배열");
for ( int value : copy ) {
    System.out.print(value + " ");
}
// 출력 결과 : 1 2 3 44 5

System.out.println("\norigin 주소값 : " + origin.hashCode());
System.out.println("copy 주소값 : " + copy.hashCode());

// 출력 결과 :
// origin 주소값 : 2104457164
// copy 주소값 : 2104457164

위 코드에 이어서 작성해보면 이렇다.
복사 완료 후 copy 배열의 값을 수정했다.

그리고 origin과 copy의 값을 출력해보니 둘 다 수정 되었다.
그리고 hashCode를 이용해 두 배열의 주소값을 출력하니 동일하다.

얕은 복사는 이런 문제점이 있다.
복사 후, 값을 따로따로 관리 할 수 없다.


2. 깊은 복사

  • 새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사

1) for문 이용

int[] origin = {1, 2, 3, 4, 5};
int[] copy = new int[5]; // copy 배열 미리 생성 필요

for ( int i = 0; i < origin.length ; i++ ) {
    copy[i] = origin[i];
}

2) System.arraycopy() 이용

int[] origin = {1, 2, 3, 4, 5};
int[] copy = new int[10]; // copy 배열 미리 생성 필요

// System.arraycopy(원본 배열명, 복사시작 index, 복사 배열명, 복사시작 index, 복사 길이);
System.arraycopy(origin, 0, copy, 2, origin.length);
// System.arraycopy(origin, 0, copy, 2, 4);

for ( int i = 0; i < copy.length; i++ ) {
    System.out.println("copy : " + copy[i]);
}

3) Arrays.copyOf() 이용

int[] origin = {1, 2, 3, 4, 5};

// int[] copy = Arrays.copyOf(origin, 복사 길이);
int[] copy = Arrays.copyOf(origin, 10);

for ( int i = 0; i < copy.length; i++ ) {
    System.out.println("copy : " + copy[i]);
}

4) clone 이용

int[] origin = {1, 2, 3, 4, 5};
int[] copy = origin.clone();

for ( int i = 0; i < copy.length; i++ ) {
    System.out.println("copy : " + copy[i]);
}
int[] origin = {1, 2, 3, 4, 5};
int[] copy = new int[5]; // 복사할 배열 생성

for ( int i = 0; i < origin.length ; i++ ) {
    copy[i] = origin[i]; // 복사
}

copy[3] = 44; // 복사 완료된 copy 배열의 4번째 값 변경

System.out.println("\n원본 배열 출력");
for ( int value : origin ) {
    System.out.print(value + " ");
}
// 출력 결과 : 1 2 3 4 5

System.out.println("\n복사 배열 출력");
for ( int value : copy ) {
    System.out.print(value + " ");
}
// 출력 결과 : 1 2 3 44 5

System.out.println("\norigin 주소값 : " + origin.hashCode());
System.out.println("copy 주소값 : " + copy.hashCode());

// 출력 결과 :
// origin 주소값 : 2104457164
// copy 주소값 : 1521118594

얕은 복사 시 했던 copy 배열의 4번째 값을 똑같이 변경해서 출력한 결과.
이번엔 얕은 복사와 다르게 origin 배열의 값은 변경 되지 않았다.

주소값 출력을 했을 때에도 두 개의 배열이 다른 주소값을 보여준다.
이는 새로운 배열을 생성하고 값만 복사했기 때문이다.

stack에 참조변수 하나를 더 생성하고,
heap에 저장된 origin 데이터를 copy 배열로 복사한 것이다.


3. 배열 정렬

int[] arr = {2, 5, 7, 1, 3};
// 오름차순 : 1, 2, 3, 5, 7
// 내림차순 : 7, 5, 3, 2, 1

for ( int value : arr ) {
    System.out.print(value + " ");
}

// 오름차순 ---------------------------------
Arrays.sort(arr);
System.out.println("");
System.out.println("");

for ( int value : arr ) {
    System.out.print(value + " ");
}

// 내림차순 ---------------------------------
// for문을 사용해서 원본 배열의 값을 반대로 대입
Integer[] integerArray = {2, 5, 7, 1, 3};
Arrays.sort(integerArray, Collections.reverseOrder());
System.out.println("");
System.out.println("");
System.out.println(Arrays.toString(integerArray));

/*for ( int value : integerArray ) {
    System.out.print(value + " ");
}*/
  • sort라는 메소드를 이용해서 정렬이 가능하다.
  • 내림차순은 Collection.reverseOrder를 이용하여 출력할 수 있다.

Categories:

Updated: