본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


카테고리 없음

자료구조

반응형

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 )은 열을 뜻한다.

 

 

반응형