JAVA

[JAVA] List 인터페이스(ArrayList, Vecror, LinkedList, Stack)

정공자씨 2024. 4. 25. 10:35

 

[ 컬렉션 프레임워크의 종류 ]

    1. collection 인터페이스
    2. map 인터페이스


[ collection 인터페이스 ]

특징

  • List, Set,Queue에서 상속하는 최상위 컬렉션 타입
  • 업캐스팅으로 다양한 종류의 컬렉션 자료형을 받아서 자료를 삽입, 삭제, 조회할 수 있음

 

종류

  1. List
  2. Queue
  3. 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에 저장된 객체를 하나씩 인출

 

 

 

 

 

 

 

 

출처

https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC