본문 바로가기
객체 지향 프로그래밍/Java

chapter 7. 배열과 ArrayList

by xangmin 2022. 3. 15.
반응형

7-1. 배열이란?

배열 선언과 초기화

자료형[] 배열이름 = new 자료형[갯수];
자로형 배열이름 = new 자료형[갯수];

배열을 사용하려면 먼저 배열을 선언해야 한다. 배열도 변수와 마찬가지로 자료형을 함께 선언한다. 배열을 이루는 각각의 자료를 배열 요소라고 한다. 배열 요소는 자료형이 모두 같다. 먼저 저장하려는 자료의 성격에 맞게 자료형을 정하고 선언하려는 배열 요소 개수만큼 []안에 적는다. new 예약어는 배열을 새로 만들라는 의미이다.

int[] studentIDs = new int[10];	//int형 요소가 10개인 배열 선언

 

배열 초기화 하기

자바에서 배열을 선언하면 그와 동시에 각 요소의 값이 초기화된다. 배열의 자료형에 따라 정수는 0, 실수는 0.0, 객체 배열은 null로 초기화되며, 다음처럼 배열 선언과 동시에 특정 값으로 초기화할 수 있다. 배열 초기화 요소의 개수만큼 생성되므로 [] 안의 갯수는 생략한다.

int[] studentIDs = new int[] {101, 102, 103};	//갯수는 생략함

다음과 같이 값을 넣어 초기화할 때 [] 안에 갯수를 쓰면 오류가 발생한다.

int[] studentIDs = new int[3] {101, 102, 103};	// 오류발생

선언과 동시에 초기화할 때 다음과 같이 new int[] 부분을 생략할 수도 있다. int형으로 요소가 3개인 배열을 생성한다는 의미이므로 new int[]를 생략해도 된다.

int[] studentIDs = {101, 102, 103};		//int형 요소가 3개인 배열 생성

하지만 다음과 같이 배열의 자료형을 먼저 선언하고 초기화하는 경우에는 new int[]를 생략할 수 없다.

int[] studentIDs;				// 배열 자료형 선언
studentIDs = new int[] {101, 102, 103};		// new int[]를 생략할 수 없음

 

배열 사용하기

선언한 배열의 각 요소에 값을 넣을 때나 배열 요소에 있는 값을 가져올 때는 []를 사용한다. 만약 배열의 첫 번째 요소에 값 10을 저장한다면 다음처럼 코드를 작성한다.

studentIDs[0] = 10;

 

배열 초기화하고 출력하기

package array;

public class ArrayTest {
	public static void main(String[] args) {
		int[] num = new int[] {1,2,3,4,5,6,7,8,9};
		
		for(int i=0 ; i<num.length ; i++) {
			System.out.println(num[i]);
		}
	}
}

 

문자 저장 배열 만들기

알바펫 문자와 아스키 코드 값 출력하기

package array;

public class CarArray {
	public static void main(String[] args) {
		char[] alphabets = new char[26];
		char ch = 'A';
		
		for(int i = 0 ; i < alphabets.length ; i++, ch++) {
			alphabets[i] = ch;
		}
		
		for(int i = 0 ; i < alphabets.length ; i++) {
			System.out.println(alphabets[i] + "," + (int)alphabets[i]);
		}
	}
}

실행결과

A,65
B,66
C,67
..
..
Z,90

 

객체 배열 사용하기

package array;

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

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]);
		}
	}
}

실행결과

null
null
null
null
null

 

배열 복사하기

기존 배열과 자료형 및 배열의 크기가 똑같은 배열을 새로 만들거나 배열의 모든 요소에 자료가 꽉 차서 더 큰 배열을 만들어 기존 배열에 저장된 자료를 가져오려 할 때 배열을 복사한다. 

매개변수 설명
src 복사할 배열 이름
srcPos 복사할 배열의 첫 번째 위치
dest 복사해
destPos 복사해서 대상 배열에 붙여 넣기를 시작할 첫 번째 위치
length src에서 dest로 자료를 복사할 요소 갯수

 

package array;

public class ArrayCopy {
	public static void main(String[] args) {
		int[] array1 = {10, 20, 30, 40, 50};
		int[] array2 = {1, 2, 3, 4, 5};
		
		System.arraycopy(array1, 0, array2, 1, 4); //(복사할 배열, 복사할 첫 위치, 대상 배열, 붙여 넣을 첫 위치, 복사할 요소 갯수)
		for(int i = 0 ; i < array2.length ; i++) {
			System.out.println(array2[i]);
		}
	}
}

실행결과

1
10
20
30
40

 

객체 배열 복사하기

package array;

public class ObjectCopy1 {
	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("어떻게 살 것인가", "유시민");
		System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
		
		for(int i = 0 ; i < bookArray2.length ; i++) {
			bookArray2[i].showBookInfo();
		}
	}
}

실행결과

태백산맥,조정래
데미안,헤르만 헤세
어떻게 살 것인가,유시민

 

얕은 복사 (객체 배열의 얕은 복사)

package array;

public class ObjectCopy2 {
	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("어떻게 살 것인가", "유시민");
		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("=== bookArray1 ===");
		for(int i = 0 ; i < bookArray1.length ; i++) {
			bookArray1[i].showBookInfo();
		}
		System.out.println("=== bookArray2 ===");
		for(int i = 0 ; i < bookArray2.length ; i++) {
			bookArray2[i].showBookInfo();
		}
	
	}
}

실행결과

태백산맥,조정래
데미안,헤르만 헤세
어떻게 살 것인가,유시민
=== bookArray1 ===
나목,박완서
데미안,헤르만 헤세
어떻게 살 것인가,유시민
=== bookArray2 ===
나목,박완서
데미안,헤르만 헤세
어떻게 살 것인가,유시민

출력화면을 보면 bookArray1 배열 요소 값을 변경했는데 bookArray2 배열 요소 값도 변경된 것을 알 수 있다. 이유는 객체 배열의 요소에 저장된 값은 인스턴스 자체가 아니고 인스턴스의 주소 값이기 때문이다. 따라서 객체 배열을 복사할 때 인스턴스를 따로 생성하는 게 아니라 기존 인스턴스의 주소 값만 복사하게 된다.

 

깊은 복사

package array;

public class ObjectCopy3 {

	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 배열 인스턴스 생성
		bookArray2[1] = new Book();
		bookArray2[2] = new Book();
		
		for (int i = 0 ; i < bookArray1.length ; i++) {	//bookArray1 배열 요소를 새로 생성한 bookArray2 배열 인스턴스에 복사
			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[0].setAuthor("박완서");
		
		System.out.println("=== bookArray1 ===");
		for(int i = 0 ; i < bookArray1.length ; i++) {
			bookArray1[i].showBookInfo();
		}
		System.out.println("=== bookArray2 ===");
		for(int i = 0 ; i < bookArray2.length ; i++) {
			bookArray2[i].showBookInfo();
		}
	}

}

실행결과

태백산맥,조정래
데미안,헤르만 헤세
어떻게 살 것인가,유시민
=== bookArray1 ===
나목,박완서
데미안,헤르만 헤세
어떻게 살 것인가,유시민
=== bookArray2 ===
태백산맥,조정래
데미안,헤르만 헤세
어떻게 살 것인가,유시민

 

7-2. 다차원 배열

이차원 배열

int[][] arr = new int[2][3];
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
package array;

public class TwoDimension {
	public static void main(String[] args) {
		int[][] arr = {{1, 2, 3}, {4, 5, 6}};
		
		for(int i = 0 ; i < arr.length ; i++) {
			for(int j = 0 ; j < arr[i].length ; j++) {
				System.out.println(arr[i][j]);
			}
			System.out.println();
		}
	}
}

실행결과

1
2
3

4
5
6

 

7-3. ArrayList 클래스 사용하기

ArrayList  클래스의 주요 메서드

ArrayList 클래스에는 이미 만들어져 있는 메서드가 많다.

메서드 설명
boolean add (E e) 요소 하나를 배열에 추가한다. E는 요소의 자료형을 의미한다.
int size() 배열에 추가된 요소 전체 개수를 반환한다.
E get(int index) 배열의 index 위치에 있는 요소 값을 반환한다.
E remove (int index) 배열의 index 위치에 있는 요소 값을 제거 하고 그 값을 반환한다.
boolean isEmpty() 배열이 비어있는지 확인한다.

 

ArrayList 클래스 활용하기

예를 들어 앞에서 살펴본 Book 클래스형을 자료형으로 사용해서 ArrayList 배열을 생성한다면 다음과 같다.

ArrayList<Book> library = new ArrayList<Book>();
package array;
import java.util.ArrayList;		//ArrayList 클래스

public class ArrayListTest {
	public static void main(String[] args) {
		ArrayList<Book> library = new ArrayList<Book>();	//ArrayList 선언
		
		library.add(new Book("태백산맥", "조정래"));	//add() 매서드로 요소 값 추가
		library.add(new Book("데미안", "헤르만 헤세"));
		library.add(new Book("어떻게 살 것인가", "유시민"));
		library.add(new Book("토지", "박경리"));
		library.add(new Book("어린왕자", "생텍쥐페리"));
		
		for(int i = 0 ; i < library.size() ; i++) {	//배열에 추가도니 요소 개수만큼 출력
			Book book = library.get(i);
			book.showBookInfo();
		}
		System.out.println();
		
		System.out.println("=== 향상된 for문 사용 ===");
		for (Book book : library) {
			book.showBookInfo();
		}
	}
}

 

 

 

 

 

 

 

반응형

댓글