Java/Java 올인원 패키지

11. 객체 배열, 다차원 배열 (Java)

GrapeMilk 2020. 3. 15. 23:38

Goal 

 - 기본자료형 배열과 객체 배열에 대해 알아본다

 - 배열을 복사하는 방법에 대해 알아본다.

 - 2차원 배열에 대해 알아본다.

1. 기본자료형 배열과 객체 배열

 - 기본자료형 배열은 배열안에 실제 값을 갖는다.

 - 객체 배열은 배열안에 실제 값을 가르키는 주소값을 갖는다. 실제 값은 heap 메모리 영역에 존재한다.

 

 

2. 기본자료형 배열의 복사

 - System.arraycopy(복사대상 배열, 복사시작인덱스, 복사 배열, 복사 배열의 바뀌는 값의 시작 인덱스, 끝 인덱스) 메서드를 사용하여 만든다.

 

public class ArrayCopy {
    
    public static void main(String[] args) {
        
        int[] arr1 = {10, 20, 30, 40};
        int[] arr2 = {1, 2, 3, 4, 5};
        
        System.arraycopy(arr1, 0, arr2, 1, 3);
        
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }
    }

}

 

3. 객체 배열의 복사 

 - 객체 배열의 복사에는, 객체를 통해 생성된 인스턴스가 heap메모리 영역에 저장되는 특성으로 인해, 얕은 복사와 깊은 복사의 2가지 개념이 존재한다.

 

3-1 얕은복사

 - 한 객체 배열에서 주소값을 복사한 새로운 객체 배열을 만든다.

 - 두 객체 배열의 element의 주소값이 같기 때문에, 복사한 객체배열의 element 값을 바꾸면, 복사 대상의 객체배열의 element 값도 바뀐다.

 - System.arraycopy 메서드를 사용하여 만든다.

 

사진 1) 얕은 복사 메커니즘

 - 두 객체배열의 element가 가르키는 객체가 같기 때문에, 주소값이 같다.

 

예제 1) 얕은 복사 코드 구현

public class ObjectCopy {
    
    public static void main(String[] args) {
        
        Book[] library = new Book[5];
        Book[] copylibrary = new Book[5];
        
        library[0] = new Book("태백산맥1", "조정래");
        library[1] = new Book("태백산맥2", "조정래");
        library[2] = new Book("태백산맥3", "조정래");
        library[3] = new Book("태백산맥4", "조정래");
        library[4] = new Book("태백산맥5", "조정래");
        
        //arraycopy 메서드를 이용한 얕은 복사.
        System.arraycopy(library, 0, copylibrary, 0, 5);
        
        //향상된 for 문
        for (Book book : copylibrary) {
            book.showBookInfo();
        }
        
        library[0].setBookName("나목"); //library[0] 값을 바꾸면, copylibrary값도 바뀌는 것을 알 수 있다.
        library[0].setAuthor("박완서");
        
        for (Book book : library) {
            book.showBookInfo();
        }
        
        System.out.println("===============");
        
        for (Book book : copylibrary) {
            book.showBookInfo();
        }
        
        
    }
}

 

3-2 깊은복사

 - 복사 대상 객체 배열의 값을 하나하나 복사하여, 해당 배열과 같은 값을 갖고 주소값이 다른 새로운 배열을 만든다.

 - 새로운 인스턴스를 만들어주기 때문에, 기존 복사 객체 배열과 주소값이 다르다. 

        Book[] library = new Book[5];
        Book[] copylibrary = new Book[5];
        
        library[0] = new Book("태백산맥1", "조정래");
        library[1] = new Book("태백산맥2", "조정래");
        library[2] = new Book("태백산맥3", "조정래");
        library[3] = new Book("태백산맥4", "조정래");
        library[4] = new Book("태백산맥5", "조정래");
        
        copylibrary[0] = new Book(); //새로운 인스턴스를 생성했기 때문에, 주소값이 다르다.
        copylibrary[1] = new Book();
        copylibrary[2] = new Book();
        copylibrary[3] = new Book();
        copylibrary[4] = new Book();
        
        //향상된 for 문
        for (int i = 0; i < library.length; i++) {
           copylibrary[i].setBookName(library[i].getBookName());
           copylibrary[i].setAuthor(library[i].getAuthor());
        }
        

4. 2차원 배열

2차원 배열의 선언과 논리 구조

 

예제 2) 2차원 배열 코드 구현

public class TowDimension {

    public static void main(String[] args) {
        
        
        //2차원 배열 생성과 동시에 초기화
        int[][] arr = { {1, 2, 3}, {4, 5, 6, 7}};
        
        for (int i = 0; i < arr.length; i++) {
            for(int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }

    }

}