[DoItJava] 07. 배열과 ArrayList
<정리>
1. 배열이란?
1. 자료를 순차적으로 관리하는 구조, 배열
배열(Array)는 자료가 연속으로 나열된 자료구조다.
배열을 사용하면 자료형이 같은 여러 개를 한번에 관리할 수 있다.
2. 배열 선언과 초기화
배열을 선언하면 선언한 자료형과 배열 길이에 따라 메모리가 할당된다.
<배열 선언 방식>
배열 선언 방식은 2가지가 있지만 첫번째 방법을 사용하는 걸 추천한다.
1) 자료형[] 배열명 = new 자료형[개수]
2) 자료형 배열명[] = new 자료형[개수]
int[] num = new int[10]; // int형 요소가 10개인 배열 선언
3. 배열 초기화하기
1) 배열을 선언함과 동시에 각 요소의 값이 자동 초기화
자바에서는 배열을 선언함과 동시에 각 요소의 값(정수는 0, 실수는 0.0, 객체 배열은 null)로 초기화된다.
2) 배열 선언과 동시에 특정 값으로 초기화
(주의) 값을 넣어 초기화할 때 [] 안에 개수를 쓰면 오류가 발생한다! new int[] 는 생략 가능!
int[] num = new int[] {1, 2, 3};
int[] num = {1, 2, 3}; // new int 생략O
// 오류 발생
int[] num = new int[3] {1, 2, 3}; // 개수쓰면 오류
3) 배열 선언 후 특정 값으로 초기화
(주의) 배열의 자료형을 선언한 후에 초기화하는 경우 new int[] 생략 불가!!!
int[] num; // 배열 선언
num = new int[] {1, 2, 3};
4. 배열 사용하기
1) 인덱스 연산자 []
인덱스 연산자는 배열 요소가 저장된 메모리 위치를 찾아주는 역할을 한다.
2) 배열 순서는 0번 부터
배열 길이가 n일 때 배열 인덱스는 0~(n-1)번 까지다.
배열의 길이: length 속성 이용
5. 문자 저장 배열 만들기
문자 자료형 배열은 char[] 로 선언
6. 객체 배열 사용하기
(주의) new로 생성해도 인스턴스가 바로 생성되는 것은 아니다.
객체 배열의 요소에 생성한 인스턴스를 직접 넣어주어야 한다!
public class BookArray2 {
public static void main(String[] args) {
Book[] library = new Book[5]; // Book 인스턴스 주소값을 담을 공간 5개 생성
// 배열의 각 요소에 Book 인스턴스 만들어 저장
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++){
library[i].showBookInfo();
}
for(int i=0; i<library.length; i++){
System.out.println(library[i]);
}
}
}
7. 배열 복사하기
1) 얕은 복사
얕은 복사란 객체 배열을 복사할 때 기존 인스턴스의 주소 값만 복사하는 것이다.
객체 배열의 요소에 저장된 값은 인스턴스 자체가 아니고 인스턴스의 주소 값이다.
그러므로 얕은 복사를 하게되면 복사되는 배열의 인스턴스 값이 변경되면 두 배열 모두 영향을 받는다.
반복문을 사용하건 Sytem.arraycopy()를 사용하건 객체 배열을 복사하면 항상 인스턴스 주소가 복사된다!
arraycopy(src, srcPos, dest, destPos, length)
src | 복사할 배열 이름 |
srcPos | 복사할 배열의 첫번째 위치 |
dest | 복사해서 붙여 넣을 대상 배열의 이름 |
destPos | 복사해서 대상 배열에 붙여 넣기를 시작할 첫 번쨰 위치 |
length | src에서 dest로 자료를 복사할 요소 개수 |
2) 깊은 복사
직접 인스턴스를 만들고 그 값을 복사하는 방식을 깊은 복사라고 한다.
대부분의 경우는 얕은 복사를 해도 크게 문제가 없지만 인스턴스를 따로 관리하고 싶다면 깊은 복사를 해야한다. 이렇게 하면 복사한 배열 요소는 기존 배열 요소와 서로 다른 인스턴스를 가리키므로 기존 배열의 요소 값이 변경되어도 영향을 받지 않는다.
8. 향상된 FOR문과 배열
자바 5부터 제공하는 향상된 for문은 배열의 처음에서 끝까지 모든 요소를 참조할 떄 사용하면 편리한 반복문이다. 배열의 요소 값을 순서대로 하나씩 가져와서 변수에 대입하며 초기화와 종료 조건이 없다.
2. 다차원 배열
1. 다차원 배열이란?
다차원 배열은 2차원 이상으로 구현한 배열을 말한다.
2차원 배열은 평면을 구현 하기 위해 사용할 수 있다. (체스, 바둑, 네비게이션 지도 등)
3차원 배열은 평면이나 공간을 나타내는 프로그램에 활용된다.
2. 이차원 배열
행의 개수: 전체 배열(arr)의 길이
열의 개수: arr[i].length
public class TowDimension {
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();
}
}
}
3. ArrayLsist 클래스 사용하기
1. 기존 배열의 단점과 ArrayList
기본 배열은 항상 배열 길이를 정하고 시작한다. 배열의 중간 값이 삭제 되면 배열을 하나하나 수정해야하는 불편함이 있다. 그래서 객체 배열을 조금 더 쉽게 사용할 수 있도록 객체 배열 클래스인 ArrayList를 제공한다.
2. ArrayList 클래스의 주요 메서드
boolean add(E e) | 요소 하나를 배열에 추가 |
int size() | 배열에 추가된 요소 전체 개수 반환 |
E get(int index) | 배열의 index 위치에 있는 요소 값 반환 |
E remove(int index) | 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환 |
boolean isEmpty() | 배열 비었는지 확인 |
3. ArrayList 클래스 활용하기
ArrayList는 java.util 패키지에 구현된 클래스다. ArrayList 사용시 import를 꼭 해야한다.
- E: 사용할 객체의 자료형
4. 배열 응용 프로그램