상세 컨텐츠

본문 제목

[JAVA] 컬렉션 프레임워크(1) 리스트 List | ArrayList, LinkedList, Vector

JAVA/기본 & 강의복습

by ranlan 2022. 3. 8. 00:40

본문

728x90

컬렉션 프레임워크란 

다수의 데이터를 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스들의 집합

 

리스트(List) 인터페이스

객체에 인덱스를 부여하여 인덱스로 검색, 삭제, 수정할 수 있는 기능을 제공한다.

리스트 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 주소를 참조한다. 동일한 객체를 중복 저장하는 경우 동일한 주소가 참조된다.

중복 데이터나 null 값 모두 저장 가능하다.

 

ArrayList

크기가 가변적으로 변하는 선형 리스트이다. 객체가 추가되어 저장 용량을 초과하면 부족한 크기만큼 자동으로 저장 용량이 늘어난다.

 

* Array vs ArrayList 

Array는 고정된 크기로 정해진 저장공간이 모두 채워지면 새로운 데이터 추가 시 새로 배열을 생성해야한다.

ArrayList는 가변 길이로 초기 용량에 상관 없이 데이터 추가가 가능하다. ArrayList는 배열 크기를 나타내는 capacity 인스턴스 변수를 가지고 있으며 기본값은 10이다. ArrayList에 요소들이 더해지면 capacity 또한 자동으로 늘어난다. 만약 설정한 capacity를 넘어서 더 많은 요소가 들어오면 배열 크기를 1.5배 증가시킨다.

참고) https://velog.io/@humblechoi/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Array-vs-ArrayList

 

[자료구조] Array vs ArrayList

Array와 ArrayList은 모든 것이 비슷합니다. 가장 큰 차이점은 길이를 조정할 수 있는가? 없는가? 입니다.Java의 Array는 고정 길이 입니다. 따라서, 정해진 길이의 배열을 모두 채우면, 새로운 데이터를

velog.io

 

리스트 생성

List list = new ArrayList(); // List, ArrayList 모두 가능
List<MyClass> list = new ArrayList<MyClass>();
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<Integer>(10); // 초기 용량 지정
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3)); // [1, 2, 3]

* 초기에 내부 타입을 미리 설정하지 않은 경우 내부 값 이용 시 캐스팅을 해야하고 잘못된 타입으로 캐스팅했을 때 오류가 발생할 수 있기 때문에 지향해야 하는 방식이다. jdk1.5 이후 자료형의 안정성을 위해 제네릭스(Generics) 개념이 도입되었다. 

* 컬렉션 프레임워크는 기본 자료형이 아닌 클래스만 내부 타입으로 사용 가능하다.

 

요소 추가

list.add("hello");
list.add("world");
list.add(0, "hi");
// [hi, hello, world]

리스트 길이 반환

int size = list.size();

검색 및 인덱스 활용

boolean isContains1 = list.contains("world"); // true
boolean isContains2 = list.contains("helloo"); // false
int index = list.indexOf("hello"); // 1
String str = list.get(1); // hello

리스트 전체 조회

for(String s : list) {
    System.out.print(s); // hi hello world
}

Iterator<String> iter = list.iterator();
while(iter.hasNext()){
    System.out.print(iter.next()); // hi hello world
}

수정

list.set(2, "world!");

삭제

list.remove();
list.clear();

 

 

LinkedList

각 노드가 데이터와 포인터를 가지고 한줄로 연결되어 있는 방식의 자료구조이다. 데이터를 담고 있는 노드들이 연결되어 있고 포인터가 이전 노드와 다음 노드에 대한 정보를 갖고 있다. 따라서 추가나 삭제의 경우 ArrayList처럼 배열 요소가 한 칸씩 밀리거나 당겨지는 일이 없어 속도가 빠르지만 인덱스가 없기에 특정 요소에 접근하기 위해서는 순차 탐색이 필요하기 때문에 속도가 느리다. 그러므로 탐색 또는 정렬을 자주해야 하는 경우 ArrayList를 사용하고 데이터 추가 및 삭제가 많은 경우 LinkedList를 사용하는 것이 좋다.

 

리스트 생성

LinkedList list = new LinkedList();
LinkedList<MyClass> list = new LinkedList<MyClass>();
LinkedList<Integer> list = new LinkedList<Integer>();
LinkedList<Integer> list = new LinkedList<>();
LinkedList<Integer> list = new LinkedList<Integer>(Arrays.asList(1,2, 3)); [1, 2, 3]

리스트 추가

list.add(1);
list.add(2);
list.addFirst(0);
list.addLast(3);

이 외 메서드 동일

 

 

Vector

ArrayList와 동일한 내부 구조를 갖고 있다. 한가지 차이점은 Vector는 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드 환경에서 동시에 메서드를 실행할 수 없고 하나의 스레드가 실행을 완료해야만 다른 스레드들이 실행할 수 있다. ArrayList와 다르게 멀티 스레드 환경에서 안전하다.

하지만 단일 스레드 환경에서는 ArrayList보다 성능이 좋지 않다.

 

벡터 생성

Vector v = new Vector();
Vector<MyClass> v = new Vector<MyClass>();
Vector<Integer> v = new Vector<Integer>(); 
Vector<Integer> v = new Vector<>(); 
Vector<String> v = new Vector<String>(10); // 초기 용량 지정
Vector<Integer> v = new Vector<Integer>(Arrays.asList(1,2,3)); // [1, 2, 3]

벡터 추가

v.add("hello");
v.add("world");

벡터 크기 확인

int size = v.size(); // 2
int capacity = v.capacity(); // 10

size()는 전체 벡터의 요소 개수를, capacity()는 물리적 크기를 의미한다.

 

이 외 메서드 동일

 

 

++) 배열(Array)

* 자바에서 제공하는 기본 배열([])은 처음 크기가 정해지면 변경할 수 없다.

 

배열 생성

// 배열 선언
int[] array;
int array[];
// 배열 생성
array = new int[5];

// 배열 선언 및 생성
int[] array = new int[5];

배열 길이

int len = array.length

인덱스를 통한 값 설정 및 전체 접근

array[0] = 1
array[1] = 10
array[2] = 100

for(int i=0; i<array.length ; i++){
    System.out.println(array[i]);
}

jdk1.5 이후 개선된 for 반복문

for(int i : array){
    System.out.println(array[i]);
}

2차원 배열 만들기

int[][] array2d = new int[2][3];

// 2차원 배열 접근
for(int i = 0; i < array2d.length; i++){
    for(int j = 0; j < array2d[i].length; j++){
        System.out.println(array2d[i][j]);
    }
}

 

 

728x90

관련글 더보기

댓글 영역