1. 개요
배열이란 특정 동일한 자료형이 순차적으로 이어져 있는 자료구조다.
인덱스 연산자 []를 이용해 빠른 참조가 가능하다.
그리고 모든 자료형이 붙어있는 상태라 메모리 상에서 물리적 위치와 논리적 위치가 동일하다.
그리고 자바에선 객체 배열을 구현한 ArrayList를 주로 사용한다.
2. 사용법
2-1. 선언
int[] arr = new int[10];
int arr[] = new int[10];
둘 다 사용 가능하다. int 자료형이 10개 들어가는 배열이 생성된다.
선언과 동시에 초기화 하면 new 키워드를 사용하지 않아도 되지만, 미리 선언만 하면 초기화 할 때,
new 키워드를 사용해야 생성할 수 있다.
int[] arr;
arr = new int[] {1, 2, 3}
이런 형태로 사용하지 않으면 배열이 생성되지 않는다.
2-2. 초기화
배열을 생성하고, 원하는 값을 집어넣을 때, 하나하나 집어넣으면 배열로 선언한 의미가 없다.
가능하면 반복문을 활용하는 게 효율적이다.
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
이런 식으로 핸들링하는 게 효율적이다.
2-3. 배열의 특징
배열은 실제로 데이터가 들어있지 않아도 선언한 크기만큼 메모리를 차지한다.
그리고 배열에 length 함수를 사용하면 들어있는 내용물의 수가 아닌, 배열의 크기가 반환된다.
2-4. 객체 배열
일반 배열의 경우, 생성할 때, 배열의 크기만큼 메모리를 차지하지만, 객체배열의 경우, 인스턴스를
생성하기 전까진, 객체의 주소가 들어갈(4, 8바이트) 메모리만 할당되고(null), 각 요소에 인스턴스를
생성해야 한다.
객체 배열을 복사할 경우, System.arrayCopy(src, srcPos, dest, destPos, length) 함수를 사용한다.
소스가 되는 어레이, 복사될 위치 어레이, 길이 등을 지정하면 된다.
만약 소스에서 10개를 가져온다고 했는데 dest에서 10개이상의 자리가 없으면 에러가 일어난다.
student라는 클래스가 있다고 치고,
Student[] school = new Student[3];
school[0] = new Student("1", "kim");
school[1] = new Student("2", "im");
school[2] = new Student("3", "lee");
Student[] copySchool = new Student[3];
System.arraycopy(school, 0, copySchool, 0, 3);
이런 식으로 복사할 수 있다.
그런데 이렇게 사용하면 이건 얕은 복사가 된다.
얕은 복사가 된다면 school 배열을 수정할 경우, copySchool도 자동으로 수정된다.
깊은 복사를 하려면
for (int i = 0; i < school.length(); i++) {
copySchool[i] = new Student();
copySchool[i].setId(school[i].getId());
copySchool[i].setName(school[i].getName());
}
객체를 새로 만들어서 집어넣으면 된다. 이렇게 하면 school배열의 객체가 변하든 말든
copySchool 배열엔 영향이 없다.
2-5. ArrayList
java.util 패키지에서 제공되는 자료구조다. 특징으로는
- 기존의 배열 선언과 사용 방식은 배열의 길이를 정하고 요소의 개수가 배열의 길이보다 커지면
배열을 재할당하고 복사해야 했다. - 배열의 요소를 추가하거나 삭제하면 다른 요소들의 이동에 대한 구현을 해야 함
- ArrayList는 객체 배열을 좀 더 효율적으로 관리하기 위해 자바에서 제공해 주는 클래스
- 이미 많은 메소드들이 최적의 알고리즘으로 구현되어 있어 각 메소드의 사용방법만 익히면
유용하게 쓸 수 있다.
주요 메소드를 정리하면
메소드 | 설명 |
boolean add(E e) | 요소 하나를 배열에 추가, 제네릭 사용 가능 |
int size() | 배열에 추가된 요소 전체의 개수를 반환 |
E get(int index) | index로 들어온 숫자의 위치에 있는 요소 값을 반환 |
E remove(int index) | index로 들어온 숫자의 위치에 있는 값을 제거하고 그 값을 반환 |
boolean isEmpty() | 배열이 비어 있는지 확인 |
이정도로 정리할 수 있다.
'자바' 카테고리의 다른 글
객체지향 프로그래밍 정리 3. static 메소드 (클래스 메소드) (0) | 2022.03.31 |
---|---|
객체지향 프로그래밍 정리 2. static 변수 (0) | 2022.03.31 |
디자인 패턴 7. 전략 패턴 (Strategy Pattern) (0) | 2022.03.12 |
디자인 패턴 6. 파사드 패턴 (Facade Pattern) (0) | 2022.03.12 |
디자인 패턴 5. 옵저버 패턴 (Observer Patern) (0) | 2022.03.12 |
댓글