1. 배열
- 동일한 자료형의 순차적 자료구조
- 인덱스 연산자[]를 이용하여 빠른 참조가 가능
- 물리적 위치와 논리적 위치가 동일
- 배열의 순서는 0부터 시작
- 자바에서는 객체 배열을 구현한 ArrayList를 많이 사용
객체 배열 선언과 구현
기본 자료형 배열은 선언과 동시에 배열의 크기만큼 메모리가 할당되지만 , 객체 배열의 경우엔 요소가 되는 객체의 주소가 들어갈 메모리만 할당되고 각 요소 객체는 생성하여 저장해야한다.
객체 배열의 복사
System.arrayCopy(src , srcPos, dest, destPos, length)를 사용하면 만들어진 객체를 복사할 수 있다 .
파라미터는 복사의 기준이 되는 배열 src , src의 시작점 , 복사의 목적지가되는 배열 dest , dest의 시작점, 끝점
으로 이루어져 있고 사용법은 아래 코드와 같다.
package Array;
public class ArrayTest {
public static void main(String[] args) {
Book [] bookList = new Book[5];
Book [] copyBookList = new Book[5];
for(int i = 0 ; i<bookList.length; i++) {
bookList[i] = new Book("해리포터"+(i+1) , "조앤롤링인가");
}
for(Book book:bookList) {
System.out.println(book.toString());
}
//북리스트의 0번째부터, 카피북리스트의 0번째 부터 5번째까지 복사
//주소값만 복사하기떄문에 bookList 와 copyBookList의 요소들은 같은
//주소를 가르키고있다.
System.arraycopy(bookList, 0, copyBookList, 0, 5);
for(Book book:copyBookList) {
System.out.println(book.toString());
}
}
}
카피할때 배열 요소의 주소값만 카피하기 떄문에 복사한 배열의 요소와 원본 배열의 요소는 같은 주소값을 가르킨다.
두 배열중 하나에 수정이 있을시에 둘다 수정이 될 수도 있다.
그걸 원하지 않는다면 새로운 배열을 만들고 배열의 값만 가져와 복사할 요소의 setter를 통해 값을 복사해 주는 방식을 사용하면 된다.
package Array;
public class ArrayTest {
public static void main(String[] args) {
Book [] bookList = new Book[5];
Book [] copyBookList = new Book[5];
//bookList에 Book을 집어넣음
for(int i = 0 ; i<bookList.length; i++) {
bookList[i] = new Book("해리포터"+(i+1) , "조앤롤링인가");
}
//bookList의 요소의 값을 copyBookList의 요소에 값만 복사
for(int i = 0; i<copyBookList.length; i++) {
copyBookList[i] = new Book();
copyBookList[i].setName(bookList[i].getName());
copyBookList[i].setAuthor(bookList[i].getAuthor());
}
//bookList출력
for(Book book:bookList) {
book.showInfo();
System.out.println(book.toString());
}
//copyBookList 출력
for(Book book:copyBookList) {
book.showInfo();
System.out.println(book.toString());
}
//bookList와 copyBookList 주소값 비교
System.out.println(bookList[0]);
System.out.println(copyBookList[0]);
}
}
결과 값을 보면 값은 같지만 주소값은 다르게 출려된다
======BookList======
name=해리포터1,author=조앤롤링인가
Array.Book@3830f1c0
name=해리포터2,author=조앤롤링인가
Array.Book@39ed3c8d
name=해리포터3,author=조앤롤링인가
Array.Book@71dac704
name=해리포터4,author=조앤롤링인가
Array.Book@123772c4
name=해리포터5,author=조앤롤링인가
Array.Book@2d363fb3
======copyBookList======
name=해리포터1,author=조앤롤링인가
Array.Book@7d6f77cc
name=해리포터2,author=조앤롤링인가
Array.Book@5aaa6d82
name=해리포터3,author=조앤롤링인가
Array.Book@73a28541
name=해리포터4,author=조앤롤링인가
Array.Book@6f75e721
name=해리포터5,author=조앤롤링인가
Array.Book@69222c14
======BookList======
Array.Book@3830f1c0
======copyBookList======
Array.Book@7d6f77cc
다차원 배열
- 이차원 이상으로 구현된 배열
- 평면(이차원 배열) 이나 공간(삼차원 배열)을 활용한 프로그램 구현할 때 사용.
선언과 사용
package Array;
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++) {
for(j=0; j<arr[i].length; j++) {
System.out.print(arr[i][j]+",");
}
}
}
}
위 코드의 arr과 같이 선언하며 , 2중 for 문을 사용하여 읽어낸다 . 바깥쪽( i )은 행을 뜻하고 , 안쪽( j )은 열을 뜻한다.