자바를 공부하며 List와 배열의 차이점을 자세히 알지 못해 이번 기회에 제대로 정리해보려 합니다.
1. 배열
우선 크기가 3인 정수형 배열을 선언해 봅시다.
int[] arr = new int[3];
배열을 선언하게 되면 같은 자료형의 원소들이 정해진 크기의 배열이 메모리에 할당합니다.
여기서 포인트는 정해진 크기, 같은 자료형입니다.
정해진 크기가 존재하기 때문에 배열의 크기를 늘리거나 줄일 수 없습니다.
원소가 들어있지 않은 배열이나 꽉 찬 배열이나 같은 크기의 같은 자료형의 배열이라면 메모리에 같은 크기가 각각 할당됩니다.
또한 메모리에 연속적으로 할당됩니다.
- 시간 복잡도
원소 접근 : O(1)
2. List
그림을 보면 더 쉽게 이해가 가능합니다.
우선 Java에서 List는 Interface입니다.
흔히 사용하는 ArratList, LinkedList Class는 List 인터페이스를 통해 사용할 수 있습니다.
자바는 List를 왜 이렇게 표현할까?
이유는 Generic 때문입니다.
특정 타입을 미리 지정하는 것이 아닌 사용자에 의해 지정되는 것을 의미합니다.
이를 통해 객체지향의 특성인 추상화를 사용했다는 것을 확인할 수 있습니다.
List를 통해 ArrayList를 선언하는 방식은
List arr = new ArrayList<>();
위와 같이 선언할 수 있습니다.
하지만 위와같이 어떤 자료형을 가진 List인지 선언하는 것은 타입체크가 힘들기 때문에
List<Integer> arr = new ArrayList<>();
위와같이 타입을 선언하여 List를 선언해야 타입체크를 쉽게 할 수 있습니다.
ArrayList를 선언하는 방식은
ArrayList<Integer> integers1 = new ArrayList<Integer>(); // 타입 지정
ArrayList<Integer> integers2 = new ArrayList<>(); // 타입 생략 가능
ArrayList<Integer> integers3 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
ArrayList<Integer> integers4 = new ArrayList<>(integers1); // 다른 Collection값으로 초기화
ArrayList<Integer> integers5 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // Arrays.asList()
위와 같은 방법으로 선언할 수 있습니다.
2 - 1. ArrayList
ArrayList에 대해 더 공부해보면 배열과 달리 크기를 선언하지 않고 ArrayList를 선언할 수 있습니다.
이는 고정된 크기가 아닌 가변 크기를 가진다고 해석할 수 있는데, 동적으로 크기를 줄이거나 늘릴 수 있습니다.
ArrayList 초기 크기는 10이고, 초기에 지정한 용량( 기본 용량 )을 초과할 경우 배열의 크기를 1.5배로 증가시킵니다.
데이터 추가, 삭제
이를 코드로 표현한다면
ArrayList<String> arr = new ArrayList<>();
arr.add("3");
arr.add("4");
arr.remove(1);
arr.remove("3");
위와 같이 표현할 수 있다.
코드를 분석해 보면
ArrayList를 선언하고, add를 통해 ArrayList에 원소를 더해줍니다.
첫 번째 , remove는 index를 통해 접근하여 삭제하고 삭제된 원소(3)를 return 합니다.
두 번째 remove는 ArrayList에서 객체에 해당되는 원소를 삭제하고 삭제 결과(true, false)를 return 합니다.
- 시간 복잡도
원소 접근(get) : O(1)
원소 추가(add) : 일반적으론 O(1)이나, Worst 경우에 배열의 크기 1.5배의 배열을 새로 할당해야 하기 때문에 O(n)
원소 삭제 (remove) : O(n) 위의 사진을 보면 자세히 알 수 있습니다.
2-2 LinkedList
Array에 LinkedList 도 존재하나 거의 사용하지 않는데, LinkedList의 장점인 중간 삽입 삭제가 빠르고, 단점인 순차 조회가 느리다는 특징이 존재합니다.
'자바' 카테고리의 다른 글
동시성 제어하기 (0) | 2023.10.05 |
---|---|
스트림 (0) | 2023.01.27 |
JVM이란 (0) | 2023.01.16 |
람다 표현식 (1) | 2023.01.11 |
동적 파라미터화 (0) | 2023.01.10 |