객체 배열 / 배열 복사 / 2차원 배열


객체 배열


    • 기본 자료형 배열 : 선언과 동시에 배열의 크기만큼 메모리 할당

    • 객체 배열 : 요소가 되는 객체의 주소가 들어갈 메모리만 할당(4or8 byte, null로 초기화), 각 요소 객체는 생성하여 저장해야 함

  • ex)

    • Book.java

        public class Book {
      
            private String title;
            private String author;
                  
            public Book(String title, String author) {
                this.title = title;
                this.author = author;
            }
                  
            public Book() {
            }
      
            public String getTitle() {
                return title;
            }
      
            public void setTitle(String title) {
                this.title = title;
            }
      
            public String getAuthor() {
                return author;
            }
      
            public void setAuthor(String author) {
                this.author = author;
            }
      
            public void showInfo() {
                System.out.println(title + "," + author);
            }
        }
      
    • Main.java

        public class Main {
      
            public static void main(String[] args) {
      
                Book[] books = new Book[5];
                      
                books[0] = new Book("마법사의 돌", "J.K.롤링");
                books[1] = new Book("비밀의 방", "J.K.롤링");
                books[2] = new Book("아즈카반의 죄수", "J.K.롤링");
                books[3] = new Book("불의 잔", "J.K.롤링");
                books[4] = new Book("불사조 기사단", "J.K.롤링");
                      
                for (Book book : books) {
                    book.showInfo();
                }
            }
        }
      
    • 출력 결과

        마법사의 ,J.K.롤링
        비밀의 ,J.K.롤링
        아즈카반의 죄수,J.K.롤링
        불의 ,J.K.롤링
        불사조 기사단,J.K.롤링
      



