[JAVA] Collection - List (ArrayList)
코딩테스트를 풀이 중, 나는 자료구조를 변경하는 일이 나에겐 종종 생긴다. 왜 처음부터 딱 맞는 자료구조를 고르지 못할까? 하는 생각이 들었다. 그 이유가 제대로 이해를 하지 못하고 있어서라고 생각했고, 자료구조에 대해 한 번 더 정리하기 위해 포스팅을 하려한다!
Collection 이란?
컬렉션이란, 객체의 그룹을 조작하고 저장할 수 있는 자료구조 이다.
각각 제너릭을 통해 특정 타입의 컬렉션을 생성할 수 있고, 각 특징에 알맞은 상황에 적합한 것을 골라 쓰는 것이 좋다.
먼저 컬렉션의 종류는 굉장히 많은데, 크게 List, Queue, Set 으로 나뉜다.
List
List는 배열처럼 흔히 쓰이는 순서(인덱스)를 가지는 원소들의 모임으로, 중복값을 가질 수 있다.
ArrayList, LinkedList, Vector 등이 있다.
ArrayList
원소들을 인덱스로 접근하여, 배열과 굉장히 유사하다.
배열을 초기에 선언할 때 크기를 정해줘야하기 때문에 유동적인 사이즈로 초기화 할 수 없는 불편함이 있다. 하지만 ArrayList의 경우, 저장되는 데이터의 갯수에 따라 자동적으로 크기가 변경되어 배열보다 편리하게 사용할 수 있다.
- 삽입 순서를 유지하여 요소를 저장한다.
- 중복 요소를 허용한다
- 동기화되지 않으며, Vector 클래스와 ArrayList를 구별하는 주요 지점이다 (ArrayList 는 C++의 벡터와 동일)
- 기본 유형을 포함할 수 없고, 객체만 포함한다 (ArrayList of objects). 따라서 정수 유형의 요소를 저장하려면 int 가 아닌 래퍼 클래스의 Integer 객체를 사용해야한다.
ArrayList 선언 방법
ArrayList list = new ArrayList(); // 타입 설정x Object로 사용
ArrayList<Integer> intList1 = new ArrayList<>();
ArrayList<Integer> intList2 = new ArrayList<Integer>(); // Integer 타입 사용
ArrayList<Integer> intList3 = new ArrayList<Integer>(10); // 초기 용량 세팅
ArrayList<Integer> intList4 = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4)); // 초기 값 세팅
ArrayList<String> strList1 = new ArrayList<String>(); // String 타입 사용
ArrayList<String> strlist2 = new ArrayList<String>(Arrays.asList("apple", "banana", "mango")); // 초기 값 세팅
ArrayList 값 추가
add(Object): ArrayList 의 마지막에 데이터 추가
add(int index, Object): ArrayList 의 index 에 데이터 추가
ArrayList<String> list = new ArrayList<>();
list.add("apple");
list.add("apple");
list.add(1, "banana");
System.out.print(list);
출력 값 : [apple, banana, apple]
ArrayList 값 변경
set(int index, Object) 를 통해 값 변경
ArrayList<String> list = new ArrayList<>();
list.add("apple");
list.add("apple");
list.add("apple");
list.set(1, "banana"); // 값 변경
System.out.print(list);
출력 값 : [apple, banana, apple]
ArrayList 값 삭제
remove(Object): 해당 Object 와 같은 값 삭제
remove(int index): index에 해당하는 값 삭제
clear(): 데이터 모두 삭제
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// [A, B, C, D]
list.remove(1); // [B, C, D]
list.remove("B"); // [C, D]
list.clear(); // []
ArrayList 전체 값 출력
ArrayList<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
// for-each loop
for (String alphabet : list) {
System.out.print(alphabet + " ");
}
System.out.println(); // A B C D
// for loop
for (int i = 0; i < list.size(); ++i) {
System.out.print(list.get(i) + " ");
}
System.out.println(); // A B C D
// using iterator
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println(); // A B C D
// using listIterator = 역방향 출력
ListIterator<String> listIterator = list.listIterator(list.size());
while (listIterator.hasPrevious()) {
System.out.print(listIterator.previous() + " ");
}
System.out.println(); // D C B A
ArrayList 값 존재 유무
ArrayList<String> lists = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
lists.contains("A"); // true
lists.contains("E"); // false
lists.indexOf("A"); // 0
lists.indexOf("E"); // -1 : 값이 없음
그렇다면 ArrayList 와 List 의 차이는 무엇일까?
- List = 인터페이스 (공통되는 메소드를 추출해놓은 클래스. ArrayList를 포함하고 있음)
- ArrayList = 클래스
List <Object> list1 = new ArrayList <>();
ArrayList <Object> list2 = new ArrayList <>();
list1과 list2 의 차이는 무엇일까?
= 두 리스트는 같은 결과를 도출하지만, List를 사용해 ArrayList를 생성하는 것은 유연성에서 효과를 볼 수 있다.
List <Object> list = new ArrayList <>(); // 유연성의 예
// 과일 list = new 딸기();
ArrayList <Object> list = new ArrayList <>();
// 딸기 list = new 딸기();
여기서 Generic(제너릭)에 대한 개념에 대해 짚고 넘어가보자.
만약 우리가 어떠한 자료구조를 만들 때, String 타입, Integer 타입 등 많은 타입을 지원하고 싶다. 그런데 String에 대한 클래스, Integer에 대한 클래스 등 타입 별로 따로 만들어야 한다면, 너무 비효율적이다.
이것을 해결하기 위해 우리는 제너릭 Generic(제너릭)이라는 것을 사용한다.
Generic(제너릭)은 특정 타입을 클래스 내부에서 지정하는 것이 아닌, 외부에서 사용자에 의해 지정되는 것을 말한다. 다시 말해, 특정 타입을 미리 지정해두는 것이 아니라 필요에 따라 지정할 수 있도록 하는 일반(Generic) 타입이다. 또한 인스턴스의 형 번환을 통해 내부 디테일과 메모리 함축 등에서 이점과 성능을 개선할 수 있다.
오늘은 ArrayList 에 대해서 정리해봤다! 다음에는 LinkedList에 대해 정리해보겠다.
[출처]
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ppuagirls&logNo=221560996691