본문 바로가기
언어/JAVA

객체 배열

by step 1 2021. 4. 16.
반응형

기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만, 객체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈(4바이트, 8바이트)메모리만 할당되고(null) 각 요소 객체는 생성하여 저장해야 함

 

객체 배열 복사하기

  • System.arraycopy(src, srcPos, dest, destPos, length); 자바에서 제공되는 배열 복사 메서드
  • 얕은 복사(메모리 주소를 복사)

객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정 됨

즉, 두 배열이 같은 객체를 가리킴

package ch21;

public class Book {

	private String title;
	private String author;
	
	public Book() {
		// TODO Auto-generated constructor stub
	}
	
	
	public Book(String title, String author) {
		
		this.title = title;
		this.author = author;
	}


	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);
	}
	
}
package ch21;

import java.util.Iterator;

public class ObjectCopyTest {

	public static void main(String[] args) {

		Book[] libray = new Book[5];
		Book[] copyLibrary = new Book[5];

//		for (int i = 0; i < libray.length; i++) {
//			System.out.println(libray[i]);
//			
//		}

		libray[0] = new Book("태백산캑1", "조정래");
		libray[1] = new Book("태백산캑2", "조정래");
		libray[2] = new Book("태백산캑3", "조정래");
		libray[3] = new Book("태백산캑4", "조정래");
		libray[4] = new Book("태백산캑5", "조정래");
		
		System.arraycopy(libray, 0, copyLibrary, 0, 5);
		
		System.out.println("== library ==");
		for (Book book : libray) {
			System.out.println(book);
			book.showinfo();
		}
		
		System.out.println("== copy library ==");
		for (Book book : copyLibrary) {
			System.out.println(book);
			book.showinfo();
		}
		
		// 배열 데이터 변경
		libray[0].setAuthor("박완서");
		libray[0].setTitle("나목");
		
		System.out.println("== library ==");
		for (Book book : libray) {
			System.out.println(book);
			book.showinfo();
		}
		
		System.out.println("== copy library ==");
		for (Book book : copyLibrary) {
			System.out.println(book);
			book.showinfo();
		}
	}
}

 

결과

 

깊은 복사(메모리주소를 복사하는 것이 아니라 데이터를 복사)

package ch21;

import java.util.Iterator;

public class ObjectCopyTest {

	public static void main(String[] args) {

		Book[] libray = new Book[5];
		Book[] copyLibrary = new Book[5];

//		for (int i = 0; i < libray.length; i++) {
//			System.out.println(libray[i]);
//			
//		}

		libray[0] = new Book("태백산캑1", "조정래");
		libray[1] = new Book("태백산캑2", "조정래");
		libray[2] = new Book("태백산캑3", "조정래");
		libray[3] = new Book("태백산캑4", "조정래");
		libray[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 (int i = 0; i < libray.length; i++) {
			copyLibrary[i].setAuthor(libray[i].getAuthor());
			copyLibrary[i].setTitle(libray[i].getTitle());
			
		}
//		System.arraycopy(libray, 0, copyLibrary, 0, 5);
		
//		System.out.println("== library ==");
//		for (Book book : libray) {
//			System.out.println(book);
//			book.showinfo();
//		}
//		
//		System.out.println("== copy library ==");
//		for (Book book : copyLibrary) {
//			System.out.println(book);
//			book.showinfo();
//		}
		
		// 배열 데이터 변경
		libray[0].setAuthor("박완서");
		libray[0].setTitle("나목");
		
		System.out.println("== library ==");
		for (Book book : libray) {
			System.out.println(book);
			book.showinfo();
		}
		
		System.out.println("== copy library ==");
		for (Book book : copyLibrary) {
			System.out.println(book);
			book.showinfo();
		}
	}
}

결과

반응형

'언어 > JAVA' 카테고리의 다른 글

ArrayList  (0) 2021.04.16
2차원 배열 사용하기  (0) 2021.04.16
배열(array)  (0) 2021.04.16
싱글톤 패턴  (0) 2021.04.16
static 메서드  (0) 2021.04.16