면접을 준비하면서 array 와 list의 차이에 대해 묻는 질문을 많이 보았다. 어느정도 알고 있기는 하지만, 이번 글을 계기로 확실히 정리하면서 누가 나에게 array와 list의 차이가 뭐야?
하고 묻는다면 망설임 없이 대답할 수 있도록 할 것이다.
앞의 글에서, 변수는 한개의 데이터만 저장 할 수 있다고 했다. 따라서 저장할 데이터의 수가 많아진다면, 그만큼 많은 변수가 필요하다.
예를 들어 학생 50명의 성적을 저장하고 평균값을 구한다고 해보자. 그렇다면 먼저 학생 50명의 점수를 저장하기 위해 변수를 50개 선언하고, 평점을 구하기 위해 변수들을 모두 더해야 한다.
위와 같은 방법은 매우 비효율적이고 지루하다. 같은 타입의 많은 양의 데이터
를 다루는 프로그램에서는 좀 더 효율적인 방법이 필요한데 , 그게 바로 배열
이다.
즉, 데이터가 많아지면 그룹 관리의 필요성이 생기고, 이럴 때 프로그래밍에서 사용하는 것이 배열이라고 할 수 있다.
인덱스
를 부여해 놓은 자료구조.메모리가 낭비될 수 있다
길이를 바꿀 수 없다.
array에서의 인덱스 : 값에 대한
유일무이한 식별자.
(주민번호 같은 것).
이걸 활용해서 데이터 조회를 빠르게 할 수 있다.
List에서의 인덱스 :
몇번째 데이터인가?
정도의 의미.
// array 정의
int[] arr = new int[4];
// array에 값 저장
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
// array의 길이 확인
System.out.println(arr.length); // 출력결과 : 4
List
를 사용한다.배열은 인덱스에 따라서 값을 유지. 엘리먼트가 삭제되어도 빈자리(null)이 남게 되어 불필요한 메모리를 차지함.
삭제한 데이터를 뒤에 위치한 엘리먼트로 바꾸면, 데이터가 순서에 따라서 빈틈없이 위치하게 됨
==> List
[참고]
가변 배열과 같이 길이가 변경 가능한 배열의 경우,
1. 기존의 배열은 그대로 두고
2. 새로운 길이로 지정된 배열을 따로 할당하고 (메모리가 있는지 탐색 필요하다.)
3. 데이터의 복사를 진행하고,
4. 기존의 배열을 삭제한다.
=> 총 3번의 작업과 메모리 탐색이 필요하기 때문에리소스의 낭비가 크다
인덱스
라는 장점을 버리고, 대신 빈틈없는 데이터의 적재
라는 장점을 취한 자료구조몇번째 데이터인가
정도의 의미!)ArrayList
,LinkedList
의 2가지 형태를 지원한다.[참고2]
컬렉션 프레임워크
Java에서는 배열의 문제점을 해결하고, 널리 알려진 자료구조를 바탕으로 객체들을 효율적으로 추가/삭제/검색 할 수 있도로고
java.util
패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓았다. 이를컬렉션 프레임워크
라고 부른다.
몇 가지 인터페이스를 통해서 다양한 컬렉션 클래스를 이용할 수 있도록 하는데, 주요 인터페이스로는List
,Set
,Map
이 있다.
1. ArrayList
고정된 객체들로 구성된 List의 생성 :
Arrays.asList
를 이용하자.
package study.test;
import java.util.Arrays;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("박세진","박세연");
for (String name : list) {
System.out.println(name);
}
}
}
2. LinkedList
- ArrayList : 내부 배열에 객체를 저장해서 인덱스로 관리
- LinkedList : 인접 참조를 링크해서
체인처럼 관리한다.
-> 특정 인덱스의 객체를 삭제/ 삽입하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다.
[ArrayList, LinkedList 비교]
구분 | 순차적으로 추가/삭제 | 중간에 추가/삭제 | 검색 |
---|---|---|---|
ArrayList | 빠르다 | 느리다 | 빠르다 |
LinkedList | 느리다 | 빠르다 | 느리다 |
배열(Array)과 리스트(List)의 차이, 그리고 ArrayList와 LinkedList에 대해 알아보았다.
앞으로 헷갈리거나 까먹으면 이 글을 다시 복습하면서 잊어버리지 않도록 공부해야겠다.