본문 바로가기
Language/JAVA

[JAVA] 09일차. 배열과 ArrayList(1), 객체 배열 사용하기(2)

by 전전긍긍 2022. 2. 26.

👀2022020121 공부기록

 

📍본 포스팅은 인프런-Do it! 자바 프로그래밍 입문 강의를 바탕으로 작성함을 알립니다.

 

[무료] Do it! 자바 프로그래밍 입문 - 인프런 | 강의

비전공자, 문과생도 무릎을 ‘탁!’ 치며 이해하는 20년 경력 명강사의 자바 강의!, - 강의 소개 | 인프런...

www.inflearn.com


17. 배열과 ArrayList(1)

📍배열 : 동일한 자료형의 변수를 한꺼번에 순차적으로 관리.

자료형[] 배열이름 = new 자료형[개수];
int[] arr = new int[10];
자료형 배열이름[] = new 자료형[개수];
int arr[] = new int[10];

📍배열 초기화 

배열은 선언과 동시에 초기화를 할 수 있음. 배열을 초기화 할 때는 배열의 개수를 명시하지 않음.

아무런 초기화 값이 없이 선언만 한 경우, 정수는 0, 실수는 0.0, 객체 배열은 null

 

[배열 선언과 동시에 초기화]

[위와는 다른 방식으로 초기화]

[자료형끼리 배열 선언과 초기화]

[배열의 길이를 num.length로 한다면 값이 0이 나오는 문제가 생김]

[자료가 있는 요소만 출력하기 위해서 크기에 대한 저장을 size로 하여 1씩 증가시킴]


18. 객체 배열 사용하기(2)

객체 배열 만들기

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

public class Book {

	//멤버변수
	private String bookName;
	private String author;
	
	//constructor
	//default constructor
	public Book() {}
	public Book(String bookName, String author) {
		this.bookName = bookName;
		this.author = author;
	}
	public String getBookName() {
		return bookName;
	}
	
	//private 변수들을(멤버변수) 위한 get, set 메서드
	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);
	}
	
	
}

첫 번째 출력문에서는 자리가 비어있어서 null값이 나옴.(객체 배열이기 때문에 null)

두 번째 출력문은 주소값

세 번째 출력문에서는 Book에 대한 매개변수 값을 넣음

package array;

public class BookArray {

	public static void main(String[] args) {

		Book[] library = new Book[5]; //주소의 자리가 5개
		
		for(int i = 0; i < library.length; i++)
		{
			System.out.println(library[i]);
		}
		
		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", "조정래");
		
		for(int i = 0; i < library.length; i++)
		{
			System.out.println(library[i]);
		}
		
		for(int i = 0; i < library.length; i++)
		{
			library[i].showBookInfo();
		}
		
		
	}

}
/*
null
null
null
null
null
array.Book@4517d9a3
array.Book@372f7a8d
array.Book@2f92e0f4
array.Book@28a418fc
array.Book@5305068a
태백산맥1, 조정래
태백산맥2, 조정래
태백산맥3, 조정래
태백산맥4, 조정래
태백산맥5, 조정래
*/

배열 복사하기

기존 배열과 같은 배열을 만들거나 배열이 꽉 찬 경우 더 큰 배열을 만들고 기존 배열 자료를 복사할 수 있다.

객체 배열 복사하기

  • 얕은 복사 : 배열 요소의 주소만 복사되므로 배열 요소가 변경되면 복사된 배열의 값도 변경 됨
  • 깊은 복사 : 서로 다른 인스턴스의 메모리를 요소로 가지게 됨

얕은 복사

package array;

public class ObjectCopy {

	public static void main(String[] args) {

		Book[] bookArray1 = new Book[3];
		Book[] bookArray2 = new Book[3];
		
		bookArray1[0] = new Book("태백산맥1", "조정래");
		bookArray1[1] = new Book("태백산맥2", "조정래");
		bookArray1[2] = new Book("태백산맥3", "조정래");
		
		//System이라는 클래스에 있는 static메서드
		System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
		
		for(int i = 0; i < bookArray2.length; i++) {
			bookArray2[i].showBookInfo();
		}
		
		bookArray1[0].setBookName("나목");
		bookArray1[0].setAuthor("박완서");
		
		System.out.println("===================");
		for(int i = 0; i < bookArray1.length; i++) {
			bookArray1[i].showBookInfo();
		}
		
		System.out.println("===================");
		for(int i = 0; i < bookArray1.length; i++) {
			bookArray2[i].showBookInfo();
		}
	}

}

/*
태백산맥1, 조정래
태백산맥2, 조정래
태백산맥3, 조정래
===================
나목, 박완서
태백산맥2, 조정래
태백산맥3, 조정래
===================
나목, 박완서
태백산맥2, 조정래
태백산맥3, 조정래
*/

깊은 복사

package array;

public class ObjectCopy {

	public static void main(String[] args) {

		Book[] bookArray1 = new Book[3];
		Book[] bookArray2 = new Book[3];
		
		bookArray1[0] = new Book("태백산맥1", "조정래");
		bookArray1[1] = new Book("태백산맥2", "조정래");
		bookArray1[2] = new Book("태백산맥3", "조정래");
		
		bookArray2[0] = new Book();
		bookArray2[1] = new Book();
		bookArray2[2] = new Book();
		
		
		for(int i = 0; i < bookArray1.length; i++) {
			bookArray2[i].setAuthor(bookArray1[i].getAuthor());
			bookArray2[i].setBookName(bookArray1[i].getBookName());
		}
		
		bookArray1[0].setBookName("나목");
		bookArray1[0].setAuthor("박완서");
	
		for(int i = 0; i < bookArray1.length; i++) {
			bookArray1[i].showBookInfo();
		}
		
		System.out.println("===================");
		for(int i = 0; i < bookArray1.length; i++) {
			bookArray2[i].showBookInfo();
		} 
		
	}

}
/*
나목, 박완서
태백산맥2, 조정래
태백산맥3, 조정래
===================
태백산맥1, 조정래
태백산맥2, 조정래
태백산맥3, 조정래
*/

⚠️객체 배열을 사용한다고 했을 때,

1. 인스턴스가 모두 생성되는 것은 아님

2, 객체 배열을 복사를 한다고 해서 완전히 다른 인스턴스를 가리키는 것이 아니라 같은 인스턴스를 가리키고 있기 때문에, 문제가 생기면 다른 인스턴스를 가리키도록 깊은 복사를 해야 된다.

향상된 for문(enhanced for loop)

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

for ( 변수 : 배열) {
	반복 실행문;
}
String[] strArr = {"Java", "Android", "C" };
		
for (String s : strArr){
	System.out.println(s);
}

int[] arr = {1, 2, 3, 4, 5};

for(int num : arr) { 
	System.out.println(num);
}
        
/*
Java
Android
C
1
2
3
4
5
*/