Do it 자바 프로그래밍 입문 [객체 배열 사용하기]

wish17·2022년 10월 29일
0

Do it 자바

목록 보기
4/10

객체 배열 사용하기

객체 배열 만들기

  • 참조 자료형을 선언하는 객체 배열
  • 배열만 생성한 경우 요소는 null로 초기화 된다.
  • 각 요소를 new를 활용하여 생성하여 저장해야 한다.

예제는 Book 클래스를 생성하여 객체 배열을 만들어 보았다.

public class Book {
	private String bookName;
	private String author;
	
	public Book() {}
	public Book(String bookName, String author) {
		this.bookName = bookName;
		this.author = author;
	}
		
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
    }    
    public void showBookInfo() {
		System.out.println(bookName + ", " + author);
	}	
}

main이 있는 BookArray 클래스에서 객체 배열을 생성한 후 출력하면 null로 초기화되어 있는 것을 확인할 수 있다.

public class BookArray {
	public static void main(String[] args) {
		Book[] library = new Book[5];
		
		for(int i=0; i<library.length; i++) {
			System.out.println(library[i]);
		}
	}
}

<리마인드>
int, double과 같은 기본 자료형으로 배열을 생성하면 해당 자료형이 차지하는 크기(int면 4byte 등)와 배열의 개수만큼의 공간이 만들어진다.

하지만 객체 배열에서는 처음부터 객체가 만들어지는 것이 아니라 객체가 가리킬 주소의 자리가 만들어진다. 때문에 나중에 객체를 new 키워드를 통해 직접 생성해주어야 한다.

즉, 위 코드는 library 배열에 Book 객체가 5개 생성된 것이 아니라 주소의 자리가 5개 생성된 상태이다.


따라서 그림처럼 배열 안에 다시 객체를 넣어주어야 한다.

public class BookArray {
	public static void main(String[] args) {
		Book[] library = new Book[5];
		
		library[0] = new Book("태백산맥", "조정래");
		library[1] = new Book("데미안", "헤르만 헤세");
		library[2] = new Book("어떻게 살 것인가", "유시민");
		library[3] = new Book("토지", "박경리");
		library[4] = new Book("어린 왕자", "생텍쥐페리");
		
		for(int i=0; i<library.length; i++) {
			System.out.println(library[i]);
		}
		for(int i=0; i<library.length; i++) {
			library[i].showBookInfo();
		}
	}
}

배열 복사하기

기존 배열과 같은 배열을 만들거나 배열이 꽉 찬 경우 더 큰 배열을 만들고 기존 배열 자료를 복사할 수 있다.
System.arraycopy(src, srcPos, dest, destPos, length);

매개변수설명참고
src복사할 배열 이름어떤 배열을 복사할 것 이냐
srcPos복사할 배열의 첫 번째 위치기존 배열의 어느 위치부터 복사할거냐
dest복사해서 붙여 넣을 대상 배열 이름어디에 복사할 것 이냐
destPos복사해서 대상 배열에 붙여 넣기를 시작할 첫 번째 위치복사되어야 할 배열의 어느 위치에 복사 할 것이냐
lengthsrc에서 dest로 자료를 복사할 요소 개수몇개를 복사할 것 이냐

예시

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

System.arraycopy(array1, 0, array2, 1, 4);
= array1의 0번 자리부터 4개를 복사해 array2의 1번자리부터 붙혀 넣어라

복사할 때 당연히 배열 size 초과하면 에러 남
ex) 10개 배열자리를 복사해 5개 배열에게 붙여넣기

객체 배열 복사하기

얕은 복사

얕은 복사 : 배열 요소의 주소만 복사되므로 배열 요소가 변경되면 복사된 배열의 값도 변경된다.

얕은 복사 예시

