SSinsa
1. 배열과 리스트의 관계 본문
배열과 리스트는 비슷하면서도 다르다.
따라서, 습관적인 사용을 하거나, 때로는 둘의 차이를 놓쳐 작은 실수에서 오랜 시간을 빼앗기기도 해왔다.
1) 배열
먼저, 배열은 대괄호를 사용한다.
ex) final String[] strings = new String[] {"one", "two"};
이때, 자료형에 따라 선언 방식이 차이가 있는데,
int 배열은 명시적으로 크기를 지정, boolean 배열은 암시적으로 크기를 지정
이렇게 다르게 지정해도 컴파일러는 자동으로 길이를 계산해준다.
- 랜덤접근 : 인덱스 값을 이용해 배열 원소에 직접 접근
사용중인 배열에 원소를 추가하려면,
더 큰 배열을 새로 만들어 현재 배열을 담았야한다. 또한, 새 배열에 원본 배열의 주소도 재할당해야한다.
(JVM은 이 역할을 System 클래스 객체에 arrayCopy 사용!)
ex) System.arraycopy(integers, 0, newIntegersArray, 0, integers.length);
* 정수 타입 배열에는 final 키워드를 사용할 수 없다.
2) 리스트
# ArrayList
- 리스트의 데이터로 배열을 사용
- List 인터페이스의 구현체
- 배열이 인터페이스를 뒷받침하는 모습
ArrayList 클래스 생성시 초기 배열 크기 지정 (default 10)
원소를 추가할 때면 자동으로 더 큰 배열 재할당 (배열의 성격이 담겨있음) -> 그러나, 시간이 소요, 더 큰 메모리 용량을 소모
따라서, 이것을 사용할 땐 크기를 크게 잡기!
또한, 중간에 원소를 추가하려면 그 뒤 모든 원소는 전체 이동...;; 따라서 연산량이 많은 작업이 될 수 있다.
이때 모든 재할당 작업은 단방향!
그럼 ArrayList 클래스로 만든 배열을 삭제할땐?
원소를 삭제해도 배열의 크기는 줄지 않는다. 생성시 고정으로 만들었기 때문에.
즉, 변경이 많을 때는 비추!
그럼 추천 상품은? 바로, LinkedList 이다.
# LinkedList
배열을 사용하지 않는다. 대신 리스트 안에서 다음 원소를 가리키는 내부 객체를 이용.
public class SimpleLinkedList<E> {
private static class Element<E> {
E value;
Element<E> next;
}
private Element<E> head;
}
즉, LinkedList는 head와 next로 원소를 찾는다.
따라서, 변경이 많은 작업에 사용하면 효율적이다.
그러나 ArrayList 클래스는 랜덤접근으로 인덱스를 바로 찾을 수 있다는 장점이 있으며, 리스트 크기가 클 때 추천한다.
또, LinkedList는 원소들이 연결되어있어 역방향으로 검색이 편리해진다.
cf. LinkedList는 Queue 인터페이스를 구현할 수 있다.
'Java > Java Programming' 카테고리의 다른 글
| 9. JUnit으로 테스팅하기 (0) | 2020.02.18 |
|---|---|
| 5. 어노테이션 이용하기 (0) | 2020.02.05 |
| 4. 오토박싱과 언박싱 이해하기 (0) | 2020.02.05 |
| 3. 제네릭 이해하기 (0) | 2020.01.15 |
| 2. String 이용하기 (0) | 2020.01.15 |