객체 배열 복사 - 얕은 복사(Shallow Copy)


  • 객체 주소만 복사, 두 배열이 같은 객체를 가리킴

  • ex)

    • ShallowCopy.java

        public class ShallowCopy {
      
            public static void main(String[] args) {
      
                Book[] books = new Book[5];
                Book[] copyBooks = new Book[5];
                      
                books[0] = new Book("마법사의 돌", "J.K.롤링");
                books[1] = new Book("비밀의 방", "J.K.롤링");
                books[2] = new Book("아즈카반의 죄수", "J.K.롤링");
                books[3] = new Book("불의 잔", "J.K.롤링");
                books[4] = new Book("불사조 기사단", "J.K.롤링");
                      
                System.arraycopy(books, 0, copyBooks, 0, 5);
                // from books, 0부터, to copyBooks, 0부터, 5개 복사
                      
                System.out.println("======= books =======");
                for (Book book : books) {
                    System.out.println(book);
                    book.showInfo();
                }
                      
                System.out.println("\n===== copyBooks =====");
                for (Book book : copyBooks) {
                    System.out.println(book);
                    book.showInfo();
                }
      
    • 출력결과

        ======= books =======
        ch21.Book@7de26db8
        마법사의 ,J.K.롤링
        ch21.Book@1175e2db
        비밀의 ,J.K.롤링
        ch21.Book@36aa7bc2
        아즈카반의 죄수,J.K.롤링
        ch21.Book@76ccd017
        불의 ,J.K.롤링
        ch21.Book@182decdb
        불사조 기사단,J.K.롤링
      
        ===== copyBooks =====
        ch21.Book@7de26db8
        마법사의 ,J.K.롤링
        ch21.Book@1175e2db
        비밀의 ,J.K.롤링
        ch21.Book@36aa7bc2
        아즈카반의 죄수,J.K.롤링
        ch21.Book@76ccd017
        불의 ,J.K.롤링
        ch21.Book@182decdb
        불사조 기사단,J.K.롤링
      
  • 한쪽 배열의 요소를 수정하면 다른 한쪽도 수정됨

    • ex)

        books[4].setTitle("죽음의 성물");
                      
                System.out.println("======= books =======");
                for (Book book : books) {
                    System.out.println(book);
                    book.showInfo();
                }
                      
                System.out.println("\n===== copyBooks =====");
                for (Book book : copyBooks) {
                    System.out.println(book);
                    book.showInfo();
                }
      
    • 출력결과

        ======= books =======
        ch21.Book@7de26db8
        마법사의 ,J.K.롤링
        ch21.Book@1175e2db
        비밀의 ,J.K.롤링
        ch21.Book@36aa7bc2
        아즈카반의 죄수,J.K.롤링
        ch21.Book@76ccd017
        불의 ,J.K.롤링
        ch21.Book@182decdb
        죽음의 성물,J.K.롤링
      
        ===== copyBooks =====
        ch21.Book@7de26db8
        마법사의 ,J.K.롤링
        ch21.Book@1175e2db
        비밀의 ,J.K.롤링
        ch21.Book@36aa7bc2
        아즈카반의 죄수,J.K.롤링
        ch21.Book@76ccd017
        불의 ,J.K.롤링
        ch21.Book@182decdb
        죽음의 성물,J.K.롤링
      



객체 배열 복사 - 깊은 복사(Deep Copy)


  • 각각의 객체를 생성하고 그 객체의 값을 복사 > 배열이 서로 다른 객체를 가리키도록 함

  • ex)

    • DeepCopy.java

        public class DeepCopy {
      
            public static void main(String[] args) {
                      
                Book[] books = new Book[5];
                Book[] copyBooks = new Book[5];
                      
                books[0] = new Book("마법사의 돌", "J.K.롤링");
                books[1] = new Book("비밀의 방", "J.K.롤링");
                books[2] = new Book("아즈카반의 죄수", "J.K.롤링");
                books[3] = new Book("불의 잔", "J.K.롤링");
                books[4] = new Book("불사조 기사단", "J.K.롤링");
                      
                copyBooks[0] = new Book();
                copyBooks[1] = new Book();
                copyBooks[2] = new Book();
                copyBooks[3] = new Book();
                copyBooks[4] = new Book();
                      
                for (int i = 0; i < copyBooks.length; i++) {
                    copyBooks[i].setAuthor(books[i].getAuthor());
                    copyBooks[i].setTitle(books[i].getTitle());
                }
                      
                System.out.println("======= books =======");
                for (Book book : books) {
                    System.out.println(book);
                    book.showInfo();
                }
                      
                System.out.println("\n===== copyBooks =====");
                for (Book book : copyBooks) {
                    System.out.println(book);
                    book.showInfo();
                }
      
    • 출력결과

        ======= books =======
        ch21.Book@1175e2db
        마법사의 ,J.K.롤링
        ch21.Book@36aa7bc2
        비밀의 ,J.K.롤링
        ch21.Book@76ccd017
        아즈카반의 죄수,J.K.롤링
        ch21.Book@182decdb
        불의 ,J.K.롤링
        ch21.Book@26f0a63f
        불사조 기사단,J.K.롤링
      
        ===== copyBooks =====
        ch21.Book@4361bd48
        마법사의 ,J.K.롤링
        ch21.Book@53bd815b
        비밀의 ,J.K.롤링
        ch21.Book@2401f4c3
        아즈카반의 죄수,J.K.롤링
        ch21.Book@7637f22
        불의 ,J.K.롤링
        ch21.Book@4926097b
        불사조 기사단,J.K.롤링
      
  • 한쪽 배열의 요소를 수정하면 수정한 쪽의 요소만 수정됨

    • ex)

        books[4].setTitle("죽음의 성물");
                      
                System.out.println("======= books =======");
                for (Book book : books) {
                    System.out.println(book);
                    book.showInfo();
                }
                      
                System.out.println("\n===== copyBooks =====");
                for (Book book : copyBooks) {
                    System.out.println(book);
                    book.showInfo();
                }
      
    • 출력결과

        ======= books =======
        ch21.Book@1175e2db
        마법사의 ,J.K.롤링
        ch21.Book@36aa7bc2
        비밀의 ,J.K.롤링
        ch21.Book@76ccd017
        아즈카반의 죄수,J.K.롤링
        ch21.Book@182decdb
        불의 ,J.K.롤링
        ch21.Book@26f0a63f
        죽음의 성물,J.K.롤링
      
        ===== copyBooks =====
        ch21.Book@4361bd48
        마법사의 ,J.K.롤링
        ch21.Book@53bd815b
        비밀의 ,J.K.롤링
        ch21.Book@2401f4c3
        아즈카반의 죄수,J.K.롤링
        ch21.Book@7637f22
        불의 ,J.K.롤링
        ch21.Book@4926097b
        불사조 기사단,J.K.롤링
      



2차원 배열


  • 다차원 배열 (multi dimensional array)

    • 이차원 이상으로 구현된 배열

    • 배열 요소로 또 다른 배열을 가지는 배열

    • 평면(이차원 배열) / 공간(삼차원 배열)

  • 2차원 배열 (two dimensional array)

    • 배열의 요소로 1차원 배열을 가지는 배열

    • int[][] 배열이름 = new int[행 개수][열 개수];

    • ex)

        public class TwoDimensionTest {
      
            public static void main(String[] args) {
      
                int[][] arr = { {1, 2, 3}, {1, 2, 3, 4} };
                      
                int i, j;
                      
                for (i = 0; i < arr.length; i++) {	//행
                    //arr.length = 행의 길의
                          
                    for (j = 0; j < arr[i].length; j++) {	//열
                              
                        System.out.print(arr[i][j] + " ");
                    }
                    System.out.println();
                }
                  
      
                  
                int[][] arr2 = new int[3][4];
                int k, l;
                for (k = 0; k < arr2.length; k++) {
                    for (l = 0; l < arr2[k].length; l++) {
                        System.out.print(arr2[k][l] + " ");
                    }
                    System.out.println();
                }
            }
        }
      
      
        // 출력결과
        // 1 2 3 
        // 1 2 3 4 
        // 0 0 0 0 
        // 0 0 0 0 
        // 0 0 0 0 
      
  • 2차원 가변 배열을 이용해 별 찍기

      public class Main {
    
          public static void main(String[] args) {
    
              int[][] star = new int[5][];
              // 열 개수 정해지지 않음
    
              star[0] = new int[1];
              star[1] = new int[2];
              star[2] = new int[3];
              star[3] = new int[4];
              star[4] = new int[5];
    
              for (int i = 0; i < star.length; i++){
                  for (int j = 0; j < star[i].length; j++) {
                      star[i][j]='*';
                      System.out.print((char) star[i][j] + " ");
                  }
                  System.out.println();
              }
    
          }
      }
    
    
      // 출력결과
      // * 
      // * * 
      // * * * 
      // * * * * 
      // * * * * * 
    

Categories:

Java