객체 배열 / 배열 복사 / 2차원 배열
03 Oct 2021 -
4 minute read
객체 배열
-
-
기본 자료형 배열 : 선언과 동시에 배열의 크기만큼 메모리 할당
-
객체 배열 : 요소가 되는 객체의 주소가 들어갈 메모리만 할당(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(); } } } // 출력결과 // * // * * // * * * // * * * * // * * * * *