프리 정보 컨텐츠

자바 컬렉션 프레임워크 List 인터페이스 총정리 본문

JAVA

자바 컬렉션 프레임워크 List 인터페이스 총정리

쏜스 2021. 1. 16. 01:57
컬렉션 프레임워크 개념과 사용하는 이유 참고

List 에 대한 정의를 하기 전에 위와 같은 사진을 참고하자.

List 

객체를 인덱스로 관리하며 인덱스에는 데이터가 저장되어 있는 참조 값을 가지고 있다.

List 인터페이스는 객체 자체를 저장하는 것이 아닌 객체의 번지를 참고한다.

 

대표적인 클래스는 ArrayList, LinkedList, Vector, Stack 이 있다.

그중에서도 ArrayList는 가장 많이 사용되고 여러 프레임워크에서도 중요하게 사용되니 잘 알고 넘어가자.

ArrayList

ArrayList는 일반적인 배열과 같은 구조로 이해하지만 다른 점은

크기가 가변적으로 변하며 부족한 크기만큼 용량이 늘어난다는 특징이 있으며

단점으로는 추가 및 삭제 작업이 길어지는 단점을 가지고 있다.

사용방법

List<Integer> list = new ArrayList<Integer>();

일반적인 사용방법은 위와 같다. 

자동완성으로 List <E> 만들어지는데 E는 타입 피라 미터이며 제네릭 타입이다.

 

※ 제네릭 - 클래스나 메소드에서 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법.

 

  • 객체의 타입 안정성이 높아짐.
  • 반환 값에 대한 타입 변환 및 검사에 들어가는 노력을 줄임.

제네릭 형식은 자주 언급되니 자세히 숙지하자.

 

ArrayList는 CRUD(Create, Reat, Update, Delete)를 기반으로 사용된다.

CRUD를 생각하며 이해하며 ArrayList를 살펴보자.

Create

// 데이터 추가
List<Integer> list = new ArrayList<Integer>();
list.add(10);
list.add(20);
list.add(30);
System.out.println("List size : " + list.size());

데이터를 추가(Create)하는 방법은 위의 코드와 같다.

list 객체 각각의 번지에 10, 20, 30을 저장한다.

이를 list.size() 명령어를 통해 list 배열의 크기를 확인할 수 있다.

Read

// 데이터 읽기
System.out.println(list.get(2));
System.out.println();

for(int i=0; i<list.size(); i++) {
    System.out.print(list.get(i) + " ");
}
System.out.println();

위의 결과와 같이 list에 추가를 하고 추가한 객체의 번지에 있는 참조값을 읽어올 수 있다.

Update

// 데이터 수정
list.set(1, 400);

 

1번지에 있는 참조값을 400으로 수정해라.

위의 코드를 실행하면 20 --> 400 수정이 된다.

Delete

// 데이터 삭제
list.remove(0);

0번지에 있는 참조값을 삭제해라.

위의 코드를 실행하면 참조값 10은 삭제되며

0번지에는 400의 값, 1번지에는 30의 값이 남게 된다.


데이터 추가와 모든 데이터 삭제

// 데이터 추가 : 삽입
list.add(2, 300);
		
for(int i=0; i<list.size(); i++) {
	System.out.print(list.get(i) + " ");
}
System.out.println();

// 모든 데이터 삭제
list.clear();

System.out.println("List size : " + list.size())

위의 코드를 실행하면 어떻게 되는지 생각해보자.

2번지에 참조값 300을 더하고 모든 데이터를 삭제하면 list는 아무 값도 가지지 않게 된다.

실행결과

ArrayList , LinkedList 차이점?

ArrayList 를 사용하는 방법에 대해 알았다면 LinkedList 를 이해하기는 쉽다. 

LinkedList 는 사용 방법은 동일하되, 내부적으로 요소를 저장하는 방법만 다르기 때문이다.

 

객체 삭제와 삽입이 빈번한 경우 -> LinkedList 사용

인덱스 검색 및 객체 추가 경우   -> ArrayList 사용

 

LinkedList는 중간에 데이터를 추가하거나 삭제할 때 ArrayList보다 빠르다.

하지만 데이터를 추가, 삭제, 검색하는 것은 ArrayList가 더 빠르다.

 

마지막으로 자주 사용하는 List 인터페이스 메소드를 훑고 넘어가자.

List 인터페이스 메소드

메소드 설명
boolean add(E e) 해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능)
void add(int index, E e) 해당 리스트의 특정 위치에 전달된 요소를 추가함. (선택적 기능)
void clear() 해당 리스트의 모든 요소를 제거함. (선택적 기능)
boolean contains(Object o) 해당 리스트가 전달된 객체를 포함하고 있는지를 확인함.
boolean equals(Object o) 해당 리스트와 전달된 객체가 같은지를 확인함.
E get(int index) 해당 리스트의 특정 위치에 존재하는 요소를 반환함.
boolean isEmpty() 해당 리스트가 비어있는지를 확인함.
Iterator<E> iterator() 해당 리스트의 반복자(iterator)를 반환함.
boolean remove(Object o) 해당 리스트에서 전달된 객체를 제거함. (선택적 기능)
boolean remove(int index) 해당 리스트의 특정 위치에 존재하는 요소를 제거함. (선택적 기능)
E set(int index, E e) 해당 리스트의 특정 위치에 존재하는 요소를 전달받은 객체로 대체함. (선택적 기능)
int size() 해당 리스트의 요소의 총 개수를 반환함.
Object[] toArray() 해당 리스트의 모든 요소를 Object 타입의 배열로 반환함.
Comments