Chapter13. 컬렉션과 제네릭 (1)

SeungHyun Son·2021년 6월 30일
0

컬렉션 프레임워크

객체를 그룹 단위의 데이터로 저장하는 기본적인 자료구조들의 모음
다수의 데이터를 그룹으로 묶어 관리할 수 있으므로 프로그래밍이 보다 편리해지고, 코드의 재사용성을 늘릴 수 있다.

컬렉션 프레임워크 종류

컬렉션 프페임워크의 주요 인터페이스는 List, Set, Map이 있다.

  • 다음 표는 컬렉션의 종류에 따른 차이를 표로 정리한 것이다.
인터페이스 분류특징구현클래스
CollectionList순서를 유지하고 저장
중복 저장 가능
ArrayList, Vector
LinkedList
Set순서를 유지하지 않고 저장
중복 저장 안됨
HashSet, TreeSet
Map키와 값의 쌍으로 저장
키는 중복 안 됨
값은 중복 저장 가능
HashMap, Hashtable
TreeMap, LinkedHashMap

List

객체를 일렬로 늘어놓은 구조
객체를 인덱스로 관리
객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공

List 인터페이스로 구현된 클래스

  • ArrayList
  • Vector
  • LinkedList

List 인터페이스에 구현된 메소드

기능메소드설명
객체 추가booelan add(E, e)주어진 객체를 맨 끝에 추가
void add(int index, E element)주어진 인덱스에 객체 추가
set(int index, E element)주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈
객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 여부 확인
E.get(int index)주어진 인덱스에 저장된 객체를 리턴
boolean isEmpty()컬렉션이 비어 있는지 조사
int size()저장되어 있는 전체 객체 수를 리턴
객체 삭제void clear()저장된 모든 객체를 삭제
E remove(int index)주어진 인덱스에 저장된 객체를 삭제
boolean remove(Object o)주어진 객체를 삭제

ArrayList - 가변 배열

일반 배열과 같이 인덱스로 객체를 관리
배열은 생성될 때 크기가 고정되어 변경을 할 수 없지만 ArrayList는 저장 용량을 초과하면 자동으로 저장 용량을 늘림
상당히 빠르고 크기를 마음대로 조절할 수 있는 배열
단방향 포인터 구조로 자료에 대한 순차적인 접근에 강점이 있다

기본 생성자로 ArrayList 객체를 생성

List<기본타입> list = new ArrayList<기본타입>();

초기화

  • 고정된 객체들로 구성된 List를 생성하고자 할 때 사용
List<String> list = Arrays.asList("Apple", "Banana", "Orange");

test.collection.TestArrayList.java

01 package test.collection
02
03 import java.util.*;
04
05 public class TestArrayList {
06     private List<String> l = new ArrayList<String>();
07
08     public void testArrayList() {
09         l.add("Red"); // [Red]
10         l.add("Orange"); // [Red, Orange]
11         l.add(1, "Yellow"); // [Red, Yellow, Orange]
12         printList();
13
14         l.remove(2); // [Red, Yellow]
15         printList();
16
17         l.clear(); // []
18         System.out.println("List가 비었나요? " + l.isEmpty()); // true
19     }
20
21     public void printList() {
22         System.out.println(l);
23     }
24 }

test.main.Main.java

01 package test.main;
02
03 import test.collection.TestArrayList;
04
05 public class Main {
06     public static void main(String[] args) {
07         new TestArrayList().testArrayList();
08     }
09 }
------
[Red, Yellow, Orange]
[Red, Yellow]
List가 비었나요? true

Vector

ArrayList의 구 버전
ArrayList와 동일한 내부 구조를 가지고 있다
모든 메소드가 동기화 되어 있고 잘 쓰이지 않음

기본 생성자로 Vector 객체를 생성

List<E> list = new Vector<E>();

ArrayList와는 달리 동기화 된 메소드로 구성되어 있어 멀티 스레드 환경에서 동시에 메소드들을 실행 할 수 없고, 하나의 스레드의 실행이 완료 되어야만 다른 스레드에서 실행 할 수 있다.

LinkedList

양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 빠른 성능을 보장
ArrayList와 사용 방법은 똑같지만 내부 구현이 인접 참조 링크를 체인처럼 관리
ArrayList는 객체가 중간 인덱스에 삭제되거나 삽입될 때 뒤의 객체들의 인덱스가 변경되지만, LinkedList는 중간 인덱스의 객체가 변경되더라도 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않음
삭제와 삽입이 빈번이 일어나는 경우 ArrayList보다 LinkedList가 좋은 성능을 발휘한다.
스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임

List<E> list = new LinkedList<E>();

test.collection.TestLinkedList.java

01 package test.collection;
02
03 import java.util.LinkedList;
04
05 public class TestLinkedList {
06     public TestLinkedList() {
07     }
08
09     public void testLinkedList() {
10         LinkedList<String> list = new LinkedList<String>();
11
12         list.add("포도"); // [포도]
13         list.add("딸기"); // [포도, 딸기]
14         list.add("복숭아"); // [포도, 딸기, 복숭아]
15         list.add("키위"); // [포도, 딸기, 복숭아, 키위]
16         printList(list);
17
18         list.set(0, "오렌지"); // [오렌지, 딸기, 복숭아] -> set으로 0번째 인덱스 변경
19         printList(list);
20
21         list.remove(1); // [오렌지, 딸기, 복숭아] -> remove로 1번째 인덱스 삭제
22         list.remove("키위"); // "키위" 데이터 삭제
23         printList(list);
24     }
25
26     public void printList(LinkedList<String> list) {
27         // 반복문을 이용한 LinkedList 출력
28         int num = list.size();
29         for(int cnt = 0; cnt < num; cnt++) {
30             String str = "[" + list.get(cnt) + "]";
31             System.out.print(str);
32         }
33         System.out.println();
34     }
35 }

test.main.Main.java

01 package test.main;
02
03 import test.collection.TestLinkedList;
04
05 public class Main {
06     public static void main(String[] args) {
07         new TestLinkedList().testLinkedList();
08     }
09 }
------
[포도][딸기][복숭아][키위]
[오렌지][딸기][복숭아][키위]
[오렌지][복숭아]

0개의 댓글

관련 채용 정보