[JAVA] List 인터페이스(ArrayList, Vecror, LinkedList, Stack)
by 정공자씨2024. 4. 25.
[ 컬렉션 프레임워크의 종류 ]
collection 인터페이스
map 인터페이스
[ collection 인터페이스 ]
특징
List, Set,Queue에서 상속하는최상위 컬렉션 타입
업캐스팅으로 다양한 종류의 컬렉션 자료형을 받아서 자료를 삽입, 삭제, 조회할 수 있음
종류
List
Queue
Set
List 인터페이스
특징
배열(array)와 비슷하게 동작
저장 순서가 유지되는 컬렉션을 구현하는 데에 사용
데이터의 중복 저장을 허용
저장 순서가 유지되므로, 배열처럼 index로 요소에 접근
저장 공간이 고정되어 있지 않고 가변적임
데이터를 추가하면, 자동으로 저장 공간(크기)이 늘어남
요소들 사이에 빈 공간을 허용하지 않음
따라서, 삽입과 삭제를 할 때마다 배열의 이동이 일어남
하위의 ArrayList, LinkedList, Vector 클래스로 구현하여 사용
저장 순서가 유지, 데이터의 중복을 저장, 저장공간이 고정되어 있지 않음
List 인터페이스는 언제 사용할까?
데이터의 저장 순서의 유지가 필요한 경우
데이터를 중복해서 저장해야 하는 경우
List와 배열
List는 배열과 비슷하게 동작함
공통점 - 데이터를 저장 시에 순서(index)가 부여됨 - 따라서 요소에 접근 시에 index 사용 가능
차이점 - 배열은 자료형 크기가 고정 - List는 자료형 크기가 데이터의 양에 따라서 동적으로 늘었다 줄었다 할 수 있음(가변) - 배열은 같은 타입의 데이터만 저장 가능 - List는 다른 타입의 데이터도 저장 가능
[ List 인터페이스 ]
1. ArrayList 클래스 2. Vecror 클래스 3. LinkedList 클래스 4. Stack 클래스
ArrayList 클래스
특징
배열을 이용하여 만든 리스트
데이터의 저장 순서가 유지
데이터의 중복을 허용
데이터 저장 시에 자동으로 저장 용량을 늘려줌
저장 공간이데이터의 양에 따라서 늘었다가 줄어듦
ArrayList 클래스에 모든 타입의 객체를 저장할 수 있음
내부적으로 Object 타입으로 업캐스팅 되기 때문
장점
순차적으로 추가하거나 삭제하는 경우에는 속도가 빠름
append() 메서드 사용하는 경우, 데이터가 가장 뒤에 추가 되는데
이 경우, 순차적으로 추가가 되기 때문에 속도가 빠름
임의의 요소에 접근하는 경우에 속도가 빠름
단점
요소들 사이에 빈 공간을 허용하지 않기 때문에
데이터를중간에 삽입(insert)하거나중간에 삭제(delete)할 때는느림
문법
1. ArrayList 객체 생성
List list1 = new ArrayList(); // 상위 컬랙션 클래스로 업캐스팅
ArrayList list2 = new ArrayList();
2. ArrayList에 객체를 저장하기
aList.add("정공자");
aList.add(new Integer(187)); // 기본형 데이터는 wrapper 클래스 객체로 저장
aList.add(new Student());
객체 저장 시에add() 메서드를 사용하여 저장
ArrayList 클래스에 모든 타입의 객체를 저장할 수 있음
내부적으로 Object 타입으로 업캐스팅 되기 때문
aList.add(3, "비정공자"); // idx[3]에 데이터 저장
aList.add(5, "정공법"); // idx[5]에 데이터 저장
add(index, 값)
저장 순서가 저장되기 때문에, index를 정하여 데이터를 저장할 수 있음
3. ArrayList에 저장한 객체 가져오기
// 에러 발생: ArrayList에 업캐스팅 되어 데이터가 저장되므로, 원래 클래스 타입으로 다운 캐스팅이 필요함
// String name = aList.get(0)
// 객체에 접근 시, 원래 클래스 타입으로 다운 캐스팅
String name = (String)aList.get(0);
Integer num = (Integer)aList.get(1);
Student s = (Student)aList.get(2);
get() 메서드와 저장된 index를 이용하여 객체를 가지고 옴
ArrayList에 저장되는 객체는 내부적으로 Object 타입으로 업캐스팅 되므로
저장된 객체는 업캐스팅된 상태이므로
해당 요소에 접근 시에원래의 클래스 타입으로 다운캐스팅해주어야 에러가 나지 않음
[ 주의할 점 ] ArrayList에 저장된 요소에 접근 시에 원래의 클래스 타입으로 다운캐스팅 해주어야 에러가 나지 않음
4.ArrayList에저장된 객체 변경하기
aList.set(0, "비정공자"); // set(index, 변경값)
aList.set(1, new Float(3.14F));
aList.set(2, new College());
set(index, 변경값)
set() 메서드와 수정하려는 객체의 index를 이용하여 수정
5.ArrayList에저장된 객체 삭제하기
aList.remove(1);
remove(index)
remove() 메서드와 객체의 index를 이용하여 삭제
6.ArrayList에서 사용하는 메서드
aList.size(); // 저장된 객체의 개수
size() : 저장된 객체의 개수 확인
public class ArrayListTest {
public static void main(String[] args) {
// 배열
String [] arr = {"정공자", "비정공자", "포로리"};
// 배열을 List로 변경
List<Object> aList2 = Arrays.asList(arr);
for (int i = 0; i < aList2.size(); i++) {
System.out.println(aList2.get(i));
}
System.out.println(aList2.toString()); // [정공자, 비정공자, 포로리]
// List를 배열로 변경
Object [] arr2 = aList2.toArray();
System.out.println(Arrays.toString(arr2)); // [정공자, 비정공자, 포로리]
}
}
Arrays.asList(배열명) : 배열을 List로 변환
List 타입의 참조변수.toArray() : List를 배열로 변환
배열과 ArrayList를 비교
구분
배열
ArrayList
저장 데이터 종류
배열 선언시 지정한 타입만 저장
모든 객체 저장
저장 데이터 개수
배열 선언시 생성한 길이만큼 저장
저장 개수 제한 X
데이터 접근 방법
인덱스로 접근
데이터 접근 예제
int [ ] score = {1, 2, 3}
score[idx]
List aList = new ArrayList();
aList.get(idx)
LinkedList클래스
특징
객체를 연결하여 리스트처럼 만든 컬랙션
양방향 포인터 구조로 이루어져 있음
사용
객체의 추가, 삭제가 빈번한 경우에 사용하면 유리
장점
데이터를 중간에 삽입하거나 삭제하는 경우, 속도가 빠름
단점
임의의 요소에 대해서 접근하는 경우, 속도가 느림
LinkedList의 객체 생성 및 추가
LinkedList list1 = new LinkedList();
list1.add("정공자");
list1.add(new Integer(188));
list1.add(new Student());