JAVA
[JAVA] List 인터페이스(ArrayList, Vecror, LinkedList, Stack)
정공자씨
2024. 4. 25. 10:35
[ 컬렉션 프레임워크의 종류 ]
- 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());
Vector 클래스
특징
- 사용 방법은 ArrayList와 동일함
- ArrayList보다 먼저 사용되었던 컬렉션 클래스
- ArrayList의 구형 버전
- 멀티 스레드 환경에서 동기화를 보장함
- 모든 메서드가 동기화 되어있어서 thread-safe함
ArrayList와 다른점
Vector는 멀티 스레드 환경에서 동기화를 지원
Stack 클래스
특징
- Stack 클래스는 Vector 클래스를 상속하여 사용함
- 실제로는 문제가 많아 잘 사용하지 않음
- LIFO(Last In First Out, 후입선출) 자료 구조
- 마지막에 들어온 데이터가 가장 먼저 나감
- 객체의 입력과 출력이 한쪽에서만 수행되는 구조
- 데이터가 들어오는 것은 pop, 나가는 것은 push
stack 클래스에서 사용하는 메서드
- peek() : Stack에 저장된 최상위 객체를 확인하는 용도
- push() : 객체를 stack에 저장
- pop() : stack에 저장된 객체를 하나씩 인출
출처