자바[Java] 컬렉션 프레임워크(Collection Framework)에 대한 개념정리

반응형

컬렉션 프레임워크(Collection Framework) 

컬렉션은?
사전적 의미로 요소(객체)를 수집해 저장하는 것
배열의 문제점은 
저장할 수 있는 객체 수가 배열을 생성할 때 결정됩니다. 즉 불특정 다수의 객체를 저장하기에는 문제가 됩니다.
객체를 삭제했을 때 해당 인덱스는 비워지게 됩니다. 낱알 빠진 옥수수와 같습니다. 객체를 저장하려면 어디가 비워져 있는지 확인을 해되는 불편한 점이 있습니다.

 

 

컬렉션 프레임워크는 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리입니다.

java.util이라는 패키지에 포함이 되며, 인터페이스를 통해서 정형화된 방법으로 다양한 컬렉션 클래스 이용

 

컬렉션 프레임워크 주요 인터페이스

List , Set, Map이 있으며 List 중에선 ArrayList를, Map 중에선 HashMap 을 많이 씁니다.

List 계열은 순서를 유지하고 저장, 중복 저장 가능
Set 계열을 순서를 유지하지 않고 저장 중복저장 불가
Map 계열은 키와 값의 쌍으로 저장 키는 중복저장 불가

List 컬렉션의 특징 및 주요 메소드

  List 컬렉션의 특징으로는 인덱스로 관리, 중복해서 객체 저장 가능하며 구현 클래스는 ArrayList, Vector, LinkedList 가 있습니다.  많이 쓰는 메소드 객체를 추가할 때 쓰는 add(E e), 객체를 검색할 때 get(int index) 가끔 쓰는 int size 가 있습니다.  ArrayList는 초기 용량은 10(따로 지정 가능) 저장 용량을 초과한 객체들이 들어오면 자동적으로 늘어나게 되며 객체를 제거 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 한 칸씩 당겨집니다.

 

import java.util.*;  
public class HArrayListExample {  
  
public static void main(String[] args) {  
List<String> list = new ArrayList<String>();  
  
list.add("Java"); // String 객체를 저장  
list.add("Jdbc");  
list.add("Se/Jsp");  
list.add(2, "Dateabase");  
list.add("iBATIS");  
  
int size = list.size(); // 저장된 총 객체 수 얻기  
System.out.println("총 객체수: " + size );  
  
String skill = list.get(2); // 2번째 인덱스 객체 얻기  
System.out.println("2: " + skill + "\r");  
  
for(int i=0; i<list.size(); i++) { // 저장된 총 객체만큼 루핑  
String str = list.get(i);  
System.out.println(i+ " : " + str);  
}  
System.out.println();  
  
list.remove(2); // 2번 인덱스 삭제 , iBATIS 삭제  
list.remove(2);  
list.remove("iBATIS");  
  
for(int i=0; i<list.size(); i++) { //저장된 객체만큼 루핑  
String str = list.get(i);  
System.out.println(i+" : " + str);  
}  
}  
  
}

 

import java.util.Arrays; import java.util.List;  
public class HArraysAsListExample {  
public static void main(String[] args) {  
List<String> list1 = Arrays.asList("길동이", "희동이", "또치", "마이클");  
for(String name: list1) {  
System.out.println(name);  
}  
  
List<Integer> list2 = Arrays.asList(1,2,3,4);  
for(Integer value: list2) {  
System.out.println(value);  
}  
}  
}

 

Vector은 스레드 동기화(synchronization)

  복수의 스레드가 동시에 Vector에 접근해 객체를 추가 삭제하더라도 스레드에 안전합니다. ArrayList와 다른 점은 Vector은 동기화된 (synchronized) 메소드로 구성되어있기에 멀티 스레드가 동시에 이 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있습니다. 따라서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있게 됩니다. 아래 코드는 예시 코드입니다.

 

public class IBoard {  
String subject;  
String content;  
String writer;  
  
public IBoard(String subject, String content, String writer) {  
this.subject = subject;  
this.content = content;  
this.writer = writer;  
}  
}

 

import java.util.*;  
public class IVectorExample {  
public static void main(String[] args) {  
List<IBoard> list = new Vector<IBoard>();  
  
list.add(new IBoard("제목1", "내용1", "글쓴이1"));  
list.add(new IBoard("제목2", "내용2", "글쓴이2"));  
list.add(new IBoard("제목3", "내용3", "글쓴이3"));  
list.add(new IBoard("제목4", "내용4", "글쓴이4"));  
list.add(new IBoard("제목5", "내용5", "글쓴이5"));  
  
list.remove(2);  
list.remove(3);  
  
for(int i=0; i<list.size(); i++) {  
IBoard board = list.get(i);  
System.out.println(board.subject + "\t" + board.content + "\t" + board.writer);  
}  
}  
}

 

LinkedList는

  인접 참조를 링크해서 체인처럼 관리, 특정 인덱스에서 객체를 제거하거나 추가하게 되면 앞뒤 링크만 변경, 
빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 좋은 성능을 자랑하며 LinkedList를 생성하기 위해서는 저장할 객체 타입을 타입 파라미터(E)에 표기하고 기본 생성자를 호출하면 됩니다. 처음 생성될 때에는 어떠한 링크도 만들어지지 않기 때문에 내부에는 비어있다고 보면 됩니다.

 

ArrayList와 LinkedList의 실행 성능

 

import java.util.ArrayList; import java.util.LinkedList; import java.util.List;  
public class JLinkedListExample {  
  
public static void main(String[] args) {  
List<String> list1 = new ArrayList<String>();  
List<String> list2 = new LinkedList<String>();  
  
long startTime;  
long endTime;  
  
startTime = System.nanoTime();  
for(int i=0; i<10000; i++) {  
list1.add(0, String.valueOf(i));  
}  
endTime = System.nanoTime();  
System.out.println("ArrayList 걸린시간: " + (endTime - startTime) + " ns");  
  
startTime = System.nanoTime();  
for(int i=0; i<10000; i++) {  
list2.add(0, String.valueOf(i));  
}  
endTime = System.nanoTime();  
System.out.println("LinkedList 걸린시간:" + (endTime - startTime) + " ns");  
  
  
  
  
}  
  
}
반응형

'Java > Java' 카테고리의 다른 글

Java Io기반 입출력 및 네트웤 #2  (0) 2021.10.29
Java Io기반 입출력 및 네트웤 #1  (0) 2021.10.28
Java Generic 제네릭  (0) 2021.10.25
Java 멀티스레드  (0) 2021.10.22
Java 기본 API 클래스 #3  (0) 2021.10.21