public class ObjectCopy {
	public static void main(String[] args) {
		Book[] bookArray1 = new Book[5];
		Book[] bookArray2 = new Book[5];
		
		bookArray1[0] = new Book("태백산맥", "조정래");
		bookArray1[1] = new Book("데미안", "헤르만 헤세");
		bookArray1[2] = new Book("어떻게 살 것인가", "유시민");
		bookArray1[3] = new Book("토지", "박경리");
		bookArray1[4] = new Book("어린 왕자", "생텍쥐페리");
		
		System.arraycopy(bookArray1, 0, bookArray2, 0, 5);
		//ㄴ> static 메서드, bookArray1의 객체를 boorArr2에 복사
		
		for(int j=0; j<bookArray2.length; j++) {
			bookArray2[j].showBookInfo();
		}//ㄴ> 수정전 bookArray2 출력
		
		bookArray1[0].setBookName("나목");
		bookArray1[0].setAuthor("박완서");
		//ㄴ> bookArray1의 배열을 수정
		
		for(int i=0; i<bookArray2.length; i++) {
			bookArray2[i].showBookInfo();
			//ㄴ> bookArray2 출력
		}
	}
}

bookarray1을 바꿧는데 bookarray2도 바뀌는 것을 볼 수 있다.
(태백산맥, 조정래 -> 나목, 박완서)

bookArr2에는 bookArr1의 값이 복사된 것이 아니라 주소가 복사된 것이라 bookArr1의 요소를 수정하면 bookArr2의 요소도 함께 수정된다.
(정확히는 함께 수정되는 것이 아니라 동일한 인스턴스 주소를 가리키고 있으므로 인스턴스가 수정되면 동시에 바뀌는 것이다.)

배열의 요소 값을 변경하는 경우 위 그림에서 아래 그림으로 바뀜

깊은 복사

  • 각 배열마다 객체를 생성 후, 원래 배열에 있는 객체의 정보를 직접 대입한다.
  • 복사하는 배열과 붙여지는 배열 두 배열이 서로 다른 인스턴스의 메모리를 요소로 가지게 됨.
    (인스턴스 주소를 복사하는게 아닌 인스턴스 내용 자체를 복사할 때 씀)

깊은 복사 예시

public class ObjectCopy {
	
	public static void main(String[] args) {
		Book[] bookArray1 = new Book[3];
		Book[] bookArray2 = new Book[3];
		
		bookArray1[0] = new Book("태백산맥", "조정래");
		bookArray1[1] = new Book("데미안", "헤르만 헤세");
		bookArray1[2] = new Book("어떻게 살 것인가","유시민");
 		
		bookArray2[0] = new Book(); //객체 직접 생성
		bookArray2[1] = new Book();
		bookArray2[2] = new Book();
		
		for(int i=0; i<bookArray1.length; i++){   // 각각의 요소를 복사
			bookArray2[i].setBookName(bookArray1[i].getBookName());
			bookArray2[i].setAuthor(bookArray1[i].getAuthor());
		}
		
		for(int i=0; i<bookArray2.length; i++){  //복사된 내용 확인
			bookArray2[i].showBookInfo();
		}
		
		bookArray1[0].setBookName("나목");   //bookArray1 의 내용 수정
		bookArray1[0].setAuthor("박완서");
		
		System.out.println("=== bookArray1 ===");    //bookArray1 출력
		for(int i=0; i<bookArray1.length; i++){
			bookArray1[i].showBookInfo();
		}
		
		System.out.println("=== bookArray2 ===");    //bookArray2 출력
		for(int i=0; i<bookArray2.length; i++){
			bookArray2[i].showBookInfo();   // bookArray1 과 다른 내용으로 출력됨
		}
	}
}

향상된 for문 (enhanced for loop)

배열 요소의 처음부터 끝까지 모든 요소를 참조할 때 편리한 반복문

기본 문법

for(자료형 변수 : 배열){
	반복 실행문;
}

예시

public class EnhancedForLoop {

	public static void main(String[] args) {

		String[] strArray = {"Java", "Android", "C", "JavaScript", "Python"};
		
		for(String s : strArray){
			System.out.println(s);
		}
		
		int[] arr = {1,2,3,4,5};
		
		for(int num : arr) {
			System.out.println(num);
		}
	}
}

0개의 댓글