본문 바로가기

java

배열과 리스트

 - 리스트는 특정 타입 값들이 순차적으로 정렬된 컬렉션이다. 자바에서는 LinkedList나 ArrayList 클래스를 일반적으로 사용

 - 어떤 경우에는 LinkedList보다 ArrayList가 더 적합하며 반대일 수 도있다.

 - 사용하기 전에 리스트는 애플리케이션의 성능이나 메모리 사용량과 밀접한 관계가 있기 때문에 반드시 고민을 해봐야 한다.

 - 리스트를 사용하려면 메서드와 생성자 매개변수는 필드 정의로 List 인터페이스를 사용함.

배열과 리스트의 관계

public void arrayDefinitions() {
int[] interger = new int[3];
boolean[] bools = {false, true, true, false};
String[] strings = new String[] {"one", "two"};

Random r = new Random();
String[] randomArray = new String[r.nextInt(100)];

}

 

 - 배열은 정의할 때는 크기를 지정해야 한다.

 - int 배열은 명시적으로 크기를 지정했고, boolean 배열은 암시적으로 크기를 지적했다. string 배열처럼 계산된 값을 이용 할 수도 있다.

 - 배열의 원소에는 인덱스 값을 이용하여 직접 접근 할 수 있다. 이를 랜덤 접근이라 한다.

- 배열 전체를 사용 중일 때 원소를 추가하려면 배열 크기를 늘려야 한다.

- 더 큰 배열을 새롭게 만들고 현재 배열에 있는 모든 원소를 새로운 배열로 복사한 다음 새로운 배열이 원본 배열의 주소를 가리키도록 재할당 한다.

- System 클래스 객체의 arrayCopy 라는 정적 메서드를 사용하면 된다.

public void arrayCopy() {
int[] integers = {0, 1, 2, 3, 4};

int[] newIntegerArray = new int[integers.length + 1];
System.arraycopy(integers, 0, newIntegerArray, 0, integers.length);
integers = newIntegerArray;
integers[5] = 5;
}

 

arrayCopy 인자 의미

src - 복사하고자 하는 소스, 원본이라고 생각하면 됨

srcPos - 복사하고자 하는 배열의 어느 부분부터 읽어 올지 위치를 정해줌

dest - 복사하려는 대상

destPos - dest에서 자료를 받을 때, 어느 부분부터 쓸지 시작 위치를 지정

length - 원본에서 복사본까지 얼만큼 읽어 올지 입력

 

ArrayList클래스는 리스트에 데이터로 배열을 사용하는 List 인터페이스의 구현체이다.

- ArrayList 클래스를 생성할 때는 배열의 초기 크기를 지정할 수 있다. 크기를 지정하지 않으면 기본 배열 크기는 10이다.

 - 원소가 가득한 배열에 새로운 원소를 추가할 때마다 ArrayList 클래스는 자동을 더 큰 배열을 재할당 한다. 시간이 소요되며 더 큰 메모리 용량을 소모한다.

 - 그래서 ArrayList 클래스를 생성할 때 크기가 큰 컬렉션을 이용할 거라면 기본 크기를 크게 잡는게 좋다.

 - ArrayList 클래스로 생성한 배열의 시작 위치나 중간 위치에 새로운 원소를 추가하려면 다음에 있는 모든 원소는 공간을 만들기 위해 이동 해야한다,

 - ArrayList 클래스로 생성한 배열은 원소를 많이 삭제해도 배열 크기는 줄어들지 않는다.

 - 원소 개수가 계속 변경되는 리스트라면 ArrayList 클래스 사용한 배열 생성은 최적의 선택이 아닐 수 있다. LinkedList 클래스가 더 적합할 수 있다.

 

 - ArrayList 클래스로 생성하는 배열에서는 랜덤 접근을 통해 해당 인덱스를 바로 찾을 수 있도록 돕는다.

 - LikedList 클래스로 생성하는 연결 리스트는 앞 원소를 참조해서 원소를 찾을 수 없다. 참조도 양방향으로 이루어 지지 않는다.

 - 양방향에서 원소를 참조할수 있도록 이중 연결 리스트를 이용해 원소를 찾을 수 있게 한다.

 - 일반적으로 원소에 랜덤 접근할 수 있어야 하거나 리스트 크기가 클수록 ArrayList 클래스를 사용하면 좋다,

 - 리스트의 첫 부분이나 중간에 원소를 삽입/삭제할 일이 많다면 LinkedList클래스를 사용하는게 좋다. 또한 리스트 크기가 작아지면 메모리 용량도 작아지는 이점이 있다. 재할당 과정으로 인해 발생하는 손실도 막아준다.

 

 

 

 

 

 

'java' 카테고리의 다른 글

원형 큐  (0) 2017.11.15
Queue는 무엇인가?  (0) 2017.11.15
람다 정리  (0) 2017.11.15
Java HashMap동작 원리  (0) 2017.10.16
ClassLoader  (0) 2017.10.14