배열 vs List 인터페이스
공통점
1. 동일한 특성의 데이터타입을 묶는다.
2. 반목문내에 변수를 이용하여 하나의 묶음 데이터들을 모두 접근할 수 있다.
차이점 - 배열
1. 처음 선언한 배열의 크기는 변경할 수 없다. 정적 할당(static allocation)
2. 메모리에 연속적으로 나열되어 할당된다.
3. 인덱스에 위치한 하나의 데이터를 삭제하더라도 해당 인덱스는 빈공간으로 남는다.
차이점 - 리스트
1. 리스트의 길이가 가변적이다. 동적 할당(dynamic allocation)
2. 데이터들이 연속적으로 나열된다. (메모리에 연속적으로 나열되지않고 데이터들은 주소로 연결되어있음. ex.C의 포인터)
3. 데이터 사이에 빈 공간을 허용하지 않는다.
<배열>
장점
1. 데이터의 크기가 정해져있을 경우 메모리 관리가 편리하다.
2. 메모리에 연속적으로 나열되어 할당되기때문에 인덱스를 통한 접근 속도가 빠르다.
단점
1. 배열의 크기를 변경할 수 없기 때문에 초기에 너무 큰 크기로 설정해주었을 경우 메모리 낭비가 심해지고, 너무 작은 크기로 설정해주었을 경우 데이터를 모두 담을 수 없어진다.
2. 빈 공간을 허용하지 않고 데이터를 삽입, 삭제 하고자한다면, 뒤에 데이터들을 모두 밀어내거나 당겨주어야한다. 이로 인해 속도가 느려 삽입, 삭제가 빈번할 경우에는 유용하지 않다.
<리스트>
장점
1. 데이터의 개수에 따라 해당 개수만큼 메모리를 동적 할당해주기때문에 메모리 관리가 편리하다.
2. 빈 공간을 허용하지 않기때문에 데이터 관리 또한 편리하다.
3. 주소로 데이터들이 연결되어 있기 때문에 연결된 주소만 바꿔주어도 삽입, 삭제에 용이하다. (ArrayList 제외)
단점
1. 객체로 데이터를 다루기 때문에 적은 양의 데이터만 쓸 경우 배열에 비해 메모리 소모가 많다.
2. 기본적으로 주소를 기반으로 구성되어있고 메모리에 순차적으로 할당하는 것이 아니기때문에 검색 능력이 떨어진다.
List Interface에 선언된 대표적인 메소드
- void add(int index, Object element) : 지정된 위치(index)에 객체(element)를 추가
- boolean addAll(int index, Collection c) : 지정된 위치(index)에 컬렉션에 포함된 객체들을 추가
- Object get(int index) : 지정된 위치(index)에 있는 객체를 반환
- int indexOf(Object o) : 지정된 객체의 위치(index)를 반환 (List의 첫 번째 요소부터 순방향으로 찾음)
- int lastIndexOf(Object o) : 지정된 객체의 위치(index)를 반환 (List의 마지막 요소부터 역방향으로 찾음)
- ListIterator listIterator(), ListIterator listIterator(int index) : List의 객체에 접근할 수 있는 ListIterator를 반환
- Object remove(int index) : 지정된 위치(index)에 있는 객체를 삭제하고 삭제된 객체를 반환
- Object set(int index, Object element) : 지정된 위치(index)에 객체(element)를 저장
- void sort(Comparator c) : 지정된 비교자(comparator)로 List 정렬
- List subList(int fromIndex, int tolndex) : 지정된 범위(fromIndex부터 tolndex)에 있는 객체 반환
package Interface_form;
/**
*
* 자바 List Interface입니다. <br>
* List는 ArrayList, SinglyLinkedList, DoublyLinked에 의해 각각 구현됩니다.
*
* @author st_lab
* @param <E> the type of elements in this list
*
* @version 1.0
*
*/
public interface List<E> {
/**
* 리스트에 요소를 추가합니다.
*
* @param value 리스트에 추가할 요소
* @return 리스트에서 중복을 허용하지 않을 경우에 리스트에 이미 중복되는
* 요소가 있을 경우 {@code false}를 반환하고, 중복되는 원소가
* 없을경우 {@code true}를 반환
*/
boolean add(E value);
/**
* 리스트에 요소를 특정 위치에 추가합니다.
* 특정 위치 및 이후의 요소들은 한 칸씩 뒤로 밀립니다.
*
* @param index 리스트에 요소를 추가할 특정 위치 변수
* @param value 리스트에 추가할 요소
*/
void add(int index, E value);
/**
* 리스트의 index 위치에 있는 요소를 삭제합니다.
*
* @param index 리스트에서 삭제 할 위치 변수
* @return 삭제된 요소를 반환
*/
E remove(int index);
/**
* 리스트에서 특정 요소를 삭제합니다. 동일한 요소가
* 여러 개일 경우 가장 처음 발견한 요소만 삭제됩니다.
*
* @param value 리스트에서 삭제할 요소
* @return 리스트에 삭제할 요소가 없거나 삭제에 실패할
* 경우 {@code false}를 반환하고 삭제에 성공할 경우 {@code true}를 반환
*/
boolean remove(Object value);
/**
* 리스트에 있는 특정 위치의 요소를 반환합니다.
*
* @param index 리스트에 접근할 위치 변수
* @return 리스트의 index 위치에 있는 요소 반환
*/
E get(int index);
/**
* 리스트에서 특정 위치에 있는 요소를 새 요소로 대체합니다.
*
* @param index 리스트에 접근할 위치 변수
* @param value 새로 대체할 요소 변수
*/
void set(int index, E value);
/**
* 리스트에 특정 요소가 리스트에 있는지 여부를 확인합니다.
*
* @param value 리스트에서 찾을 특정 요소 변수
* @return 리스트에 특정 요소가 존재할 경우 {@code true}, 존재하지 않을 경우 {@code false}를 반환
*/
boolean contains(Object value);
/**
* 리스트에 특정 요소가 몇 번째 위치에 있는지를 반환합니다.
*
* @param value 리스트에서 위치를 찾을 요소 변수
* @return 리스트에서 처음으로 요소와 일치하는 위치를 반환.
* 만약 일치하는 요소가 없을경우 -1 을 반환
*/
int indexOf(Object value);
/**
* 리스트에 있는 요소의 개수를 반환합니다.
*
* @return 리스트에 있는 요소 개수를 반환
*/
int size();
/**
* 리스트에 요소가 비어있는지를 반환합니다.
* @return 리스트에 요소가 없을경우 {@code true}, 요소가 있을경우 {@code false}를 반환
*/
boolean isEmpty();
/**
* 리스트에 있는 요소를 모두 삭제합니다.
*/
public void clear();
}
출처 및 참고
'Programming > Algorithm&DataStructure' 카테고리의 다른 글
[JAVA 자료구조] Singly LinkedList (단일 연결리스트) (0) | 2021.08.05 |
---|---|
[JAVA 자료구조] ArrayList (0) | 2021.08.04 |
[Algorithm] 정렬 알고리즘 요약 정리 (0) | 2021.08.01 |
[Algorithm] 시간 복잡도 & Big-O표기법 (0) | 2021.07.30 |
[Algorithm] 공간 복잡도 (0) | 2021.07.30 |